Skip to content

Commit cfbf53b

Browse files
Stephen Belangernsavoire
authored andcommitted
Auto-instrument @opentelemetry/sdk-trace-node (#3248)
1 parent db6a0c6 commit cfbf53b

File tree

8 files changed

+83
-12
lines changed

8 files changed

+83
-12
lines changed

integration-tests/opentelemetry.spec.js

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,12 @@ describe('opentelemetry', () => {
4545
const timeout = 5000
4646

4747
before(async () => {
48-
sandbox = await createSandbox()
48+
sandbox = await createSandbox([
49+
'@opentelemetry/api',
50+
'@opentelemetry/sdk-node',
51+
// Needed because sdk-node doesn't start a tracer without an exporter
52+
'@opentelemetry/exporter-jaeger'
53+
])
4954
cwd = sandbox.folder
5055
agent = await new FakeAgent().start()
5156
})
@@ -102,4 +107,23 @@ describe('opentelemetry', () => {
102107
assert.strictEqual(ddSpan.parent_id.toString(), otelSpan.span_id.toString())
103108
})
104109
})
110+
111+
it('should auto-instrument @opentelemetry/sdk-node', async () => {
112+
proc = fork(join(cwd, 'opentelemetry/env-var.js'), {
113+
cwd,
114+
env: {
115+
DD_TRACE_AGENT_PORT: agent.port
116+
}
117+
})
118+
return check(agent, proc, timeout, ({ payload }) => {
119+
// Should have a single trace with a single span
120+
assert.strictEqual(payload.length, 1)
121+
const [trace] = payload
122+
assert.strictEqual(trace.length, 1)
123+
const [span] = trace
124+
125+
// Should be the expected otel span
126+
assert.strictEqual(span.name, 'otel-sub')
127+
})
128+
})
105129
})
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
'use strict'
2+
3+
process.env.DD_TRACE_OTEL_ENABLED = '1'
4+
5+
require('dd-trace').init()
6+
7+
const opentelemetry = require('@opentelemetry/sdk-node')
8+
const { JaegerExporter } = require('@opentelemetry/exporter-jaeger')
9+
10+
const sdk = new opentelemetry.NodeSDK({
11+
traceExporter: new JaegerExporter()
12+
})
13+
14+
sdk.start()
15+
16+
const otelTracer = opentelemetry.api.trace.getTracer(
17+
'my-service-tracer'
18+
)
19+
20+
otelTracer.startActiveSpan('otel-sub', otelSpan => {
21+
setImmediate(() => {
22+
otelSpan.end()
23+
})
24+
})

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"@datadog/pprof": "^2.2.1",
7474
"@datadog/sketches-js": "^2.1.0",
7575
"@opentelemetry/api": "^1.0.0",
76-
"@opentelemetry/core": "<1.4.0",
76+
"@opentelemetry/core": "^1.14.0",
7777
"crypto-randomuuid": "^1.0.0",
7878
"diagnostics_channel": "^1.1.0",
7979
"ignore": "^5.2.0",

packages/datadog-instrumentations/src/helpers/hooks.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module.exports = {
1414
'@koa/router': () => require('../koa'),
1515
'@node-redis/client': () => require('../redis'),
1616
'@opensearch-project/opensearch': () => require('../opensearch'),
17+
'@opentelemetry/sdk-trace-node': () => require('../otel-sdk-trace'),
1718
'@redis/client': () => require('../redis'),
1819
'amqp10': () => require('../amqp10'),
1920
'amqplib': () => require('../amqplib'),
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
'use strict'
2+
3+
const { addHook } = require('./helpers/instrument')
4+
const shimmer = require('../../datadog-shimmer')
5+
const tracer = require('../../dd-trace')
6+
7+
if (process.env.DD_TRACE_OTEL_ENABLED) {
8+
addHook({
9+
name: '@opentelemetry/sdk-trace-node',
10+
file: 'build/src/NodeTracerProvider.js',
11+
versions: ['*']
12+
}, (mod) => {
13+
shimmer.wrap(mod, 'NodeTracerProvider', () => {
14+
return tracer.TracerProvider
15+
})
16+
return mod
17+
})
18+
}

packages/dd-trace/src/noop/proxy.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ class Tracer {
7575
this.appsec.setUser(user)
7676
return this
7777
}
78+
79+
get TracerProvider () {
80+
return require('../opentelemetry/tracer_provider')
81+
}
7882
}
7983

8084
module.exports = Tracer

packages/dd-trace/src/opentelemetry/context_manager.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ class ContextManager {
6262
bind (context, target) {
6363
const self = this
6464
return function (...args) {
65-
return self.with(context, target, this, args)
65+
return self.with(context, target, this, ...args)
6666
}
6767
}
6868

yarn.lock

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -681,17 +681,17 @@
681681
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f"
682682
integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==
683683

684-
"@opentelemetry/core@<1.4.0":
685-
version "1.3.1"
686-
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.3.1.tgz#6eef5c5efca9a4cd7daa0cd4c7ff28ca2317c8d7"
687-
integrity sha512-k7lOC86N7WIyUZsUuSKZfFIrUtINtlauMGQsC1r7jNmcr0vVJGqK1ROBvt7WWMxLbpMnt1q2pXJO8tKu0b9auA==
684+
"@opentelemetry/core@^1.14.0":
685+
version "1.14.0"
686+
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.14.0.tgz#64e876b29cb736c984d54164cd47433f513eafd3"
687+
integrity sha512-MnMZ+sxsnlzloeuXL2nm5QcNczt/iO82UOeQQDHhV83F2fP3sgntW2evvtoxJki0MBLxEsh5ADD7PR/Hn5uzjw==
688688
dependencies:
689-
"@opentelemetry/semantic-conventions" "1.3.1"
689+
"@opentelemetry/semantic-conventions" "1.14.0"
690690

691-
"@opentelemetry/semantic-conventions@1.3.1":
692-
version "1.3.1"
693-
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.3.1.tgz#ba07b864a3c955f061aa30ea3ef7f4ae4449794a"
694-
integrity sha512-wU5J8rUoo32oSef/rFpOT1HIjLjAv3qIDHkw1QIhODV3OpAVHi5oVzlouozg9obUmZKtbZ0qUe/m7FP0y0yBzA==
691+
"@opentelemetry/semantic-conventions@1.14.0":
692+
version "1.14.0"
693+
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.14.0.tgz#6a729b7f372ce30f77a3f217c09bc216f863fccb"
694+
integrity sha512-rJfCY8rCWz3cb4KI6pEofnytvMPuj3YLQwoscCCYZ5DkdiPjo15IQ0US7+mjcWy9H3fcZIzf2pbJZ7ck/h4tug==
695695

696696
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
697697
version "1.1.2"

0 commit comments

Comments
 (0)