Portal Community

Available Hooks

HookDestinationConfig Key
SplunkLogHookSplunk HEChecUrl, hecToken, sourcetype
ElasticsearchHookElasticsearchurl, index, apiKey
DatadogHookDatadog Logs APIapiKey, site
NewRelicHookNew Relic Logs APIlicenseKey, region
SumoLogicHookSumo Logic HTTP SourcecollectorUrl
GraylogHookGraylog GELF HTTPurl, port
WebMcpHookAny REST endpointendpoint, headers, retries

BaseLogHook Batching Pattern

All platform hooks extend BaseLogHook which implements automatic batching with configurable flush intervals:

abstract class BaseLogHook<T> extends BaseHook {
  // Accumulates log records in a batch
  // Flushes when: batchSize is reached OR flushInterval expires
  protected async batchFlush(doc: T): Promise<void>;

  // Subclass sends the batch to the platform
  protected abstract sendBatch(docs: T[]): Promise<void>;
}

// Defaults:
// batchSize: 100 documents
// flushInterval: 5000ms (5 seconds)

Splunk Integration

import { SplunkLogHook } from '@edge-stream/observability-hooks-js';

const server = stream.server('bas')!;

server.incomingPipeline.addHook(new SplunkLogHook({
  hecUrl: 'https://splunk.company.com:8088/services/collector',
  hecToken: process.env.SPLUNK_HEC_TOKEN!,
  sourcetype: 'edgestream:pipeline',
  batchSize: 100,
  flushInterval: 5000,   // flush at least every 5 seconds
}));

Datadog Integration

import { DatadogHook } from '@edge-stream/observability-hooks-js';

server.incomingPipeline.addHook(new DatadogHook({
  apiKey: process.env.DATADOG_API_KEY!,
  site: 'datadoghq.com',   // or 'datadoghq.eu', 'us3.datadoghq.com', etc.
  batchSize: 50,
  flushInterval: 3000,
}));

Generic REST Endpoint (WebMcpHook)

import { WebMcpHook } from '@edge-stream/observability-hooks-js';

// Forward every pipeline event to a custom webhook
server.incomingPipeline.addHook(new WebMcpHook({
  endpoint: 'https://internal-monitoring.company.com/webhook',
  headers: {
    'X-API-Key': process.env.MONITORING_KEY!,
    'Content-Type': 'application/json',
  },
  retries: 3,
}));

HookActivityLogger (from edge-stream-js)

The in-process observability hook — feeds HooksMonitor and SubscribersMonitor. Unlike the external platform hooks, it writes to the local LoggingService ring buffer instead of a remote endpoint:

import { HookActivityLogger } from 'edge-stream-js';
// (also re-exported as LogHook from @edge-stream/observability-hooks-js)

server.incomingPipeline.addHook(new HookActivityLogger()); // priority 5

// Respects LogSettings.isHookLoggingEnabled()
// Use getLogSettings().setHookLoggingEnabled(false) to disable at runtime

Combining Multiple Observability Hooks

// Development: in-process monitor only
if (import.meta.env.DEV) {
  server.incomingPipeline.addHook(new HookActivityLogger()); // local UI monitor
}

// Production: external platform logging
if (import.meta.env.PROD) {
  server.incomingPipeline.addHook(new DatadogHook({
    apiKey: env.DATADOG_KEY,
    site: 'datadoghq.com',
    batchSize: 100,
    flushInterval: 5000,
  }));
}