dd-trace 5.51.0 → 5.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-3rdparty.csv +0 -6
- package/README.md +5 -0
- package/index.d.ts +88 -6
- package/package.json +3 -9
- package/packages/datadog-instrumentations/src/amqplib.js +8 -5
- package/packages/datadog-instrumentations/src/child_process.js +2 -1
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +406 -0
- package/packages/datadog-instrumentations/src/couchbase.js +2 -1
- package/packages/datadog-instrumentations/src/cucumber.js +43 -45
- package/packages/datadog-instrumentations/src/dns.js +16 -14
- package/packages/datadog-instrumentations/src/express.js +2 -6
- package/packages/datadog-instrumentations/src/fs.js +43 -51
- package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
- package/packages/datadog-instrumentations/src/helpers/register.js +17 -12
- package/packages/datadog-instrumentations/src/http/client.js +2 -1
- package/packages/datadog-instrumentations/src/iovalkey.js +51 -0
- package/packages/datadog-instrumentations/src/jest.js +53 -40
- package/packages/datadog-instrumentations/src/kafkajs.js +21 -8
- package/packages/datadog-instrumentations/src/mocha/main.js +33 -46
- package/packages/datadog-instrumentations/src/mocha/utils.js +76 -74
- package/packages/datadog-instrumentations/src/mysql2.js +3 -1
- package/packages/datadog-instrumentations/src/net.js +27 -29
- package/packages/datadog-instrumentations/src/next.js +6 -14
- package/packages/datadog-instrumentations/src/pg.js +15 -7
- package/packages/datadog-instrumentations/src/playwright.js +64 -67
- package/packages/datadog-instrumentations/src/url.js +9 -17
- package/packages/datadog-instrumentations/src/vitest.js +66 -72
- package/packages/datadog-plugin-confluentinc-kafka-javascript/src/batch-consumer.js +11 -0
- package/packages/datadog-plugin-confluentinc-kafka-javascript/src/consumer.js +11 -0
- package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +19 -0
- package/packages/datadog-plugin-confluentinc-kafka-javascript/src/producer.js +11 -0
- package/packages/datadog-plugin-cucumber/src/index.js +32 -18
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +3 -0
- package/packages/datadog-plugin-dns/src/lookup.js +10 -5
- package/packages/datadog-plugin-dns/src/lookup_service.js +6 -2
- package/packages/datadog-plugin-dns/src/resolve.js +5 -2
- package/packages/datadog-plugin-dns/src/reverse.js +6 -2
- package/packages/datadog-plugin-fs/src/index.js +9 -2
- package/packages/datadog-plugin-iovalkey/src/index.js +18 -0
- package/packages/datadog-plugin-jest/src/index.js +17 -8
- package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +2 -1
- package/packages/datadog-plugin-kafkajs/src/consumer.js +12 -21
- package/packages/datadog-plugin-kafkajs/src/producer.js +12 -5
- package/packages/datadog-plugin-kafkajs/src/utils.js +27 -0
- package/packages/datadog-plugin-langchain/src/index.js +0 -1
- package/packages/datadog-plugin-mocha/src/index.js +58 -35
- package/packages/datadog-plugin-net/src/ipc.js +6 -4
- package/packages/datadog-plugin-net/src/tcp.js +15 -9
- package/packages/datadog-plugin-pg/src/index.js +5 -1
- package/packages/datadog-plugin-playwright/src/index.js +29 -20
- package/packages/datadog-plugin-redis/src/index.js +8 -3
- package/packages/datadog-plugin-vitest/src/index.js +67 -44
- package/packages/datadog-shimmer/src/shimmer.js +164 -33
- package/packages/dd-trace/src/appsec/api_security_sampler.js +20 -12
- package/packages/dd-trace/src/appsec/graphql.js +2 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +14 -9
- package/packages/dd-trace/src/appsec/index.js +15 -12
- package/packages/dd-trace/src/appsec/rasp/index.js +4 -2
- package/packages/dd-trace/src/appsec/rasp/utils.js +11 -6
- package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
- package/packages/dd-trace/src/appsec/telemetry/index.js +1 -2
- package/packages/dd-trace/src/appsec/telemetry/rasp.js +0 -9
- package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +6 -6
- package/packages/dd-trace/src/baggage.js +36 -0
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +4 -2
- package/packages/dd-trace/src/config.js +14 -2
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +61 -7
- package/packages/dd-trace/src/debugger/devtools_client/index.js +10 -26
- package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -7
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +15 -7
- package/packages/dd-trace/src/debugger/devtools_client/state.js +22 -2
- package/packages/dd-trace/src/dogstatsd.js +2 -0
- package/packages/dd-trace/src/exporters/common/docker.js +13 -31
- package/packages/dd-trace/src/guardrails/telemetry.js +2 -5
- package/packages/dd-trace/src/llmobs/tagger.js +3 -3
- package/packages/dd-trace/src/llmobs/writers/base.js +33 -12
- package/packages/dd-trace/src/noop/proxy.js +5 -0
- package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -0
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +17 -9
- package/packages/dd-trace/src/plugin_manager.js +2 -0
- package/packages/dd-trace/src/plugins/index.js +4 -0
- package/packages/dd-trace/src/plugins/log_plugin.js +9 -20
- package/packages/dd-trace/src/plugins/outbound.js +11 -3
- package/packages/dd-trace/src/plugins/tracing.js +8 -4
- package/packages/dd-trace/src/plugins/util/test.js +1 -1
- package/packages/dd-trace/src/profiling/exporter_cli.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/event_plugins/dns_lookup.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/event_plugins/dns_lookupservice.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/event_plugins/dns_resolve.js +2 -2
- package/packages/dd-trace/src/profiling/profilers/event_plugins/dns_reverse.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +15 -14
- package/packages/dd-trace/src/proxy.js +12 -4
- package/packages/dd-trace/src/serverless.js +0 -48
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
- package/packages/dd-trace/src/standalone/product.js +3 -5
|
@@ -7,6 +7,7 @@ const log = require('../../log')
|
|
|
7
7
|
const TraceState = require('./tracestate')
|
|
8
8
|
const tags = require('../../../../../ext/tags')
|
|
9
9
|
const { channel } = require('dc-polyfill')
|
|
10
|
+
const { setBaggageItem, getAllBaggageItems, removeAllBaggageItems } = require('../../baggage')
|
|
10
11
|
|
|
11
12
|
const { AUTO_KEEP, AUTO_REJECT, USER_KEEP } = require('../../../../../ext/priority')
|
|
12
13
|
|
|
@@ -55,9 +56,10 @@ class TextMapPropagator {
|
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
inject (spanContext, carrier) {
|
|
58
|
-
if (!
|
|
59
|
-
|
|
59
|
+
if (!carrier) return
|
|
60
60
|
this._injectBaggageItems(spanContext, carrier)
|
|
61
|
+
if (!spanContext) return
|
|
62
|
+
|
|
61
63
|
this._injectDatadog(spanContext, carrier)
|
|
62
64
|
this._injectB3MultipleHeaders(spanContext, carrier)
|
|
63
65
|
this._injectB3SingleHeader(spanContext, carrier)
|
|
@@ -125,7 +127,7 @@ class TextMapPropagator {
|
|
|
125
127
|
|
|
126
128
|
_injectBaggageItems (spanContext, carrier) {
|
|
127
129
|
if (this._config.legacyBaggageEnabled) {
|
|
128
|
-
spanContext
|
|
130
|
+
spanContext?._baggageItems && Object.keys(spanContext._baggageItems).forEach(key => {
|
|
129
131
|
carrier[baggagePrefix + key] = String(spanContext._baggageItems[key])
|
|
130
132
|
})
|
|
131
133
|
}
|
|
@@ -134,7 +136,9 @@ class TextMapPropagator {
|
|
|
134
136
|
let itemCounter = 0
|
|
135
137
|
let byteCounter = 0
|
|
136
138
|
|
|
137
|
-
|
|
139
|
+
const baggageItems = spanContext ? spanContext._baggageItems : getAllBaggageItems()
|
|
140
|
+
if (!baggageItems) return
|
|
141
|
+
for (const [key, value] of Object.entries(baggageItems)) {
|
|
138
142
|
const item = `${this._encodeOtelBaggageKey(String(key).trim())}=${encodeURIComponent(String(value).trim())},`
|
|
139
143
|
itemCounter += 1
|
|
140
144
|
byteCounter += item.length
|
|
@@ -627,23 +631,27 @@ class TextMapPropagator {
|
|
|
627
631
|
_extractBaggageItems (carrier, spanContext) {
|
|
628
632
|
if (!this._hasPropagationStyle('extract', 'baggage')) return
|
|
629
633
|
if (!carrier || !carrier.baggage) return
|
|
630
|
-
if (!spanContext)
|
|
634
|
+
if (!spanContext) removeAllBaggageItems()
|
|
631
635
|
const baggages = carrier.baggage.split(',')
|
|
632
636
|
for (const keyValue of baggages) {
|
|
633
637
|
if (!keyValue.includes('=')) {
|
|
634
|
-
spanContext._baggageItems = {}
|
|
638
|
+
if (spanContext) spanContext._baggageItems = {}
|
|
635
639
|
return
|
|
636
640
|
}
|
|
637
641
|
let [key, value] = keyValue.split('=')
|
|
638
642
|
key = this._decodeOtelBaggageKey(key.trim())
|
|
639
643
|
value = decodeURIComponent(value.trim())
|
|
640
644
|
if (!key || !value) {
|
|
641
|
-
spanContext._baggageItems = {}
|
|
645
|
+
if (spanContext) spanContext._baggageItems = {}
|
|
642
646
|
return
|
|
643
647
|
}
|
|
644
648
|
// the current code assumes precedence of ot-baggage- (legacy opentracing baggage) over baggage
|
|
645
|
-
if (
|
|
646
|
-
|
|
649
|
+
if (spanContext) {
|
|
650
|
+
if (key in spanContext._baggageItems) return
|
|
651
|
+
spanContext._baggageItems[key] = value
|
|
652
|
+
} else {
|
|
653
|
+
setBaggageItem(key, value)
|
|
654
|
+
}
|
|
647
655
|
}
|
|
648
656
|
}
|
|
649
657
|
|
|
@@ -130,6 +130,7 @@ module.exports = class PluginManager {
|
|
|
130
130
|
site,
|
|
131
131
|
url,
|
|
132
132
|
headerTags,
|
|
133
|
+
codeOriginForSpans,
|
|
133
134
|
dbmPropagationMode,
|
|
134
135
|
dsmEnabled,
|
|
135
136
|
clientIpEnabled,
|
|
@@ -143,6 +144,7 @@ module.exports = class PluginManager {
|
|
|
143
144
|
} = this._tracerConfig
|
|
144
145
|
|
|
145
146
|
const sharedConfig = {
|
|
147
|
+
codeOriginForSpans,
|
|
146
148
|
dbmPropagationMode,
|
|
147
149
|
dsmEnabled,
|
|
148
150
|
memcachedCommandEnabled,
|
|
@@ -48,6 +48,7 @@ module.exports = {
|
|
|
48
48
|
get http2 () { return require('../../../datadog-plugin-http2/src') },
|
|
49
49
|
get https () { return require('../../../datadog-plugin-http/src') },
|
|
50
50
|
get ioredis () { return require('../../../datadog-plugin-ioredis/src') },
|
|
51
|
+
get iovalkey () { return require('../../../datadog-plugin-iovalkey/src') },
|
|
51
52
|
get 'jest-circus' () { return require('../../../datadog-plugin-jest/src') },
|
|
52
53
|
get 'jest-config' () { return require('../../../datadog-plugin-jest/src') },
|
|
53
54
|
get 'jest-environment-node' () { return require('../../../datadog-plugin-jest/src') },
|
|
@@ -57,6 +58,9 @@ module.exports = {
|
|
|
57
58
|
get koa () { return require('../../../datadog-plugin-koa/src') },
|
|
58
59
|
get 'koa-router' () { return require('../../../datadog-plugin-koa/src') },
|
|
59
60
|
get kafkajs () { return require('../../../datadog-plugin-kafkajs/src') },
|
|
61
|
+
get '@confluentinc/kafka-javascript' () {
|
|
62
|
+
return require('../../../datadog-plugin-confluentinc-kafka-javascript/src')
|
|
63
|
+
},
|
|
60
64
|
get langchain () { return require('../../../datadog-plugin-langchain/src') },
|
|
61
65
|
get mariadb () { return require('../../../datadog-plugin-mariadb/src') },
|
|
62
66
|
get memcached () { return require('../../../datadog-plugin-memcached/src') },
|
|
@@ -4,31 +4,21 @@ const { LOG } = require('../../../../ext/formats')
|
|
|
4
4
|
const Plugin = require('./plugin')
|
|
5
5
|
const { storage } = require('../../../datadog-core')
|
|
6
6
|
|
|
7
|
-
const hasOwn = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop)
|
|
8
|
-
|
|
9
7
|
function messageProxy (message, holder) {
|
|
10
8
|
return new Proxy(message, {
|
|
11
|
-
get (target,
|
|
12
|
-
if (
|
|
13
|
-
return Object.prototype.toString.call(target).slice(8, -1)
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (shouldOverride(target, p)) {
|
|
9
|
+
get (target, key) {
|
|
10
|
+
if (shouldOverride(target, key)) {
|
|
17
11
|
return holder.dd
|
|
18
12
|
}
|
|
19
13
|
|
|
20
|
-
|
|
21
|
-
if (p === 'stack') {
|
|
22
|
-
return target.stack
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return Reflect.get(target, p, receiver)
|
|
14
|
+
return target[key]
|
|
26
15
|
},
|
|
27
16
|
ownKeys (target) {
|
|
28
17
|
const ownKeys = Reflect.ownKeys(target)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
18
|
+
if (!Object.hasOwn(target, 'dd') && Reflect.isExtensible(target)) {
|
|
19
|
+
ownKeys.push('dd')
|
|
20
|
+
}
|
|
21
|
+
return ownKeys
|
|
32
22
|
},
|
|
33
23
|
getOwnPropertyDescriptor (target, p) {
|
|
34
24
|
return Reflect.getOwnPropertyDescriptor(shouldOverride(target, p) ? holder : target, p)
|
|
@@ -37,7 +27,7 @@ function messageProxy (message, holder) {
|
|
|
37
27
|
}
|
|
38
28
|
|
|
39
29
|
function shouldOverride (target, p) {
|
|
40
|
-
return p === 'dd' && !
|
|
30
|
+
return p === 'dd' && !Object.hasOwn(target, p) && Reflect.isExtensible(target)
|
|
41
31
|
}
|
|
42
32
|
|
|
43
33
|
module.exports = class LogPlugin extends Plugin {
|
|
@@ -45,8 +35,7 @@ module.exports = class LogPlugin extends Plugin {
|
|
|
45
35
|
super(...args)
|
|
46
36
|
|
|
47
37
|
this.addSub(`apm:${this.constructor.id}:log`, (arg) => {
|
|
48
|
-
const
|
|
49
|
-
const span = store && store.span
|
|
38
|
+
const span = storage('legacy').getStore()?.span
|
|
50
39
|
|
|
51
40
|
// NOTE: This needs to run whether or not there is a span
|
|
52
41
|
// so service, version, and env will always get injected.
|
|
@@ -28,7 +28,10 @@ class OutboundPlugin extends TracingPlugin {
|
|
|
28
28
|
|
|
29
29
|
startSpan (...args) {
|
|
30
30
|
const span = super.startSpan(...args)
|
|
31
|
-
if (
|
|
31
|
+
if (
|
|
32
|
+
this._tracerConfig.codeOriginForSpans.enabled &&
|
|
33
|
+
this._tracerConfig.codeOriginForSpans.experimental.exit_spans.enabled
|
|
34
|
+
) {
|
|
32
35
|
span.addTags(exitTags(this.startSpan))
|
|
33
36
|
}
|
|
34
37
|
return span
|
|
@@ -84,8 +87,13 @@ class OutboundPlugin extends TracingPlugin {
|
|
|
84
87
|
return peerData
|
|
85
88
|
}
|
|
86
89
|
|
|
87
|
-
|
|
88
|
-
|
|
90
|
+
bindFinish (ctx) {
|
|
91
|
+
return ctx.parentStore
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
finish (ctx) {
|
|
95
|
+
const span = ctx?.currentStore?.span || this.activeSpan
|
|
96
|
+
this.tagPeerService(span)
|
|
89
97
|
super.finish(...arguments)
|
|
90
98
|
}
|
|
91
99
|
|
|
@@ -53,8 +53,9 @@ class TracingPlugin extends Plugin {
|
|
|
53
53
|
|
|
54
54
|
start () {} // implemented by individual plugins
|
|
55
55
|
|
|
56
|
-
finish () {
|
|
57
|
-
this.activeSpan
|
|
56
|
+
finish (ctx) {
|
|
57
|
+
const span = ctx?.currentStore?.span || this.activeSpan
|
|
58
|
+
span?.finish()
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
error (ctxOrError) {
|
|
@@ -101,7 +102,7 @@ class TracingPlugin extends Plugin {
|
|
|
101
102
|
}
|
|
102
103
|
}
|
|
103
104
|
|
|
104
|
-
startSpan (name, { childOf, kind, meta, metrics, service, resource, type } = {},
|
|
105
|
+
startSpan (name, { childOf, kind, meta, metrics, service, resource, type } = {}, enterOrCtx = true) {
|
|
105
106
|
const store = storage('legacy').getStore()
|
|
106
107
|
if (store && childOf === undefined) {
|
|
107
108
|
childOf = store.span
|
|
@@ -125,8 +126,11 @@ class TracingPlugin extends Plugin {
|
|
|
125
126
|
analyticsSampler.sample(span, this.config.measured)
|
|
126
127
|
|
|
127
128
|
// TODO: Remove this after migration to TracingChannel is done.
|
|
128
|
-
if (
|
|
129
|
+
if (enterOrCtx === true) {
|
|
129
130
|
storage('legacy').enterWith({ ...store, span })
|
|
131
|
+
} else if (enterOrCtx) {
|
|
132
|
+
enterOrCtx.parentStore = store
|
|
133
|
+
enterOrCtx.currentStore = { ...store, span }
|
|
130
134
|
}
|
|
131
135
|
|
|
132
136
|
return span
|
|
@@ -786,7 +786,7 @@ function getLibraryCapabilitiesTags (testFramework, isParallel) {
|
|
|
786
786
|
[DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE]: '1',
|
|
787
787
|
[DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE]: '1',
|
|
788
788
|
[DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX]: isAttemptToFixSupported(testFramework, isParallel)
|
|
789
|
-
? '
|
|
789
|
+
? '4'
|
|
790
790
|
: undefined
|
|
791
791
|
}
|
|
792
792
|
}
|
|
@@ -7,7 +7,7 @@ class DNSLookupServicePlugin extends DNSPlugin {
|
|
|
7
7
|
|
|
8
8
|
extendEvent (event, startEvent) {
|
|
9
9
|
event.name = 'lookupService'
|
|
10
|
-
event.detail = { host: startEvent[0], port: startEvent[1] }
|
|
10
|
+
event.detail = { host: startEvent.args[0], port: startEvent.args[1] }
|
|
11
11
|
|
|
12
12
|
return event
|
|
13
13
|
}
|
|
@@ -8,14 +8,14 @@ class DNSResolvePlugin extends DNSPlugin {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
extendEvent (event, startEvent) {
|
|
11
|
-
const rrtype = startEvent[1]
|
|
11
|
+
const rrtype = startEvent.args[1]
|
|
12
12
|
let name = queryNames.get(rrtype)
|
|
13
13
|
if (!name) {
|
|
14
14
|
name = `query${rrtype}`
|
|
15
15
|
queryNames.set(rrtype, name)
|
|
16
16
|
}
|
|
17
17
|
event.name = name
|
|
18
|
-
event.detail = { host: startEvent[0] }
|
|
18
|
+
event.detail = { host: startEvent.args[0] }
|
|
19
19
|
|
|
20
20
|
return event
|
|
21
21
|
}
|
|
@@ -1,37 +1,38 @@
|
|
|
1
|
-
const { storage } = require('../../../../../datadog-core')
|
|
2
1
|
const TracingPlugin = require('../../../plugins/tracing')
|
|
3
2
|
const { performance } = require('perf_hooks')
|
|
4
3
|
|
|
5
4
|
// We are leveraging the TracingPlugin class for its functionality to bind
|
|
6
5
|
// start/error/finish methods to the appropriate diagnostic channels.
|
|
6
|
+
// TODO: Decouple this from TracingPlugin.
|
|
7
7
|
class EventPlugin extends TracingPlugin {
|
|
8
8
|
constructor (eventHandler, eventFilter) {
|
|
9
9
|
super()
|
|
10
10
|
this.eventHandler = eventHandler
|
|
11
11
|
this.eventFilter = eventFilter
|
|
12
|
-
this.
|
|
12
|
+
this.contextData = new WeakMap()
|
|
13
13
|
this.entryType = this.constructor.entryType
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
-
start (
|
|
17
|
-
this.
|
|
18
|
-
startEvent,
|
|
16
|
+
start (ctx) {
|
|
17
|
+
this.contextData.set(ctx, {
|
|
18
|
+
startEvent: ctx,
|
|
19
19
|
startTime: performance.now()
|
|
20
20
|
})
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
error () {
|
|
24
|
-
const
|
|
25
|
-
if (
|
|
26
|
-
|
|
23
|
+
error (ctx) {
|
|
24
|
+
const data = this.contextData.get(ctx)
|
|
25
|
+
if (data) {
|
|
26
|
+
data.error = true
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
finish () {
|
|
31
|
-
const
|
|
32
|
-
if (!store) return
|
|
30
|
+
finish (ctx) {
|
|
31
|
+
const data = this.contextData.get(ctx)
|
|
33
32
|
|
|
34
|
-
|
|
33
|
+
if (!data) return
|
|
34
|
+
|
|
35
|
+
const { startEvent, startTime, error } = data
|
|
35
36
|
if (error || this.ignoreEvent(startEvent)) {
|
|
36
37
|
return // don't emit perf events for failed operations or ignored events
|
|
37
38
|
}
|
|
@@ -47,7 +48,7 @@ class EventPlugin extends TracingPlugin {
|
|
|
47
48
|
return
|
|
48
49
|
}
|
|
49
50
|
|
|
50
|
-
const context = this.activeSpan?.context()
|
|
51
|
+
const context = (ctx.currentStore?.span || this.activeSpan)?.context()
|
|
51
52
|
event._ddSpanId = context?.toSpanId()
|
|
52
53
|
event._ddRootSpanId = context?._trace.started[0]?.context().toSpanId() || event._ddSpanId
|
|
53
54
|
|
|
@@ -10,6 +10,13 @@ const telemetry = require('./telemetry')
|
|
|
10
10
|
const nomenclature = require('./service-naming')
|
|
11
11
|
const PluginManager = require('./plugin_manager')
|
|
12
12
|
const NoopDogStatsDClient = require('./noop/dogstatsd')
|
|
13
|
+
const {
|
|
14
|
+
setBaggageItem,
|
|
15
|
+
getBaggageItem,
|
|
16
|
+
getAllBaggageItems,
|
|
17
|
+
removeBaggageItem,
|
|
18
|
+
removeAllBaggageItems
|
|
19
|
+
} = require('./baggage')
|
|
13
20
|
|
|
14
21
|
class LazyModule {
|
|
15
22
|
constructor (provider) {
|
|
@@ -65,6 +72,11 @@ class Tracer extends NoopProxy {
|
|
|
65
72
|
this.dogstatsd = new NoopDogStatsDClient()
|
|
66
73
|
this._tracingInitialized = false
|
|
67
74
|
this._flare = new LazyModule(() => require('./flare'))
|
|
75
|
+
this.setBaggageItem = setBaggageItem
|
|
76
|
+
this.getBaggageItem = getBaggageItem
|
|
77
|
+
this.getAllBaggageItems = getAllBaggageItems
|
|
78
|
+
this.removeBaggageItem = removeBaggageItem
|
|
79
|
+
this.removeAllBaggageItems = removeAllBaggageItems
|
|
68
80
|
|
|
69
81
|
// these requires must work with esm bundler
|
|
70
82
|
this._modules = {
|
|
@@ -140,10 +152,6 @@ class Tracer extends NoopProxy {
|
|
|
140
152
|
}
|
|
141
153
|
}
|
|
142
154
|
|
|
143
|
-
if (config.isGCPFunction || config.isAzureFunction) {
|
|
144
|
-
require('./serverless').maybeStartServerlessMiniAgent(config)
|
|
145
|
-
}
|
|
146
|
-
|
|
147
155
|
if (config.profiling.enabled !== 'false') {
|
|
148
156
|
const { SSIHeuristics } = require('./profiling/ssi-heuristics')
|
|
149
157
|
const ssiHeuristics = new SSIHeuristics(config)
|
|
@@ -1,51 +1,5 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const log = require('./log')
|
|
4
|
-
|
|
5
|
-
function maybeStartServerlessMiniAgent (config) {
|
|
6
|
-
if (process.platform !== 'win32' && process.platform !== 'linux') {
|
|
7
|
-
log.error('Serverless Mini Agent is only supported on Windows and Linux.')
|
|
8
|
-
return
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const rustBinaryPath = getRustBinaryPath(config)
|
|
12
|
-
|
|
13
|
-
const fs = require('fs')
|
|
14
|
-
|
|
15
|
-
log.debug(`Trying to spawn the Serverless Mini Agent at path: ${rustBinaryPath}`)
|
|
16
|
-
|
|
17
|
-
// trying to spawn with an invalid path will return a non-descriptive error, so we want to catch
|
|
18
|
-
// invalid paths and log our own error.
|
|
19
|
-
if (!fs.existsSync(rustBinaryPath)) {
|
|
20
|
-
log.error('Serverless Mini Agent did not start. Could not find mini agent binary.')
|
|
21
|
-
return
|
|
22
|
-
}
|
|
23
|
-
try {
|
|
24
|
-
require('child_process').spawn(rustBinaryPath, { stdio: 'inherit' })
|
|
25
|
-
} catch (err) {
|
|
26
|
-
log.error('Error spawning mini agent process: %s', err.message)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function getRustBinaryPath (config) {
|
|
31
|
-
if (process.env.DD_MINI_AGENT_PATH !== undefined) {
|
|
32
|
-
return process.env.DD_MINI_AGENT_PATH
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const rustBinaryPathRoot = config.isGCPFunction ? '/workspace' : '/home/site/wwwroot'
|
|
36
|
-
const rustBinaryPathOsFolder = process.platform === 'win32'
|
|
37
|
-
? 'datadog-serverless-agent-windows-amd64'
|
|
38
|
-
: 'datadog-serverless-agent-linux-amd64'
|
|
39
|
-
|
|
40
|
-
const rustBinaryExtension = process.platform === 'win32' ? '.exe' : ''
|
|
41
|
-
|
|
42
|
-
const rustBinaryPath =
|
|
43
|
-
`${rustBinaryPathRoot}/node_modules/@datadog/sma/${rustBinaryPathOsFolder}/\
|
|
44
|
-
datadog-serverless-trace-mini-agent${rustBinaryExtension}`
|
|
45
|
-
|
|
46
|
-
return rustBinaryPath
|
|
47
|
-
}
|
|
48
|
-
|
|
49
3
|
function getIsGCPFunction () {
|
|
50
4
|
const isDeprecatedGCPFunction = process.env.FUNCTION_NAME !== undefined && process.env.GCP_PROJECT !== undefined
|
|
51
5
|
const isNewerGCPFunction = process.env.K_SERVICE !== undefined && process.env.FUNCTION_TARGET !== undefined
|
|
@@ -69,9 +23,7 @@ function isInServerlessEnvironment () {
|
|
|
69
23
|
}
|
|
70
24
|
|
|
71
25
|
module.exports = {
|
|
72
|
-
maybeStartServerlessMiniAgent,
|
|
73
26
|
getIsGCPFunction,
|
|
74
27
|
getIsAzureFunction,
|
|
75
|
-
getRustBinaryPath,
|
|
76
28
|
isInServerlessEnvironment
|
|
77
29
|
}
|
|
@@ -22,6 +22,10 @@ const messaging = {
|
|
|
22
22
|
opName: () => 'kafka.produce',
|
|
23
23
|
serviceName: ({ tracerService }) => `${tracerService}-kafka`
|
|
24
24
|
},
|
|
25
|
+
'@confluentinc/kafka-javascript': {
|
|
26
|
+
opName: () => 'kafka.produce',
|
|
27
|
+
serviceName: ({ tracerService }) => `${tracerService}-kafka`
|
|
28
|
+
},
|
|
25
29
|
rhea: {
|
|
26
30
|
opName: () => 'amqp.send',
|
|
27
31
|
serviceName: ({ tracerService }) => `${tracerService}-amqp-producer`
|
|
@@ -52,6 +56,10 @@ const messaging = {
|
|
|
52
56
|
opName: () => 'kafka.consume',
|
|
53
57
|
serviceName: ({ tracerService }) => `${tracerService}-kafka`
|
|
54
58
|
},
|
|
59
|
+
'@confluentinc/kafka-javascript': {
|
|
60
|
+
opName: () => 'kafka.consume',
|
|
61
|
+
serviceName: ({ tracerService }) => `${tracerService}-kafka`
|
|
62
|
+
},
|
|
55
63
|
rhea: {
|
|
56
64
|
opName: () => 'amqp.receive',
|
|
57
65
|
serviceName: identityService
|
|
@@ -35,6 +35,13 @@ const redisConfig = {
|
|
|
35
35
|
}
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
const valkeyConfig = {
|
|
39
|
+
opName: () => 'valkey.command',
|
|
40
|
+
serviceName: ({ tracerService, pluginConfig, system, connectionName }) => {
|
|
41
|
+
return getRedisService(pluginConfig, connectionName) || fromSystem(tracerService, system)
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
38
45
|
const storage = {
|
|
39
46
|
client: {
|
|
40
47
|
aerospike: {
|
|
@@ -57,6 +64,7 @@ const storage = {
|
|
|
57
64
|
pluginConfig.service || `${tracerService}-elasticsearch`
|
|
58
65
|
},
|
|
59
66
|
ioredis: redisConfig,
|
|
67
|
+
iovalkey: valkeyConfig,
|
|
60
68
|
mariadb: {
|
|
61
69
|
opName: () => 'mariadb.query',
|
|
62
70
|
serviceName: mysqlServiceName
|
|
@@ -22,6 +22,10 @@ const messaging = {
|
|
|
22
22
|
opName: () => 'kafka.send',
|
|
23
23
|
serviceName: identityService
|
|
24
24
|
},
|
|
25
|
+
'@confluentinc/kafka-javascript': {
|
|
26
|
+
opName: () => 'kafka.send',
|
|
27
|
+
serviceName: identityService
|
|
28
|
+
},
|
|
25
29
|
rhea: amqpOutbound,
|
|
26
30
|
sqs: {
|
|
27
31
|
opName: () => 'aws.sqs.send',
|
|
@@ -43,6 +47,10 @@ const messaging = {
|
|
|
43
47
|
opName: () => 'kafka.process',
|
|
44
48
|
serviceName: identityService
|
|
45
49
|
},
|
|
50
|
+
'@confluentinc/kafka-javascript': {
|
|
51
|
+
opName: () => 'kafka.process',
|
|
52
|
+
serviceName: identityService
|
|
53
|
+
},
|
|
46
54
|
rhea: amqpInbound,
|
|
47
55
|
sqs: {
|
|
48
56
|
opName: () => 'aws.sqs.process',
|
|
@@ -3,14 +3,12 @@
|
|
|
3
3
|
const { SAMPLING_MECHANISM_APPSEC } = require('../constants')
|
|
4
4
|
const RateLimiter = require('../rate_limiter')
|
|
5
5
|
|
|
6
|
-
const dropAll = new RateLimiter(0)
|
|
7
|
-
const onePerMinute = new RateLimiter(1, 'minute')
|
|
8
|
-
|
|
9
6
|
function getProductRateLimiter (config) {
|
|
10
7
|
if (config?.appsec?.enabled || config?.iast?.enabled) {
|
|
11
|
-
return onePerMinute
|
|
8
|
+
return new RateLimiter(1, 'minute') // onePerMinute
|
|
12
9
|
}
|
|
13
|
-
|
|
10
|
+
|
|
11
|
+
return new RateLimiter(0) // dropAll
|
|
14
12
|
}
|
|
15
13
|
|
|
16
14
|
const PRODUCTS = {
|