dd-trace 5.86.0 → 5.88.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 +60 -32
- package/ext/exporters.d.ts +1 -0
- package/ext/exporters.js +1 -0
- package/index.d.ts +243 -7
- package/package.json +9 -6
- package/packages/datadog-instrumentations/src/ai.js +54 -90
- package/packages/datadog-instrumentations/src/cucumber.js +14 -0
- package/packages/datadog-instrumentations/src/helpers/hook.js +17 -11
- package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +55 -14
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +15 -13
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/ai.js +103 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.js +108 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +2 -1
- package/packages/datadog-instrumentations/src/helpers/rewriter/transformer.js +21 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +138 -12
- package/packages/datadog-instrumentations/src/http/client.js +119 -1
- package/packages/datadog-instrumentations/src/jest.js +179 -15
- package/packages/datadog-instrumentations/src/kafkajs.js +20 -17
- package/packages/datadog-instrumentations/src/mocha/utils.js +6 -0
- package/packages/datadog-instrumentations/src/mysql2.js +131 -64
- package/packages/datadog-instrumentations/src/playwright.js +9 -1
- package/packages/datadog-instrumentations/src/stripe.js +92 -0
- package/packages/datadog-instrumentations/src/vitest.js +11 -0
- package/packages/datadog-plugin-amqplib/src/consumer.js +14 -10
- package/packages/datadog-plugin-amqplib/src/producer.js +23 -19
- package/packages/datadog-plugin-azure-functions/src/index.js +53 -37
- package/packages/datadog-plugin-bullmq/src/consumer.js +33 -11
- package/packages/datadog-plugin-bullmq/src/producer.js +60 -31
- package/packages/datadog-plugin-cucumber/src/index.js +9 -6
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +33 -0
- package/packages/datadog-plugin-cypress/src/support.js +48 -8
- package/packages/datadog-plugin-jest/src/index.js +12 -2
- package/packages/datadog-plugin-jest/src/util.js +2 -1
- package/packages/datadog-plugin-kafkajs/src/consumer.js +22 -12
- package/packages/datadog-plugin-kafkajs/src/producer.js +33 -22
- package/packages/datadog-plugin-mocha/src/index.js +9 -6
- package/packages/datadog-plugin-playwright/src/index.js +10 -6
- package/packages/datadog-plugin-vitest/src/index.js +13 -8
- package/packages/dd-trace/src/appsec/addresses.js +11 -0
- package/packages/dd-trace/src/appsec/channels.js +5 -1
- package/packages/dd-trace/src/appsec/downstream_requests.js +302 -0
- package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +4 -5
- package/packages/dd-trace/src/appsec/iast/path-line.js +36 -25
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +3 -4
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +3 -2
- package/packages/dd-trace/src/appsec/index.js +103 -0
- package/packages/dd-trace/src/appsec/rasp/ssrf.js +66 -4
- package/packages/dd-trace/src/azure_metadata.js +0 -2
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +14 -1
- package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +2 -0
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -1
- package/packages/dd-trace/src/ci-visibility/requests/request.js +236 -0
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
- package/packages/dd-trace/src/config/defaults.js +148 -195
- package/packages/dd-trace/src/config/helper.js +43 -1
- package/packages/dd-trace/src/config/index.js +42 -14
- package/packages/dd-trace/src/config/supported-configurations.json +4115 -510
- package/packages/dd-trace/src/constants.js +0 -2
- package/packages/dd-trace/src/crashtracking/crashtracker.js +10 -3
- package/packages/dd-trace/src/datastreams/pathway.js +22 -3
- package/packages/dd-trace/src/datastreams/processor.js +14 -1
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +47 -2
- package/packages/dd-trace/src/debugger/devtools_client/index.js +75 -23
- package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +23 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +3 -3
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +168 -36
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +18 -0
- package/packages/dd-trace/src/encode/agentless-json.js +141 -0
- package/packages/dd-trace/src/exporter.js +2 -0
- package/packages/dd-trace/src/exporters/agent/writer.js +22 -8
- package/packages/dd-trace/src/exporters/agentless/index.js +89 -0
- package/packages/dd-trace/src/exporters/agentless/writer.js +184 -0
- package/packages/dd-trace/src/exporters/common/agents.js +1 -1
- package/packages/dd-trace/src/exporters/common/request.js +4 -4
- package/packages/dd-trace/src/llmobs/constants/writers.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/ai/index.js +5 -3
- package/packages/dd-trace/src/llmobs/sdk.js +34 -5
- package/packages/dd-trace/src/opentelemetry/context_manager.js +19 -46
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +3 -4
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +3 -5
- package/packages/dd-trace/src/opentracing/span.js +6 -4
- package/packages/dd-trace/src/plugins/ci_plugin.js +57 -5
- package/packages/dd-trace/src/plugins/database.js +57 -45
- package/packages/dd-trace/src/plugins/outbound.js +27 -2
- package/packages/dd-trace/src/plugins/tracing.js +39 -4
- package/packages/dd-trace/src/plugins/util/inferred_proxy.js +7 -0
- package/packages/dd-trace/src/plugins/util/test.js +48 -0
- package/packages/dd-trace/src/plugins/util/web.js +8 -7
- package/packages/dd-trace/src/profiling/exporter_cli.js +1 -0
- package/packages/dd-trace/src/propagation-hash/index.js +145 -0
- package/packages/dd-trace/src/proxy.js +4 -0
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
- package/packages/dd-trace/src/startup-log.js +3 -3
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +0 -106
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -741
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +0 -11
- package/packages/dd-trace/src/plugins/util/serverless.js +0 -8
- package/packages/dd-trace/src/scope/noop/scope.js +0 -21
|
@@ -14,12 +14,17 @@ const PROXY_HEADER_PATH = 'x-dd-proxy-path'
|
|
|
14
14
|
const PROXY_HEADER_HTTPMETHOD = 'x-dd-proxy-httpmethod'
|
|
15
15
|
const PROXY_HEADER_DOMAIN = 'x-dd-proxy-domain-name'
|
|
16
16
|
const PROXY_HEADER_STAGE = 'x-dd-proxy-stage'
|
|
17
|
+
const PROXY_HEADER_REGION = 'x-dd-proxy-region'
|
|
17
18
|
|
|
18
19
|
const supportedProxies = {
|
|
19
20
|
'aws-apigateway': {
|
|
20
21
|
spanName: 'aws.apigateway',
|
|
21
22
|
component: 'aws-apigateway',
|
|
22
23
|
},
|
|
24
|
+
'azure-apim': {
|
|
25
|
+
spanName: 'azure.apim',
|
|
26
|
+
component: 'azure-apim',
|
|
27
|
+
},
|
|
23
28
|
}
|
|
24
29
|
|
|
25
30
|
function createInferredProxySpan (headers, childOf, tracer, reqCtx, traceCtx, config, startSpanHelper) {
|
|
@@ -53,6 +58,7 @@ function createInferredProxySpan (headers, childOf, tracer, reqCtx, traceCtx, co
|
|
|
53
58
|
[HTTP_METHOD]: proxyContext.method,
|
|
54
59
|
[HTTP_URL]: proxyContext.domainName + proxyContext.path,
|
|
55
60
|
stage: proxyContext.stage,
|
|
61
|
+
region: proxyContext.region,
|
|
56
62
|
},
|
|
57
63
|
}, traceCtx, config)
|
|
58
64
|
|
|
@@ -91,6 +97,7 @@ function extractInferredProxyContext (headers) {
|
|
|
91
97
|
stage: headers[PROXY_HEADER_STAGE],
|
|
92
98
|
domainName: headers[PROXY_HEADER_DOMAIN],
|
|
93
99
|
proxySystemName: headers[PROXY_HEADER_SYSTEM],
|
|
100
|
+
region: headers[PROXY_HEADER_REGION],
|
|
94
101
|
}
|
|
95
102
|
}
|
|
96
103
|
|
|
@@ -145,6 +145,10 @@ const DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE = '_dd.library_capabilities.tes
|
|
|
145
145
|
const DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE = '_dd.library_capabilities.test_management.disable'
|
|
146
146
|
const DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX = '_dd.library_capabilities.test_management.attempt_to_fix'
|
|
147
147
|
const DD_CAPABILITIES_FAILED_TEST_REPLAY = '_dd.library_capabilities.failed_test_replay'
|
|
148
|
+
|
|
149
|
+
// Library configuration request error tag
|
|
150
|
+
const DD_CI_LIBRARY_CONFIGURATION_ERROR = '_dd.ci.library_configuration_error'
|
|
151
|
+
|
|
148
152
|
const UNSUPPORTED_TIA_FRAMEWORKS = new Set(['playwright', 'vitest'])
|
|
149
153
|
const UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE = new Set(['cucumber', 'mocha'])
|
|
150
154
|
const MINIMUM_FRAMEWORK_VERSION_FOR_EFD = {
|
|
@@ -202,6 +206,22 @@ const TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED = 'test.test_management.attempt_to_f
|
|
|
202
206
|
const POSSIBLE_BASE_BRANCHES = ['main', 'master', 'preprod', 'prod', 'dev', 'development', 'trunk']
|
|
203
207
|
const BASE_LIKE_BRANCH_FILTER = /^(main|master|preprod|prod|dev|development|trunk|release\/.*|hotfix\/.*)$/
|
|
204
208
|
|
|
209
|
+
/**
|
|
210
|
+
* Returns request error tags from a test session span for propagation to child events.
|
|
211
|
+
* @param {{ context: () => { _tags?: Record<string, string> } } | undefined} sessionSpan
|
|
212
|
+
* @returns {Record<string, string>}
|
|
213
|
+
*/
|
|
214
|
+
function getSessionRequestErrorTags (sessionSpan) {
|
|
215
|
+
const tags = sessionSpan?.context()._tags
|
|
216
|
+
if (!tags || typeof tags !== 'object') return {}
|
|
217
|
+
if (tags[DD_CI_LIBRARY_CONFIGURATION_ERROR] === 'true') {
|
|
218
|
+
return {
|
|
219
|
+
[DD_CI_LIBRARY_CONFIGURATION_ERROR]: 'true',
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return {}
|
|
223
|
+
}
|
|
224
|
+
|
|
205
225
|
module.exports = {
|
|
206
226
|
TEST_CODE_OWNERS,
|
|
207
227
|
TEST_SESSION_NAME,
|
|
@@ -278,6 +298,7 @@ module.exports = {
|
|
|
278
298
|
removeInvalidMetadata,
|
|
279
299
|
parseAnnotations,
|
|
280
300
|
getIsFaultyEarlyFlakeDetection,
|
|
301
|
+
getEfdRetryCount,
|
|
281
302
|
TEST_BROWSER_DRIVER,
|
|
282
303
|
TEST_BROWSER_DRIVER_VERSION,
|
|
283
304
|
TEST_BROWSER_NAME,
|
|
@@ -308,6 +329,8 @@ module.exports = {
|
|
|
308
329
|
TEST_MANAGEMENT_ENABLED,
|
|
309
330
|
TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
|
|
310
331
|
getLibraryCapabilitiesTags,
|
|
332
|
+
getSessionRequestErrorTags,
|
|
333
|
+
DD_CI_LIBRARY_CONFIGURATION_ERROR,
|
|
311
334
|
checkShaDiscrepancies,
|
|
312
335
|
getPullRequestDiff,
|
|
313
336
|
getPullRequestBaseBranch,
|
|
@@ -846,6 +869,31 @@ function parseAnnotations (annotations) {
|
|
|
846
869
|
}, {})
|
|
847
870
|
}
|
|
848
871
|
|
|
872
|
+
/**
|
|
873
|
+
* Given a test's first-execution duration (ms) and the slow_test_retries map
|
|
874
|
+
* from the backend, return how many EFD retries to run.
|
|
875
|
+
*
|
|
876
|
+
* Returns 0 when the test is too slow to retry (≥ 5 min).
|
|
877
|
+
*
|
|
878
|
+
* @param {number} durationMs
|
|
879
|
+
* @param {Record<string, number>} slowTestRetries e.g. { '5s': 10, '10s': 5, '30s': 3, '5m': 2 }
|
|
880
|
+
* @returns {number}
|
|
881
|
+
*/
|
|
882
|
+
function getEfdRetryCount (durationMs, slowTestRetries) {
|
|
883
|
+
const thresholds = [
|
|
884
|
+
{ limitMs: 5 * 1000, key: '5s' },
|
|
885
|
+
{ limitMs: 10 * 1000, key: '10s' },
|
|
886
|
+
{ limitMs: 30 * 1000, key: '30s' },
|
|
887
|
+
{ limitMs: 5 * 60 * 1000, key: '5m' },
|
|
888
|
+
]
|
|
889
|
+
for (const { limitMs, key } of thresholds) {
|
|
890
|
+
if (durationMs < limitMs) {
|
|
891
|
+
return slowTestRetries[key] ?? 0
|
|
892
|
+
}
|
|
893
|
+
}
|
|
894
|
+
return 0 // ≥ 5 min — abort
|
|
895
|
+
}
|
|
896
|
+
|
|
849
897
|
function getIsFaultyEarlyFlakeDetection (projectSuites, testsBySuiteName, faultyThresholdPercentage) {
|
|
850
898
|
let newSuites = 0
|
|
851
899
|
for (const suite of projectSuites) {
|
|
@@ -119,7 +119,7 @@ const web = {
|
|
|
119
119
|
context.span.context()._name = name
|
|
120
120
|
span = context.span
|
|
121
121
|
} else {
|
|
122
|
-
span = web.
|
|
122
|
+
span = web.startServerlessSpanWithInferredProxy(tracer, config, name, req, traceCtx)
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
context.tracer = tracer
|
|
@@ -275,7 +275,7 @@ const web = {
|
|
|
275
275
|
return context.middleware.at(-1)
|
|
276
276
|
},
|
|
277
277
|
|
|
278
|
-
|
|
278
|
+
startServerlessSpanWithInferredProxy (tracer, config, name, req, traceCtx) {
|
|
279
279
|
const headers = req.headers
|
|
280
280
|
const reqCtx = contexts.get(req)
|
|
281
281
|
const { storage } = require('../../../../datadog-core')
|
|
@@ -338,12 +338,12 @@ const web = {
|
|
|
338
338
|
}
|
|
339
339
|
},
|
|
340
340
|
|
|
341
|
-
finishSpan (context) {
|
|
341
|
+
finishSpan (context, spanType) {
|
|
342
342
|
const { req, res } = context
|
|
343
343
|
|
|
344
344
|
if (context.finished && !req.stream) return
|
|
345
345
|
|
|
346
|
-
addRequestTags(context,
|
|
346
|
+
addRequestTags(context, spanType)
|
|
347
347
|
addResponseTags(context)
|
|
348
348
|
|
|
349
349
|
context.config.hooks.request(context.span, req, res)
|
|
@@ -353,14 +353,14 @@ const web = {
|
|
|
353
353
|
context.finished = true
|
|
354
354
|
},
|
|
355
355
|
|
|
356
|
-
finishAll (context) {
|
|
356
|
+
finishAll (context, spanType) {
|
|
357
357
|
for (const beforeEnd of context.beforeEnd) {
|
|
358
358
|
beforeEnd()
|
|
359
359
|
}
|
|
360
360
|
|
|
361
361
|
web.finishMiddleware(context)
|
|
362
362
|
|
|
363
|
-
web.finishSpan(context)
|
|
363
|
+
web.finishSpan(context, spanType)
|
|
364
364
|
|
|
365
365
|
finishInferredProxySpan(context)
|
|
366
366
|
},
|
|
@@ -457,12 +457,13 @@ function reactivate (req, fn) {
|
|
|
457
457
|
function addRequestTags (context, spanType) {
|
|
458
458
|
const { req, span, inferredProxySpan, config } = context
|
|
459
459
|
const url = extractURL(req)
|
|
460
|
+
const type = spanType ?? WEB
|
|
460
461
|
|
|
461
462
|
span.addTags({
|
|
462
463
|
[HTTP_URL]: obfuscateQs(config, url),
|
|
463
464
|
[HTTP_METHOD]: req.method,
|
|
464
465
|
[SPAN_KIND]: SERVER,
|
|
465
|
-
[SPAN_TYPE]:
|
|
466
|
+
[SPAN_TYPE]: type,
|
|
466
467
|
[HTTP_USERAGENT]: req.headers['user-agent'],
|
|
467
468
|
})
|
|
468
469
|
|
|
@@ -17,6 +17,7 @@ function exporterFromURL (url) {
|
|
|
17
17
|
if (url.protocol === 'file:') {
|
|
18
18
|
return new FileExporter({ pprofPrefix: fileURLToPath(url) })
|
|
19
19
|
}
|
|
20
|
+
// TODO: Why is DD_INJECTION_ENABLED a comma separated list?
|
|
20
21
|
const injectionEnabled = (getValueFromEnvSources('DD_INJECTION_ENABLED') ?? '').split(',')
|
|
21
22
|
const libraryInjected = injectionEnabled.length > 0
|
|
22
23
|
const profilingEnabled = (getValueFromEnvSources('DD_PROFILING_ENABLED') ?? '').toLowerCase()
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const { fnv64 } = require('../datastreams/fnv')
|
|
4
|
+
const log = require('../log')
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* PropagationHashManager is a singleton that manages the propagation hash computation.
|
|
8
|
+
* The propagation hash is an FNV-1a 64-bit hash combining:
|
|
9
|
+
* - Process tags (entrypoint info, package.json name, etc.)
|
|
10
|
+
* - Container tags hash (received from the Datadog agent)
|
|
11
|
+
*
|
|
12
|
+
* This hash is used to correlate traces with database operations (DBM) and
|
|
13
|
+
* data stream pathways (DSM) for enhanced observability.
|
|
14
|
+
*/
|
|
15
|
+
class PropagationHashManager {
|
|
16
|
+
_containerTagsHash = null
|
|
17
|
+
_cachedHash = null
|
|
18
|
+
_cachedHashString = null
|
|
19
|
+
_cachedHashBase64 = null
|
|
20
|
+
_config = null
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Configure the propagation hash manager with tracer config
|
|
24
|
+
* @param {object} config - Tracer configuration
|
|
25
|
+
*/
|
|
26
|
+
configure (config) {
|
|
27
|
+
this._config = config
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Check if process tags propagation is enabled
|
|
32
|
+
* @returns {boolean}
|
|
33
|
+
*/
|
|
34
|
+
isEnabled () {
|
|
35
|
+
return this._config?.propagateProcessTags?.enabled === true
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Update the container tags hash received from the agent
|
|
40
|
+
* @param {string} hash - Container tags hash from agent response
|
|
41
|
+
*/
|
|
42
|
+
updateContainerTagsHash (hash) {
|
|
43
|
+
if (hash !== this._containerTagsHash) {
|
|
44
|
+
log.debug('Updating container tags hash: %s', hash)
|
|
45
|
+
this._containerTagsHash = hash
|
|
46
|
+
this._invalidateCache()
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Get the propagation hash as a BigInt
|
|
52
|
+
* @returns {bigint | null} The propagation hash or null if disabled/unavailable
|
|
53
|
+
*/
|
|
54
|
+
getHash () {
|
|
55
|
+
if (!this.isEnabled()) {
|
|
56
|
+
return null
|
|
57
|
+
}
|
|
58
|
+
if (this._cachedHash) {
|
|
59
|
+
return this._cachedHash
|
|
60
|
+
}
|
|
61
|
+
this._computeHash()
|
|
62
|
+
return this._cachedHash
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Get the propagation hash as a hexadecimal string
|
|
67
|
+
* @returns {string|null} The propagation hash in hex format or null if disabled/unavailable
|
|
68
|
+
*/
|
|
69
|
+
getHashString () {
|
|
70
|
+
const hash = this.getHash()
|
|
71
|
+
if (!hash) {
|
|
72
|
+
return null
|
|
73
|
+
}
|
|
74
|
+
if (!this._cachedHashString) {
|
|
75
|
+
this._cachedHashString = hash.toString(16)
|
|
76
|
+
}
|
|
77
|
+
return this._cachedHashString
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Get the propagation hash as a base64 string
|
|
82
|
+
* @returns {string|null} The propagation hash in base64 format or null if disabled/unavailable
|
|
83
|
+
*/
|
|
84
|
+
getHashBase64 () {
|
|
85
|
+
const hash = this.getHash()
|
|
86
|
+
if (!hash) {
|
|
87
|
+
return null
|
|
88
|
+
}
|
|
89
|
+
if (!this._cachedHashBase64) {
|
|
90
|
+
// Convert BigInt to 8-byte buffer (64-bit hash)
|
|
91
|
+
const buffer = Buffer.allocUnsafe(8)
|
|
92
|
+
// Write as big-endian 64-bit unsigned integer
|
|
93
|
+
buffer.writeBigUInt64BE(hash, 0)
|
|
94
|
+
this._cachedHashBase64 = buffer.toString('base64')
|
|
95
|
+
}
|
|
96
|
+
return this._cachedHashBase64
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Compute the propagation hash using FNV-1a algorithm
|
|
101
|
+
* @private
|
|
102
|
+
*/
|
|
103
|
+
_computeHash () {
|
|
104
|
+
try {
|
|
105
|
+
const processTags = require('../process-tags')
|
|
106
|
+
|
|
107
|
+
// Combine process tags and container tags hash
|
|
108
|
+
// Process tags are already serialized as a comma-separated string
|
|
109
|
+
const input = processTags.serialized + (this._containerTagsHash || '')
|
|
110
|
+
|
|
111
|
+
if (!input) {
|
|
112
|
+
// If both are empty, don't compute a hash
|
|
113
|
+
this._cachedHash = null
|
|
114
|
+
this._cachedHashString = null
|
|
115
|
+
this._cachedHashBase64 = null
|
|
116
|
+
return
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Compute FNV-1a 64-bit hash
|
|
120
|
+
this._cachedHash = fnv64(input)
|
|
121
|
+
this._cachedHashString = null // Will be computed on demand
|
|
122
|
+
this._cachedHashBase64 = null // Will be computed on demand
|
|
123
|
+
|
|
124
|
+
log.debug('Computed propagation hash from input (length=%s): "%s"', input.length, this._cachedHash.toString(16))
|
|
125
|
+
} catch (e) {
|
|
126
|
+
log.error('Error computing propagation hash', e)
|
|
127
|
+
this._cachedHash = null
|
|
128
|
+
this._cachedHashString = null
|
|
129
|
+
this._cachedHashBase64 = null
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Invalidate the cached hash
|
|
135
|
+
* @private
|
|
136
|
+
*/
|
|
137
|
+
_invalidateCache () {
|
|
138
|
+
this._cachedHash = null
|
|
139
|
+
this._cachedHashString = null
|
|
140
|
+
this._cachedHashBase64 = null
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Export singleton instance
|
|
145
|
+
module.exports = new PropagationHashManager()
|
|
@@ -102,6 +102,10 @@ class Tracer extends NoopProxy {
|
|
|
102
102
|
try {
|
|
103
103
|
const config = getConfig(options) // TODO: support dynamic code config
|
|
104
104
|
|
|
105
|
+
// Configure propagation hash manager for process tags + container tags
|
|
106
|
+
const propagationHash = require('./propagation-hash')
|
|
107
|
+
propagationHash.configure(config)
|
|
108
|
+
|
|
105
109
|
if (config.crashtracking.enabled) {
|
|
106
110
|
require('./crashtracking').start(config)
|
|
107
111
|
}
|
|
@@ -238,7 +238,7 @@ function captureHeapSpace () {
|
|
|
238
238
|
const stats = v8.getHeapSpaceStatistics()
|
|
239
239
|
|
|
240
240
|
for (let i = 0, l = stats.length; i < l; i++) {
|
|
241
|
-
const tags = [`
|
|
241
|
+
const tags = [`heap_space:${stats[i].space_name}`]
|
|
242
242
|
|
|
243
243
|
client.gauge('runtime.node.heap.size.by.space', stats[i].space_size, tags)
|
|
244
244
|
client.gauge('runtime.node.heap.used_size.by.space', stats[i].space_used_size, tags)
|
|
@@ -4,7 +4,7 @@ const os = require('os')
|
|
|
4
4
|
const { inspect } = require('util')
|
|
5
5
|
const tracerVersion = require('../../../package.json').version
|
|
6
6
|
const { getAgentUrl } = require('./agent/url')
|
|
7
|
-
const {
|
|
7
|
+
const { warn } = require('./log/writer')
|
|
8
8
|
|
|
9
9
|
const errors = {}
|
|
10
10
|
let config
|
|
@@ -29,7 +29,7 @@ function startupLog (agentError) {
|
|
|
29
29
|
out.agent_error = agentError.message
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
warn('DATADOG TRACER CONFIGURATION - ' + out)
|
|
33
33
|
if (agentError) {
|
|
34
34
|
warn('DATADOG TRACER DIAGNOSTIC - Agent Error: ' + agentError.message)
|
|
35
35
|
errors.agentError = {
|
|
@@ -74,7 +74,7 @@ function tracerInfo () {
|
|
|
74
74
|
runtime_metrics_enabled: !!config.runtimeMetrics,
|
|
75
75
|
profiling_enabled: config.profiling?.enabled === 'true' || config.profiling?.enabled === 'auto',
|
|
76
76
|
integrations_loaded: Object.keys(pluginManager._pluginsByName),
|
|
77
|
-
appsec_enabled:
|
|
77
|
+
appsec_enabled: config.appsec.enabled,
|
|
78
78
|
data_streams_enabled: !!config.dsmEnabled,
|
|
79
79
|
}
|
|
80
80
|
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"module": {
|
|
4
|
-
"name": "bullmq",
|
|
5
|
-
"versionRange": ">=5.66.0",
|
|
6
|
-
"filePath": "dist/cjs/classes/queue.js"
|
|
7
|
-
},
|
|
8
|
-
"functionQuery": {
|
|
9
|
-
"methodName": "add",
|
|
10
|
-
"className": "Queue",
|
|
11
|
-
"kind": "Async"
|
|
12
|
-
},
|
|
13
|
-
"channelName": "Queue_add"
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
"module": {
|
|
17
|
-
"name": "bullmq",
|
|
18
|
-
"versionRange": ">=5.66.0",
|
|
19
|
-
"filePath": "dist/cjs/classes/queue.js"
|
|
20
|
-
},
|
|
21
|
-
"functionQuery": {
|
|
22
|
-
"methodName": "addBulk",
|
|
23
|
-
"className": "Queue",
|
|
24
|
-
"kind": "Async"
|
|
25
|
-
},
|
|
26
|
-
"channelName": "Queue_addBulk"
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
"module": {
|
|
30
|
-
"name": "bullmq",
|
|
31
|
-
"versionRange": ">=5.66.0",
|
|
32
|
-
"filePath": "dist/cjs/classes/worker.js"
|
|
33
|
-
},
|
|
34
|
-
"functionQuery": {
|
|
35
|
-
"methodName": "callProcessJob",
|
|
36
|
-
"className": "Worker",
|
|
37
|
-
"kind": "Async"
|
|
38
|
-
},
|
|
39
|
-
"channelName": "Worker_callProcessJob"
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
"module": {
|
|
43
|
-
"name": "bullmq",
|
|
44
|
-
"versionRange": ">=5.66.0",
|
|
45
|
-
"filePath": "dist/cjs/classes/flow-producer.js"
|
|
46
|
-
},
|
|
47
|
-
"functionQuery": {
|
|
48
|
-
"methodName": "add",
|
|
49
|
-
"className": "FlowProducer",
|
|
50
|
-
"kind": "Async"
|
|
51
|
-
},
|
|
52
|
-
"channelName": "FlowProducer_add"
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"module": {
|
|
56
|
-
"name": "bullmq",
|
|
57
|
-
"versionRange": ">=5.66.0",
|
|
58
|
-
"filePath": "dist/esm/classes/queue.js"
|
|
59
|
-
},
|
|
60
|
-
"functionQuery": {
|
|
61
|
-
"methodName": "add",
|
|
62
|
-
"className": "Queue",
|
|
63
|
-
"kind": "Async"
|
|
64
|
-
},
|
|
65
|
-
"channelName": "Queue_add"
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"module": {
|
|
69
|
-
"name": "bullmq",
|
|
70
|
-
"versionRange": ">=5.66.0",
|
|
71
|
-
"filePath": "dist/esm/classes/queue.js"
|
|
72
|
-
},
|
|
73
|
-
"functionQuery": {
|
|
74
|
-
"methodName": "addBulk",
|
|
75
|
-
"className": "Queue",
|
|
76
|
-
"kind": "Async"
|
|
77
|
-
},
|
|
78
|
-
"channelName": "Queue_addBulk"
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
"module": {
|
|
82
|
-
"name": "bullmq",
|
|
83
|
-
"versionRange": ">=5.66.0",
|
|
84
|
-
"filePath": "dist/esm/classes/worker.js"
|
|
85
|
-
},
|
|
86
|
-
"functionQuery": {
|
|
87
|
-
"methodName": "callProcessJob",
|
|
88
|
-
"className": "Worker",
|
|
89
|
-
"kind": "Async"
|
|
90
|
-
},
|
|
91
|
-
"channelName": "Worker_callProcessJob"
|
|
92
|
-
},
|
|
93
|
-
{
|
|
94
|
-
"module": {
|
|
95
|
-
"name": "bullmq",
|
|
96
|
-
"versionRange": ">=5.66.0",
|
|
97
|
-
"filePath": "dist/esm/classes/flow-producer.js"
|
|
98
|
-
},
|
|
99
|
-
"functionQuery": {
|
|
100
|
-
"methodName": "add",
|
|
101
|
-
"className": "FlowProducer",
|
|
102
|
-
"kind": "Async"
|
|
103
|
-
},
|
|
104
|
-
"channelName": "FlowProducer_add"
|
|
105
|
-
}
|
|
106
|
-
]
|