Plain is headed towards 1.0! Subscribe for development updates →

 1from enum import Enum
 2
 3
 4class ObserverMode(Enum):
 5    """Observer operation modes."""
 6
 7    SUMMARY = "summary"  # Real-time monitoring only, no DB export
 8    PERSIST = "persist"  # Real-time monitoring + DB export
 9    DISABLED = "disabled"  # Observer explicitly disabled
10
11
12class Observer:
13    """Central class for managing observer state and operations."""
14
15    COOKIE_NAME = "observer"
16    COOKIE_DURATION = 60 * 60 * 24  # 1 day in seconds
17
18    def __init__(self, request):
19        self.request = request
20
21    def mode(self):
22        """Get the current observer mode from signed cookie."""
23        return self.request.get_signed_cookie(self.COOKIE_NAME, default=None)
24
25    def is_enabled(self):
26        """Check if observer is enabled (either summary or persist mode)."""
27        return self.mode() in (ObserverMode.SUMMARY.value, ObserverMode.PERSIST.value)
28
29    def is_persisting(self):
30        """Check if full persisting (with DB export) is enabled."""
31        return self.mode() == ObserverMode.PERSIST.value
32
33    def is_summarizing(self):
34        """Check if summary mode is enabled."""
35        return self.mode() == ObserverMode.SUMMARY.value
36
37    def is_disabled(self):
38        """Check if observer is explicitly disabled."""
39        return self.mode() == ObserverMode.DISABLED.value
40
41    def enable_summary_mode(self, response):
42        """Enable summary mode (real-time monitoring, no DB export)."""
43        response.set_signed_cookie(
44            self.COOKIE_NAME, ObserverMode.SUMMARY.value, max_age=self.COOKIE_DURATION
45        )
46
47    def enable_persist_mode(self, response):
48        """Enable full persist mode (real-time monitoring + DB export)."""
49        response.set_signed_cookie(
50            self.COOKIE_NAME, ObserverMode.PERSIST.value, max_age=self.COOKIE_DURATION
51        )
52
53    def disable(self, response):
54        """Disable observer by setting cookie to disabled."""
55        response.set_signed_cookie(
56            self.COOKIE_NAME, ObserverMode.DISABLED.value, max_age=self.COOKIE_DURATION
57        )
58
59    def get_current_trace_summary(self):
60        """Get performance summary string for the currently active trace."""
61        from .otel import get_current_trace_summary
62
63        return get_current_trace_summary()