Portal Community

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.

MethodWhen CalledParameters
logHookStartJust before a hook's execute() is calledmessageId, hookName, priority
logHookSuccessAfter execute() completes without errormessageId, hookName, priority, executionTime, context?
logHookErrorAfter execute() throws an exceptionmessageId, hookName, priority, error, executionTime
logHookSkippedWhen 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).