As33
@periodic/
arsenic

Configuration

All configuration is done in code when calling createMonitor(). There are no config files.

MonitorConfig options

OptionTypeDefaultDescription
slowQueryThresholdMsnumber200Threshold in ms for slow query detection
exporterExporterRequired. Receives all emitted events
emitPositiveSignalsbooleanfalseEnable INFO-level healthy signals
includeDocsbooleantrueInclude signal explanations in events

Full example

typescript
import { createMonitor, SignalSeverity } from '@periodic/arsenic';

const monitor = createMonitor({
  // Slow query threshold — queries over this emit slow_query signal
  slowQueryThresholdMs: 200,

  // Required — your event router
  exporter: (event) => {
    switch (event.severity) {
      case SignalSeverity.CRITICAL: sendToPagerDuty(event); break;
      case SignalSeverity.WARNING:  sendToSlack(event);     break;
      case SignalSeverity.INFO:     logger.info(event);     break;
    }
  },

  // Enable INFO signals (disabled by default to reduce noise)
  emitPositiveSignals: false,

  // Include human-readable signal explanations in events
  includeDocs: true,
});

Framework adapter options

typescript
// Express context
app.use(expressContext(monitor, {
  // Optional — extract user ID from request for event attribution
  attachUser: (req) => req.user?.id,
}));

// Fastify context
app.register(fastifyContext(monitor, {
  attachUser: (req) => req.user?.id,
}));

Environment-based configuration

src/config/monitor.ts
typescript
const isDev = process.env.NODE_ENV === 'development';

const monitor = createMonitor({
  // Looser in dev, stricter in prod
  slowQueryThresholdMs: isDev ? 500 : 200,

  // More verbose in dev
  emitPositiveSignals: isDev,
  includeDocs: isDev,

  exporter: async (event) => {
    // Always log
    logger.info(event, 'db.event');

    // Only alert in production
    if (!isDev && event.severity === SignalSeverity.CRITICAL) {
      await sendToPagerDuty(event);
    }
  },
});

export default monitor;

No global state

Each monitor is a fully independent instance. Create multiple monitors with different thresholds for different databases or services. Safe for multi-tenant applications.