Skip to content

Commit d477401

Browse files
committed
refactor logs setup
1 parent 6228a5b commit d477401

File tree

5 files changed

+88
-208
lines changed

5 files changed

+88
-208
lines changed

lib/otel/logs/bootstrap-logs.js

Lines changed: 0 additions & 84 deletions
This file was deleted.

lib/otel/logs/index.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
/*
2+
* Copyright 2025 New Relic Corporation. All rights reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
'use strict'
7+
8+
const logsApi = require('@opentelemetry/api-logs')
9+
const logsSdk = require('@opentelemetry/sdk-logs')
10+
const {
11+
isApplicationLoggingEnabled,
12+
isLogForwardingEnabled,
13+
isMetricsEnabled,
14+
incrementLoggingLinesMetrics
15+
} = require('#agentlib/util/application-logging.js')
16+
17+
const defaultLogger = require('../../logger').child({ component: 'opentelemetry-metrics' })
18+
const SetupSignal = require('../setup-signal.js')
19+
const NewRelicLoggerProvider = require('./proxying-provider.js')
20+
const NoOpExporter = require('./no-op-exporter.js')
21+
const normalizeTimestamp = require('./normalize-timestamp.js')
22+
const severityToString = require('./severity-to-string.js')
23+
24+
class SetupLogs extends SetupSignal {
25+
constructor({ agent, logger = defaultLogger } = {}) {
26+
super({ agent, logger })
27+
28+
if (isApplicationLoggingEnabled(agent.config) === false) {
29+
logger.info('application logging disabled, skipping otel logs setup')
30+
return
31+
}
32+
33+
agent.metrics
34+
.getOrCreateMetric('Supportability/Nodejs/OpenTelemetryBridge/Logs')
35+
.incrementCallCount()
36+
37+
const exporter = new NoOpExporter()
38+
const processor = new logsSdk.BatchLogRecordProcessor(exporter)
39+
const otelProvider = new logsSdk.LoggerProvider({
40+
processors: [processor]
41+
})
42+
const provider = new NewRelicLoggerProvider({
43+
agent,
44+
provider: otelProvider,
45+
emitHandler: nrEmitHandler
46+
})
47+
logsApi.logs.setGlobalLoggerProvider(provider)
48+
49+
function nrEmitHandler(record) {
50+
const level = severityToString(record.severityNumber ?? 0)
51+
if (isMetricsEnabled(agent.config) === true) {
52+
incrementLoggingLinesMetrics(level, agent.metrics)
53+
}
54+
55+
// TODO: if we decide to support local decorating, implement it here
56+
57+
if (isLogForwardingEnabled(agent.config, agent) === true) {
58+
const meta = agent.getLinkingMetadata(true)
59+
const timestamp = normalizeTimestamp(record.timestamp)
60+
const logData = {
61+
message: record.body,
62+
level,
63+
timestamp,
64+
...record.attributes,
65+
...meta
66+
}
67+
68+
agent.logs.add(logData)
69+
}
70+
}
71+
72+
agent.emit('otelLogsBootstrapped')
73+
}
74+
75+
teardown() {
76+
logsApi.logs.disable()
77+
}
78+
}
79+
80+
module.exports = SetupLogs

lib/otel/metrics/bootstrap-metrics.js

Lines changed: 0 additions & 117 deletions
This file was deleted.

lib/otel/setup.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@
66
'use strict'
77

88
const opentelemetry = require('@opentelemetry/api')
9-
const logsApi = require('@opentelemetry/api-logs')
109

11-
const SetupTraces = require('./traces/index.js')
10+
const SetupLogs = require('./logs/index.js')
1211
const SetupMetrics = require('./metrics/index.js')
12+
const SetupTraces = require('./traces/index.js')
1313
const ContextManager = require('./context-manager')
1414
const TracePropagator = require('./trace-propagator')
1515
const defaultLogger = require('../logger').child({ component: 'opentelemetry-bridge' })
1616
const createOtelLogger = require('./logger')
1717
const interceptSpanKey = require('./span-key-interceptor')
18-
const bootstrapLogs = require('./logs/bootstrap-logs')
1918

2019
const signals = []
2120

@@ -52,7 +51,8 @@ function setupOtel(agent, logger = defaultLogger) {
5251
}
5352

5453
if (agent.config.opentelemetry_bridge.logs.enabled === true) {
55-
bootstrapLogs({ agent })
54+
const signal = new SetupLogs({ agent })
55+
signals.push(signal)
5656
} else {
5757
logger.debug('`opentelemetry_bridge.logs` is not enabled, skipping')
5858
}
@@ -74,7 +74,6 @@ function teardownOtel(agent) {
7474
opentelemetry.context.disable()
7575
opentelemetry.propagation.disable()
7676
opentelemetry.diag.disable()
77-
logsApi.logs.disable()
7877
}
7978

8079
module.exports = {

test/unit/lib/otel/logs/bootstrap-logs.test.js renamed to test/unit/lib/otel/logs/index.test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,11 @@ const test = require('node:test')
99
const assert = require('node:assert')
1010
const { EventEmitter } = require('node:events')
1111

12-
const bootstrapLogs = require('#agentlib/otel/logs/bootstrap-logs.js')
12+
const SetupLogs = require('#agentlib/otel/logs/index.js')
1313

1414
test('logs notice when application logging is disabled', () => {
1515
const agent = {
16+
get [Symbol.toStringTag]() { return 'Agent' },
1617
config: {
1718
entity_guid: 'guid-123456',
1819
license_key: 'license-123456',
@@ -36,7 +37,8 @@ test('logs notice when application logging is disabled', () => {
3637
}
3738
}
3839

39-
bootstrapLogs({ agent, logger })
40+
const signal = new SetupLogs({ agent, logger })
41+
assert.ok(signal)
4042

4143
assert.deepStrictEqual(logs, [['application logging disabled, skipping otel logs setup']])
4244
})

0 commit comments

Comments
 (0)