@safaricom-mxl/node-sdk
v0.0.7
Published
MXL Node.js OpenTelemetry SDK
Maintainers
Readme
@safaricom-mxl/node-sdk
Server-side OpenTelemetry SDK for Node.js services.
Install
npm install @safaricom-mxl/node-sdkQuick start
import { initSDK } from '@safaricom-mxl/node-sdk';
initSDK({
serviceName: 'orders-api',
});CLI preload
opentelemetry-instrument ./dist/server.jsFramework helpers
- Express:
setupExpressErrorHandler - Koa:
setupKoaErrorHandler - Fastify:
setupFastifyErrorHandler - Nest:
createNestLogger
Logger adapters
- Pino:
getPinoTransport,getPinoMixinFunction - Winston:
getWinstonTransport - evlog (wide events):
createEvlogDrain,getEvlogDrain,createOtelTraceEnricher,createAuditOtelDrain,parseEvlogEvent,OTelEvlogBridge
Install the peer when using evlog:
npm install evlogAfter initSDK(), wire evlog so wide events use the same OTLP log pipeline as Pino/Winston. Use createOtelTraceEnricher() so logs pick up the active OpenTelemetry span (not only the traceparent header). Use createAuditOtelDrain() for audit-only events under instrumentation scope evlog.audit.
import express from 'express';
import { initLogger } from 'evlog';
import { evlog } from 'evlog/express';
import {
initSDK,
createEvlogDrain,
createOtelTraceEnricher,
createAuditOtelDrain,
} from '@safaricom-mxl/node-sdk';
initSDK({ serviceName: 'orders-api' });
initLogger({ env: { service: 'orders-api' } });
const app = express();
app.use(
evlog({
enrich: createOtelTraceEnricher(),
drain: async (ctx) => {
await Promise.allSettled([
createEvlogDrain()(ctx),
createAuditOtelDrain()(ctx),
]);
},
}),
);Subpath import (same API):
import { createEvlogDrain } from '@safaricom-mxl/node-sdk/logger/evlog';Optional: add createFsDrain() from evlog/fs so events are also written under .evlog/logs/ for local analysis.
Agent skill workflows that pair well with this setup: /review-logging-patterns, /build-audit-logs, /analyze-logs.
Environment variables
OTEL_SERVICE_NAMEOTEL_EXPORTER_OTLP_ENDPOINTOTEL_EXPORTER_OTLP_PROTOCOL(http/protobuf,http/json,grpc)OTEL_EXPORTER_OTLP_HEADERSOTEL_TRACES_SAMPLEROTEL_TRACES_SAMPLER_ARGMXL_NODE_ADVANCED_NETWORK_CAPTUREMXL_NODE_SENTRY_INTEGRATION_ENABLED
Troubleshooting
- Ensure collector protocol matches
OTEL_EXPORTER_OTLP_PROTOCOL. - If logs are missing, confirm
OTEL_LOGS_EXPORTERis not set tonone. - For preload mode in bundled apps, verify the preload command runs before app bootstrap.
