UNPKG

traceapm

Version:

SDK for OpenTelemetry auto-instrumentation and OTLP export for Node.js apps.

74 lines (69 loc) 2.57 kB
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 };