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()