newrelic
Version:
New Relic agent
89 lines (74 loc) • 2.75 kB
JavaScript
/*
* Copyright 2025 New Relic Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/
const opentelemetry = require('@opentelemetry/api')
const SetupLogs = require('./logs/index.js')
const SetupMetrics = require('./metrics/index.js')
const SetupTraces = require('./traces/index.js')
const ContextManager = require('./context-manager')
const TracePropagator = require('./trace-propagator')
const defaultLogger = require('../logger').child({ component: 'opentelemetry-bridge' })
const createOtelLogger = require('./logger')
const interceptSpanKey = require('./span-key-interceptor')
const signals = []
function setupOtel(agent, logger = defaultLogger) {
if (agent.config.opentelemetry.enabled !== true) {
logger.warn(
'`opentelemetry` is not enabled, skipping setup of opentelemetry'
)
return
}
// When bridge mode is enabled, our context manager must utilize the OTEL
// context manager. Otherwise, traces within, e.g. logs, will not be
// captured correctly. The internal OTEL logger also must be configured
// for the OTEL context manager to generate diagnostics messages that get
// delivered to the correct place.
createOtelLogger(logger, agent.config)
interceptSpanKey(agent)
opentelemetry.context.setGlobalContextManager(new ContextManager(agent))
opentelemetry.propagation.setGlobalPropagator(new TracePropagator(agent))
if (agent.config.opentelemetry.traces.enabled === true) {
const signal = new SetupTraces({ agent })
signals.push(signal)
} else {
logger.debug('`opentelemetry.traces` is not enabled, skipping')
agent.metrics
.getOrCreateMetric('Supportability/Tracing/Nodejs/OpenTelemetryBridge/disabled')
.incrementCallCount()
}
if (agent.config.opentelemetry.metrics.enabled === true) {
const signal = new SetupMetrics({ agent })
signals.push(signal)
} else {
logger.debug('`opentelemetry.metrics` is not enabled, skipping')
agent.metrics
.getOrCreateMetric('Supportability/Metrics/Nodejs/OpenTelemetryBridge/disabled')
.incrementCallCount()
}
if (agent.config.opentelemetry.logs.enabled === true) {
const signal = new SetupLogs({ agent })
signals.push(signal)
} else {
logger.debug('`opentelemetry.logs` is not enabled, skipping')
}
agent.metrics
.getOrCreateMetric('Supportability/Nodejs/OpenTelemetryBridge/Setup')
.incrementCallCount()
}
function teardownOtel(agent) {
if (agent?.config?.opentelemetry?.enabled !== true) {
return
}
for (const signal of signals) {
signal.teardown()
}
opentelemetry.context.disable()
opentelemetry.propagation.disable()
opentelemetry.diag.disable()
}
module.exports = {
setupOtel,
teardownOtel
}