Portal Community

Basic Usage

import { HooksMonitor } from '@edge-stream/observability-react';

function DevPanel() {
  return (
    <HooksMonitor
      showSettings={true}
      pollInterval={500}
      maxLogs={100}
    />
  );
}

Props

PropTypeDefaultDescription
classNamestring'page-container'CSS class for the outer div
styleCSSPropertiesInline styles for the outer div
showSettingsbooleantrueShow the Settings tab to toggle hook logging
pollIntervalnumber500How often (ms) to refresh log data from LoggingService
maxLogsnumber100Max number of recent message logs to retrieve

What HooksMonitor Displays

The component has two tabs: Live Monitor and Settings.

Live Monitor Tab

Settings Tab

Data Flow

// 1. HookActivityLogger records every hook invocation
server.incomingPipeline.addHook(new HookActivityLogger()); // priority 5

// 2. LoggingService stores them in a ring buffer
// (automatic — no additional setup needed)

// 3. HooksMonitor polls and renders
// setInterval(() => {
//   const allLogs = loggingService.getRecentLogs(maxLogs);
//   setLogs(allLogs || []);
// }, pollInterval)

// 4. allHookLogs = logs.flatMap(msg => msg.hookLogs || [])
// Each hookLog has: hookName, status ('success' | 'error' | 'pending'), executionTime, error?

Filtering by Hook Name

// In HooksMonitor, type in the filter box to narrow down:
// "Normal"     → shows only NormalizationHook rows
// "Audit"      → shows only AuditLogHook rows
// "Tenant"     → shows only TenantFilterHook rows

// Filtering is case-insensitive substring match on hookName
const filteredHooks = filter
  ? allHookLogs.filter((log) =>
      log.hookName?.toLowerCase().includes(filter.toLowerCase()))
  : allHookLogs;
Production Tip Add HookActivityLogger only in development builds. In production, remove it or check import.meta.env.DEV before adding it to avoid the overhead of recording every hook invocation.