EdgeStream
HookActivityLogger
The HookActivityLogger is EdgeStream's built-in observability hook. It captures the start, success, error, and skip events for every hook execution — with timing data — and feeds the HooksMonitor React component.
Role in the Pipeline
HookActivityLogger runs at priority 5 — before all other hooks. It implements IHookActivityLogger and is called by the pipeline engine around each hook execution, not by the hook itself.
| Method | When Called | Parameters |
|---|---|---|
logHookStart | Just before a hook's execute() is called | messageId, hookName, priority |
logHookSuccess | After execute() completes without error | messageId, hookName, priority, executionTime, context? |
logHookError | After execute() throws an exception | messageId, hookName, priority, error, executionTime |
logHookSkipped | When a hook is not executed (e.g., pipeline aborted) | messageId, hookName, priority, reason? |
Log Settings Control
The logger respects the EdgeStream log settings — hook logging can be enabled/disabled and configured independently of transport logging:
// Internal (from source)
logHookStart(messageId, hookName, priority) {
if (!getLogSettings().isHookLoggingEnabled()) return;
getLoggingService().logHookExecution(messageId, {
hookName, priority, status: 'start',
message: `Starting hook: ${hookName}`,
timestamp: new Date().toISOString(),
});
}
logHookSuccess(messageId, hookName, priority, executionTime, context?) {
if (!getLogSettings().isHookLoggingEnabled()) return;
getLoggingService().logHookExecution(messageId, {
hookName, priority, status: 'success',
message: '✅ Hook completed successfully',
executionTime, timestamp: new Date().toISOString(),
...(getLogSettings().shouldLogHookMetadata() && context && { context }),
});
}
Installation and Usage
import { HookActivityLogger, getHookActivityLogger } from 'edge-stream-js';
// Option 1: Create a new instance
const logger = new HookActivityLogger();
server.incomingPipeline.addHook(logger);
// Option 2: Use the global singleton (recommended)
const logger = getHookActivityLogger();
server.incomingPipeline.addHook(logger);
server.outgoingPipeline.addHook(logger); // reuse same logger for both
HookActivityLogger + HooksMonitor
The HooksMonitor React component (from observability-react) subscribes to the logging service that HookActivityLogger writes to. Without HookActivityLogger registered, HooksMonitor shows no data.
// In your dev panel / admin dashboard
import { HooksMonitor } from 'observability-react';
function DevPanel() {
return (
<div className="dev-panel">
<HooksMonitor
maxEntries={200}
filterByHookName="WorkflowEventMapperHook"
showTimings={true}
showEnvelopePreview={true}
/>
</div>
);
}
Development Only
It's recommended to register
HookActivityLogger in development environments only. In production, the logging overhead (however small) adds up at high throughput. Use an environment check: if (import.meta.env.DEV) server.incomingPipeline.addHook(logger).