Live updates and historical visualizations of health metrics during and after consumption sessions. Combines fast caching, background computation, and WebSocket delivery for instant feedback and analytical insights.
- SessionTelemetryService — Orchestrates computation, caching, and freshness detection
- SessionTelemetryCacheRepository — Stores pre-computed, downsampled data
- BoundedComputeCoordinator — Limits concurrent computations (prevents thundering herd)
- SessionTelemetryQueueService — Offloads heavy aggregation to BullMQ workers
- WebSocketBroadcaster — Pushes updates to connected clients via Socket.IO
graph TD
STS["SessionTelemetryService<br/>Orchestrates computation & caching"]
CACHE["SessionTelemetryCacheRepository<br/>Pre-computed downsampled data"]
BCC["BoundedComputeCoordinator<br/>Limits concurrent computations"]
QUEUE["SessionTelemetryQueueService<br/>BullMQ background compute"]
WS["WebSocketBroadcaster<br/>Socket.IO push to clients"]
STS --> CACHE
STS --> BCC
STS --> QUEUE
QUEUE --> BCC
BCC --> STS
STS --> WS
- Cache hit (READY + fresh): Return immediately — sub-millisecond
- Cache miss or stale: Trigger async recomputation, return
state: 'computing'withretryAfterSeconds - Background compute: Worker aggregates raw
HealthSampledata, downsamples to 1m/5m resolution - Freshness check: Compare
sourceWatermarkin cache vscurrentSourceWatermark— stale triggers recompute - Real-time delivery:
WebSocketBroadcasteremitssession.updatedto connected clients
graph TD
REQ["GET /session/:id/telemetry"]
CHECK{"Cache Status?"}
HIT["Return immediately<br/>Sub-millisecond"]
STALE{"Watermark Fresh?"}
COMPUTE["Return state: computing<br/>retryAfterSeconds"]
WORKER["BullMQ Worker<br/>Aggregate raw HealthSamples<br/>Downsample to 1m/5m resolution"]
FRESH["Update cache<br/>sourceWatermark = current"]
WS["WebSocketBroadcaster<br/>Emit session.updated"]
REQ --> CHECK
CHECK -->|"READY + fresh"| HIT
CHECK -->|"Miss or stale"| STALE
STALE -->|"sourceWatermark < current"| COMPUTE
COMPUTE --> WORKER --> FRESH --> WS
STALE -->|"Watermark matches"| HIT
- Watermark-based freshness (not TTL) — precise staleness detection
- Bounded concurrency pool — prevents database overload during high demand
- Async-first computation — API returns immediately; client polls or subscribes
- Resolution-aware downsampling — 1m for short sessions, 5m for long
code-snippets/services/session-telemetry.service.tscode-snippets/services/sessionTelemetryQueue.service.tscode-snippets/subscribers/session-telemetry.subscriber.tscode-snippets/realtime/WebSocketBroadcaster.ts