EdgeStream
Observability Overview
EdgeStream has a built-in observability layer: three React monitor components, a hook-based data feed, a mobile dashboard, and a full DevTools app — all driven by the same LoggingService that sits inside the pipeline.
What Is Visible
| What | Component / Tool | Package |
|---|---|---|
| Hook execution log — name, status, timing, errors | HooksMonitor | @edge-stream/observability-react |
| Subscriber delivery log — topic, status, duration, errors | SubscribersMonitor | @edge-stream/observability-react |
| Full activity stream — message overview, timeline | ActivityStreamMonitor | @edge-stream/observability-react |
| External log forwarding (Splunk, Datadog, etc.) | Observability hooks | @edge-stream/observability-hooks-js |
| Pipeline + subscriber state inspection | DevTools app | edge-stream-dev-tools |
Observability Architecture
Message arrives
│
▼
Pipeline
├── HookActivityLogger (priority 5) ──→ LoggingService (in-memory ring buffer)
│ │
├── ... other hooks ... │ polls every 500ms
│ ▼
└── Publish to subscribers HooksMonitor
│ SubscribersMonitor
▼ ActivityStreamMonitor
SubscriptionManager ─────────────→ LoggingService (subscriber logs)
HooksMonitor vs SubscribersMonitor
| HooksMonitor | SubscribersMonitor | |
|---|---|---|
| Shows | Each hook's invocation: name, status (success/error), timing | Each subscriber delivery: topic, status (delivered/error/queued), timing |
| Stats | Total hooks, success count, failure count | Total deliveries, delivered, failed, pending |
| Filter | By hook name | By topic |
| Detail click | Full hook log for that message (all hooks in order) | All subscriber deliveries for that message |
| Settings tab | Enable/disable hook logging | Enable/disable subscriber logging |
| Poll interval | 500ms default | 500ms default |
Data Source: LoggingService
Both monitors poll the singleton LoggingService which maintains an in-memory ring buffer of MessageActivityLog records. Each record captures:
interface MessageActivityLog {
messageId: string;
messageType: string;
topic: string;
serverId: string;
status: 'processing' | 'completed' | 'failed';
startTime: Date;
endTime?: Date;
hookLogs?: HookLog[]; // one entry per hook executed
subscriberLogs?: SubscriberLog[]; // one entry per subscriber matched
}
Enabling Observability
Observability is enabled by adding HookActivityLogger to the pipeline. It runs at priority 5 — the first hook to execute — and captures timing for every subsequent hook:
import { createEdgeStream, HookActivityLogger } from 'edge-stream-js';
const stream = createEdgeStream({ logLevel: 'debug' });
stream.registerServer({ id: 'bas', ... });
const server = stream.server('bas')!;
server.incomingPipeline.addHook(new HookActivityLogger()); // enables observability
await stream.start();