traceapm
Version:
SDK for OpenTelemetry auto-instrumentation and OTLP export for Node.js apps.
49 lines (40 loc) • 1.91 kB
JavaScript
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { diag, DiagConsoleLogger, DiagLogLevel } = require('@opentelemetry/api');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-http');
const { SequelizeInstrumentation } = require('opentelemetry-instrumentation-sequelize');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics');
const { Resource } = require('@opentelemetry/resources');
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');
function init(options = {}) {
const endpoint = options.endpoint || 'http://localhost:4318';
const serviceName = options.serviceName || process.env.OTEL_SERVICE_NAME || 'default';
if (!options.endpoint) {
console.warn('[traceapm] Warning: No collector endpoint provided. Using default.');
}
if (!options.serviceName && !process.env.OTEL_SERVICE_NAME) {
console.warn('[traceapm] Warning: No service name provided. Using default.');
}
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ERROR);
const traceExporter = new OTLPTraceExporter({
url: endpoint + '/v1/traces',
});
const metricExporter = new OTLPMetricExporter({
url: endpoint + '/v1/metrics',
});
const sequelizeInstrumentation = new SequelizeInstrumentation({
enhancedDatabaseReporting: true,
});
const sdk = new NodeSDK({
traceExporter,
metricReader: new PeriodicExportingMetricReader({ exporter: metricExporter }),
instrumentations: [getNodeAutoInstrumentations(), sequelizeInstrumentation],
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: serviceName,
...options.attributes,
}),
});
sdk.start();
}
module.exports = { init };