traceapm
Version:
SDK for OpenTelemetry auto-instrumentation and OTLP export for Node.js apps.
74 lines (69 loc) • 2.57 kB
JavaScript
const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');
const { OTLPMetricExporter } = require('@opentelemetry/exporter-metrics-otlp-http');
const { PeriodicExportingMetricReader } = require('@opentelemetry/sdk-metrics');
const { Resource } = require('@opentelemetry/resources');
const { validateConfig } = require('../utils/validate');
const logger = require('../utils/logger');
// Modularized features
const { initAutoLogger } = require('./autoLogger');
const { getProxyAgent } = require('./proxy');
const { setupGrpcExporter } = require('./grpcExporter');
/**
* Express middleware to log every API hit (method and URL)
*/
function apiLogger(req, res, next) {
logger.info(`API hit: ${req.method} ${req.originalUrl}`);
next();
}
// Initialize auto-logging at startup
initAutoLogger();
/**
* Initializes distributed tracing and metrics for your Node.js application.
*
* @param config Configuration object
* @param config.serviceName Name of your service (default: 'my-service')
* @param config.endpoint Collector endpoint (default: 'http://localhost:4318')
* @param config.attributes Additional resource attributes (default: {})
*
* @example
* import { init } from 'traceapm';
* init({
* serviceName: 'my-service',
* endpoint: 'http://localhost:4318',
* attributes: { 'deployment.environment': 'dev' },
* });
*/
function init({
serviceName = 'my-service',
endpoint = 'http://localhost:4318',
attributes = {},
} = {}) {
try {
validateConfig({ serviceName, endpoint, attributes });
const traceExporter = new OTLPTraceExporter({ url: `${endpoint}/v1/traces` });
const metricExporter = new OTLPMetricExporter({ url: `${endpoint}/v1/metrics` });
const sdk = new NodeSDK({
resource: new Resource({ 'service.name': serviceName, ...attributes }),
traceExporter,
metricReader: new PeriodicExportingMetricReader({
exporter: metricExporter,
exportIntervalMillis: 1000,
}),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();
logger.info(`[traceapm] Initialized for service: ${serviceName}`);
return {
sdk,
apiLogger,
setupGrpcExporter, // Only if you want to support gRPC export
getProxyAgent
};
} catch (err) {
logger.error(`[traceapm] Initialization error: ${err.message}`);
throw err;
}
}
module.exports = { init };