OpenTelemetry instrumentation for bunyan
This module provides automatic instrumentation of the bunyan
module to inject trace-context into Bunyan log records (log correlation) and to send Bunyan logging to the OpenTelemetry Logging SDK (log sending). It may be loaded using the @opentelemetry/sdk-trace-node
package and is included in the @opentelemetry/auto-instrumentations-node
bundle.
If total installation size is not constrained, it is recommended to use the @opentelemetry/auto-instrumentations-node
bundle with @opentelemetry/sdk-node for the most seamless instrumentation experience.
Compatible with OpenTelemetry JS API and SDK 1.0+
.
Installation
npm install --save @opentelemetry/instrumentation-bunyan
Supported Versions
Usage
const { NodeSDK, tracing, logs, api } = require('@opentelemetry/sdk-node');
const { BunyanInstrumentation } = require('@opentelemetry/instrumentation-bunyan');
const sdk = new NodeSDK({
spanProcessor: new tracing.SimpleSpanProcessor(new tracing.ConsoleSpanExporter()),
logRecordProcessor: new logs.SimpleLogRecordProcessor(new logs.ConsoleLogRecordExporter()),
instrumentations: [
new BunyanInstrumentation({
}),
]
})
const bunyan = require('bunyan');
const logger = bunyan.createLogger({name: 'example'});
logger.info('hi');
const tracer = api.trace.getTracer('example');
tracer.startActiveSpan('manual-span', span => {
logger.info('in a span');
})
Log sending
Creation of a Bunyan Logger will automatically add a Bunyan stream that sends log records to the OpenTelemetry Logs SDK. The OpenTelemetry SDK can be configured to handle those records -- for example, sending them on to an OpenTelemetry collector for log archiving and processing. The example above shows a minimal configuration that emits OpenTelemetry log records to the console for debugging.
If the OpenTelemetry SDK is not configured with a Logger provider, then this added stream will be a no-op.
Log sending can be disabled with the disableLogSending: true
option.
Log correlation
Bunyan logger calls in the context of a tracing span will have fields
indentifying the span added to the log record. This allows
correlating
log records with tracing data. The added fields are
(spec):
trace_id
span_id
trace_flags
After adding these fields, the optional logHook
is called to allow injecting additional fields. For example:
logHook: (span, record) => {
record['resource.service.name'] = provider.resource.attributes['service.name'];
}
When no span context is active or the span context is invalid, injection is skipped.
Log injection can be disabled with the disableLogCorrelation: true
option.
Bunyan instrumentation options
Option | Type | Description |
---|
disableLogSending | boolean | Whether to disable log sending. Default false . |
disableLogCorrelation | boolean | Whether to disable log correlation. Default false . |
logHook | LogHookFunction | An option hook to inject additional context to a log record after trace-context has been added. This requires disableLogCorrelation to be false. |
Using OpenTelemetryBunyanStream without instrumentation
This package exports the Bunyan stream class that is used to send records to the
OpenTelemetry Logs SDK. It can be used directly when configuring a Bunyan logger
if one is not using the BunyanInstrumentation
for whatever reason. For
example:
const { OpenTelemetryBunyanStream } = require('@opentelemetry/instrumentation-bunyan');
const bunyan = require('bunyan');
const logger = bunyan.createLogger({
name: 'my-logger',
streams: [
{
type: 'raw',
stream: new OpenTelemetryBunyanStream()
}
],
});
Useful links
License
Apache 2.0 - See LICENSE for more information.