dd-trace 4.51.1 → 4.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 +8 -2
- package/ci/init.js +16 -0
- package/index.d.ts +31 -13
- package/init.js +4 -66
- package/initialize.mjs +13 -10
- package/loader-hook.mjs +4 -0
- package/package.json +16 -11
- package/packages/datadog-core/src/storage.js +39 -2
- package/packages/datadog-instrumentations/src/aerospike.js +1 -1
- package/packages/datadog-instrumentations/src/azure-functions.js +1 -1
- package/packages/datadog-instrumentations/src/cucumber.js +29 -3
- package/packages/datadog-instrumentations/src/express.js +38 -4
- package/packages/datadog-instrumentations/src/helpers/bundler-register.js +3 -3
- package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
- package/packages/datadog-instrumentations/src/helpers/register.js +3 -4
- package/packages/datadog-instrumentations/src/http/client.js +1 -1
- package/packages/datadog-instrumentations/src/jest.js +27 -8
- package/packages/datadog-instrumentations/src/mocha/utils.js +2 -1
- package/packages/datadog-instrumentations/src/mysql2.js +13 -8
- package/packages/datadog-instrumentations/src/next.js +7 -4
- package/packages/datadog-instrumentations/src/passport-http.js +2 -14
- package/packages/datadog-instrumentations/src/passport-local.js +2 -14
- package/packages/datadog-instrumentations/src/passport-utils.js +43 -19
- package/packages/datadog-instrumentations/src/pg.js +6 -6
- package/packages/datadog-instrumentations/src/playwright.js +17 -4
- package/packages/datadog-instrumentations/src/router.js +97 -1
- package/packages/datadog-instrumentations/src/sequelize.js +9 -4
- package/packages/datadog-instrumentations/src/url.js +4 -0
- package/packages/datadog-instrumentations/src/vitest.js +27 -2
- package/packages/datadog-plugin-avsc/src/schema_iterator.js +8 -3
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +154 -0
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/util.js +92 -0
- package/packages/datadog-plugin-azure-functions/src/index.js +1 -1
- package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -1
- package/packages/datadog-plugin-cucumber/src/index.js +39 -4
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +3 -3
- package/packages/datadog-plugin-grpc/src/client.js +2 -2
- package/packages/datadog-plugin-grpc/src/util.js +1 -1
- package/packages/datadog-plugin-jest/src/index.js +39 -4
- package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +1 -1
- package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +1 -1
- package/packages/datadog-plugin-mocha/src/index.js +36 -2
- package/packages/datadog-plugin-oracledb/src/index.js +1 -1
- package/packages/datadog-plugin-vitest/src/index.js +34 -2
- package/packages/datadog-shimmer/src/shimmer.js +8 -4
- package/packages/dd-trace/src/appsec/addresses.js +3 -0
- package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
- package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
- package/packages/dd-trace/src/appsec/blocking.js +1 -1
- package/packages/dd-trace/src/appsec/channels.js +1 -0
- package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +4 -0
- package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +2 -2
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +10 -3
- package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +4 -0
- package/packages/dd-trace/src/appsec/iast/analyzers/template-injection-analyzer.js +4 -0
- package/packages/dd-trace/src/appsec/iast/iast-plugin.js +8 -21
- package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +3 -3
- package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +2 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +64 -3
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -8
- package/packages/dd-trace/src/appsec/iast/taint-tracking/source-types.js +2 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +7 -11
- package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +2 -3
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +3 -3
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +32 -37
- package/packages/dd-trace/src/appsec/index.js +18 -13
- package/packages/dd-trace/src/appsec/rasp/fs-plugin.js +2 -2
- package/packages/dd-trace/src/appsec/rasp/utils.js +1 -1
- package/packages/dd-trace/src/appsec/remote_config/capabilities.js +1 -0
- package/packages/dd-trace/src/appsec/remote_config/index.js +25 -1
- package/packages/dd-trace/src/appsec/remote_config/manager.js +2 -2
- package/packages/dd-trace/src/appsec/reporter.js +3 -1
- package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
- package/packages/dd-trace/src/appsec/sdk/track_event.js +37 -24
- package/packages/dd-trace/src/appsec/sdk/user_blocking.js +4 -4
- package/packages/dd-trace/src/appsec/telemetry.js +10 -0
- package/packages/dd-trace/src/appsec/user_tracking.js +168 -0
- package/packages/dd-trace/src/appsec/waf/index.js +2 -2
- package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -3
- package/packages/dd-trace/src/appsec/waf/waf_manager.js +1 -1
- package/packages/dd-trace/src/azure_metadata.js +4 -4
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +5 -4
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +39 -3
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +29 -9
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -2
- package/packages/dd-trace/src/config.js +24 -32
- package/packages/dd-trace/src/constants.js +1 -0
- package/packages/dd-trace/src/crashtracking/crashtracker.js +3 -2
- package/packages/dd-trace/src/datastreams/processor.js +4 -6
- package/packages/dd-trace/src/datastreams/writer.js +6 -5
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +80 -0
- package/packages/dd-trace/src/debugger/devtools_client/config.js +3 -1
- package/packages/dd-trace/src/debugger/devtools_client/defaults.js +6 -0
- package/packages/dd-trace/src/debugger/devtools_client/index.js +63 -8
- package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +10 -67
- package/packages/dd-trace/src/debugger/devtools_client/send.js +2 -1
- package/packages/dd-trace/src/debugger/devtools_client/state.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/status.js +4 -4
- package/packages/dd-trace/src/debugger/index.js +14 -10
- package/packages/dd-trace/src/dogstatsd.js +2 -2
- package/packages/dd-trace/src/encode/0.4.js +23 -78
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +0 -32
- package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -2
- package/packages/dd-trace/src/encode/span-stats.js +0 -30
- package/packages/dd-trace/src/exporters/agent/writer.js +3 -3
- package/packages/dd-trace/src/exporters/common/request.js +1 -1
- package/packages/dd-trace/src/exporters/span-stats/writer.js +1 -1
- package/packages/dd-trace/src/flare/index.js +1 -1
- package/packages/dd-trace/src/guardrails/index.js +64 -0
- package/packages/dd-trace/src/guardrails/log.js +32 -0
- package/packages/dd-trace/src/guardrails/telemetry.js +78 -0
- package/packages/dd-trace/src/guardrails/util.js +10 -0
- package/packages/dd-trace/src/lambda/runtime/ritm.js +2 -2
- package/packages/dd-trace/src/llmobs/storage.js +2 -3
- package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
- package/packages/dd-trace/src/{encode → msgpack}/chunk.js +8 -5
- package/packages/dd-trace/src/msgpack/encoder.js +309 -0
- package/packages/dd-trace/src/msgpack/index.js +6 -0
- package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +12 -9
- package/packages/dd-trace/src/opentracing/span.js +1 -1
- package/packages/dd-trace/src/opentracing/tracer.js +2 -2
- package/packages/dd-trace/src/plugin_manager.js +4 -2
- package/packages/dd-trace/src/plugins/ci_plugin.js +47 -4
- package/packages/dd-trace/src/plugins/plugin.js +1 -1
- package/packages/dd-trace/src/plugins/tracing.js +1 -1
- package/packages/dd-trace/src/plugins/util/git.js +7 -7
- package/packages/dd-trace/src/plugins/util/test.js +36 -3
- package/packages/dd-trace/src/plugins/util/web.js +2 -2
- package/packages/dd-trace/src/profiling/config.js +3 -0
- package/packages/dd-trace/src/profiling/exporters/agent.js +9 -68
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +76 -0
- package/packages/dd-trace/src/profiling/exporters/file.js +8 -4
- package/packages/dd-trace/src/profiling/profiler.js +62 -10
- package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +22 -12
- package/packages/dd-trace/src/profiling/profilers/events.js +47 -8
- package/packages/dd-trace/src/profiling/profilers/wall.js +2 -17
- package/packages/dd-trace/src/profiling/webspan-utils.js +23 -0
- package/packages/dd-trace/src/proxy.js +7 -2
- package/packages/dd-trace/src/runtime_metrics.js +107 -4
- package/packages/dd-trace/src/serverless.js +1 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/serverless.js +1 -1
- package/packages/dd-trace/src/service-naming/schemas/v1/serverless.js +1 -1
- package/packages/dd-trace/src/span_processor.js +10 -10
- package/packages/dd-trace/src/tagger.js +1 -1
- package/packages/dd-trace/src/telemetry/index.js +1 -0
- package/packages/dd-trace/src/telemetry/logs/index.js +2 -2
- package/packages/dd-trace/src/telemetry/logs/log-collector.js +10 -2
- package/packages/dd-trace/src/telemetry/send-data.js +2 -2
- package/packages/dd-trace/src/util.js +5 -16
- package/packages/datadog-instrumentations/src/qs.js +0 -24
- package/packages/dd-trace/src/appsec/iast/iast-log.js +0 -86
- package/packages/dd-trace/src/appsec/passport.js +0 -110
- package/packages/dd-trace/src/telemetry/init-telemetry.js +0 -75
|
@@ -10,6 +10,7 @@ const DEFAULT_MIN_SIZE = 2 * 1024 * 1024 // 2MB
|
|
|
10
10
|
class Chunk {
|
|
11
11
|
constructor (minSize = DEFAULT_MIN_SIZE) {
|
|
12
12
|
this.buffer = Buffer.allocUnsafe(minSize)
|
|
13
|
+
this.view = new DataView(this.buffer.buffer)
|
|
13
14
|
this.length = 0
|
|
14
15
|
this._minSize = minSize
|
|
15
16
|
}
|
|
@@ -20,11 +21,9 @@ class Chunk {
|
|
|
20
21
|
|
|
21
22
|
if (length < 0x20) { // fixstr
|
|
22
23
|
this.reserve(length + 1)
|
|
23
|
-
this.length += 1
|
|
24
24
|
this.buffer[offset] = length | 0xa0
|
|
25
25
|
} else if (length < 0x100000000) { // str 32
|
|
26
26
|
this.reserve(length + 5)
|
|
27
|
-
this.length += 5
|
|
28
27
|
this.buffer[offset] = 0xdb
|
|
29
28
|
this.buffer[offset + 1] = length >> 24
|
|
30
29
|
this.buffer[offset + 2] = length >> 16
|
|
@@ -32,7 +31,7 @@ class Chunk {
|
|
|
32
31
|
this.buffer[offset + 4] = length
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
this.
|
|
34
|
+
this.buffer.utf8Write(value, this.length - length, length)
|
|
36
35
|
|
|
37
36
|
return this.length - offset
|
|
38
37
|
}
|
|
@@ -42,22 +41,26 @@ class Chunk {
|
|
|
42
41
|
}
|
|
43
42
|
|
|
44
43
|
set (array) {
|
|
44
|
+
const length = this.length
|
|
45
|
+
|
|
45
46
|
this.reserve(array.length)
|
|
46
47
|
|
|
47
|
-
this.buffer.set(array,
|
|
48
|
-
this.length += array.length
|
|
48
|
+
this.buffer.set(array, length)
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
reserve (size) {
|
|
52
52
|
if (this.length + size > this.buffer.length) {
|
|
53
53
|
this._resize(this._minSize * Math.ceil((this.length + size) / this._minSize))
|
|
54
54
|
}
|
|
55
|
+
|
|
56
|
+
this.length += size
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
_resize (size) {
|
|
58
60
|
const oldBuffer = this.buffer
|
|
59
61
|
|
|
60
62
|
this.buffer = Buffer.allocUnsafe(size)
|
|
63
|
+
this.view = new DataView(this.buffer.buffer)
|
|
61
64
|
|
|
62
65
|
oldBuffer.copy(this.buffer, 0, 0, this.length)
|
|
63
66
|
}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const Chunk = require('./chunk')
|
|
4
|
+
|
|
5
|
+
class MsgpackEncoder {
|
|
6
|
+
encode (value) {
|
|
7
|
+
const bytes = new Chunk()
|
|
8
|
+
|
|
9
|
+
this.encodeValue(bytes, value)
|
|
10
|
+
|
|
11
|
+
return bytes.buffer.subarray(0, bytes.length)
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
encodeValue (bytes, value) {
|
|
15
|
+
switch (typeof value) {
|
|
16
|
+
case 'bigint':
|
|
17
|
+
this.encodeBigInt(bytes, value)
|
|
18
|
+
break
|
|
19
|
+
case 'boolean':
|
|
20
|
+
this.encodeBoolean(bytes, value)
|
|
21
|
+
break
|
|
22
|
+
case 'number':
|
|
23
|
+
this.encodeNumber(bytes, value)
|
|
24
|
+
break
|
|
25
|
+
case 'object':
|
|
26
|
+
if (value === null) {
|
|
27
|
+
this.encodeNull(bytes, value)
|
|
28
|
+
} else if (Array.isArray(value)) {
|
|
29
|
+
this.encodeArray(bytes, value)
|
|
30
|
+
} else if (Buffer.isBuffer(value) || ArrayBuffer.isView(value)) {
|
|
31
|
+
this.encodeBin(bytes, value)
|
|
32
|
+
} else {
|
|
33
|
+
this.encodeMap(bytes, value)
|
|
34
|
+
}
|
|
35
|
+
break
|
|
36
|
+
case 'string':
|
|
37
|
+
this.encodeString(bytes, value)
|
|
38
|
+
break
|
|
39
|
+
case 'symbol':
|
|
40
|
+
this.encodeString(bytes, value.toString())
|
|
41
|
+
break
|
|
42
|
+
default: // function, symbol, undefined
|
|
43
|
+
this.encodeNull(bytes, value)
|
|
44
|
+
break
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
encodeNull (bytes) {
|
|
49
|
+
const offset = bytes.length
|
|
50
|
+
|
|
51
|
+
bytes.reserve(1)
|
|
52
|
+
bytes.buffer[offset] = 0xc0
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
encodeBoolean (bytes, value) {
|
|
56
|
+
const offset = bytes.length
|
|
57
|
+
|
|
58
|
+
bytes.reserve(1)
|
|
59
|
+
bytes.buffer[offset] = value ? 0xc3 : 0xc2
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
encodeString (bytes, value) {
|
|
63
|
+
bytes.write(value)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
encodeFixArray (bytes, size = 0) {
|
|
67
|
+
const offset = bytes.length
|
|
68
|
+
|
|
69
|
+
bytes.reserve(1)
|
|
70
|
+
bytes.buffer[offset] = 0x90 + size
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
encodeArrayPrefix (bytes, value) {
|
|
74
|
+
const length = value.length
|
|
75
|
+
const offset = bytes.length
|
|
76
|
+
|
|
77
|
+
bytes.reserve(5)
|
|
78
|
+
bytes.buffer[offset] = 0xdd
|
|
79
|
+
bytes.buffer[offset + 1] = length >> 24
|
|
80
|
+
bytes.buffer[offset + 2] = length >> 16
|
|
81
|
+
bytes.buffer[offset + 3] = length >> 8
|
|
82
|
+
bytes.buffer[offset + 4] = length
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
encodeArray (bytes, value) {
|
|
86
|
+
if (value.length < 16) {
|
|
87
|
+
this.encodeFixArray(bytes, value.length)
|
|
88
|
+
} else {
|
|
89
|
+
this.encodeArrayPrefix(bytes, value)
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
for (const item of value) {
|
|
93
|
+
this.encodeValue(bytes, item)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
encodeFixMap (bytes, size = 0) {
|
|
98
|
+
const offset = bytes.length
|
|
99
|
+
|
|
100
|
+
bytes.reserve(1)
|
|
101
|
+
bytes.buffer[offset] = 0x80 + size
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
encodeMapPrefix (bytes, keysLength) {
|
|
105
|
+
const offset = bytes.length
|
|
106
|
+
|
|
107
|
+
bytes.reserve(5)
|
|
108
|
+
bytes.buffer[offset] = 0xdf
|
|
109
|
+
bytes.buffer[offset + 1] = keysLength >> 24
|
|
110
|
+
bytes.buffer[offset + 2] = keysLength >> 16
|
|
111
|
+
bytes.buffer[offset + 3] = keysLength >> 8
|
|
112
|
+
bytes.buffer[offset + 4] = keysLength
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
encodeByte (bytes, value) {
|
|
116
|
+
bytes.reserve(1)
|
|
117
|
+
bytes.buffer[bytes.length - 1] = value
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
encodeBin (bytes, value) {
|
|
121
|
+
const offset = bytes.length
|
|
122
|
+
|
|
123
|
+
if (value.byteLength < 256) {
|
|
124
|
+
bytes.reserve(2)
|
|
125
|
+
bytes.buffer[offset] = 0xc4
|
|
126
|
+
bytes.buffer[offset + 1] = value.byteLength
|
|
127
|
+
} else if (value.byteLength < 65536) {
|
|
128
|
+
bytes.reserve(3)
|
|
129
|
+
bytes.buffer[offset] = 0xc5
|
|
130
|
+
bytes.buffer[offset + 1] = value.byteLength >> 8
|
|
131
|
+
bytes.buffer[offset + 2] = value.byteLength
|
|
132
|
+
} else {
|
|
133
|
+
bytes.reserve(5)
|
|
134
|
+
bytes.buffer[offset] = 0xc6
|
|
135
|
+
bytes.buffer[offset + 1] = value.byteLength >> 24
|
|
136
|
+
bytes.buffer[offset + 2] = value.byteLength >> 16
|
|
137
|
+
bytes.buffer[offset + 3] = value.byteLength >> 8
|
|
138
|
+
bytes.buffer[offset + 4] = value.byteLength
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
bytes.set(value)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
encodeInteger (bytes, value) {
|
|
145
|
+
const offset = bytes.length
|
|
146
|
+
|
|
147
|
+
bytes.reserve(5)
|
|
148
|
+
bytes.buffer[offset] = 0xce
|
|
149
|
+
bytes.buffer[offset + 1] = value >> 24
|
|
150
|
+
bytes.buffer[offset + 2] = value >> 16
|
|
151
|
+
bytes.buffer[offset + 3] = value >> 8
|
|
152
|
+
bytes.buffer[offset + 4] = value
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
encodeShort (bytes, value) {
|
|
156
|
+
const offset = bytes.length
|
|
157
|
+
|
|
158
|
+
bytes.reserve(3)
|
|
159
|
+
bytes.buffer[offset] = 0xcd
|
|
160
|
+
bytes.buffer[offset + 1] = value >> 8
|
|
161
|
+
bytes.buffer[offset + 2] = value
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
encodeLong (bytes, value) {
|
|
165
|
+
const offset = bytes.length
|
|
166
|
+
const hi = (value / Math.pow(2, 32)) >> 0
|
|
167
|
+
const lo = value >>> 0
|
|
168
|
+
|
|
169
|
+
bytes.reserve(9)
|
|
170
|
+
bytes.buffer[offset] = 0xcf
|
|
171
|
+
bytes.buffer[offset + 1] = hi >> 24
|
|
172
|
+
bytes.buffer[offset + 2] = hi >> 16
|
|
173
|
+
bytes.buffer[offset + 3] = hi >> 8
|
|
174
|
+
bytes.buffer[offset + 4] = hi
|
|
175
|
+
bytes.buffer[offset + 5] = lo >> 24
|
|
176
|
+
bytes.buffer[offset + 6] = lo >> 16
|
|
177
|
+
bytes.buffer[offset + 7] = lo >> 8
|
|
178
|
+
bytes.buffer[offset + 8] = lo
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
encodeNumber (bytes, value) {
|
|
182
|
+
if (Number.isNaN(value)) {
|
|
183
|
+
value = 0
|
|
184
|
+
}
|
|
185
|
+
if (Number.isInteger(value)) {
|
|
186
|
+
if (value >= 0) {
|
|
187
|
+
this.encodeUnsigned(bytes, value)
|
|
188
|
+
} else {
|
|
189
|
+
this.encodeSigned(bytes, value)
|
|
190
|
+
}
|
|
191
|
+
} else {
|
|
192
|
+
this.encodeFloat(bytes, value)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
encodeSigned (bytes, value) {
|
|
197
|
+
const offset = bytes.length
|
|
198
|
+
|
|
199
|
+
if (value >= -0x20) {
|
|
200
|
+
bytes.reserve(1)
|
|
201
|
+
bytes.buffer[offset] = value
|
|
202
|
+
} else if (value >= -0x80) {
|
|
203
|
+
bytes.reserve(2)
|
|
204
|
+
bytes.buffer[offset] = 0xd0
|
|
205
|
+
bytes.buffer[offset + 1] = value
|
|
206
|
+
} else if (value >= -0x8000) {
|
|
207
|
+
bytes.reserve(3)
|
|
208
|
+
bytes.buffer[offset] = 0xd1
|
|
209
|
+
bytes.buffer[offset + 1] = value >> 8
|
|
210
|
+
bytes.buffer[offset + 2] = value
|
|
211
|
+
} else if (value >= -0x80000000) {
|
|
212
|
+
bytes.reserve(5)
|
|
213
|
+
bytes.buffer[offset] = 0xd2
|
|
214
|
+
bytes.buffer[offset + 1] = value >> 24
|
|
215
|
+
bytes.buffer[offset + 2] = value >> 16
|
|
216
|
+
bytes.buffer[offset + 3] = value >> 8
|
|
217
|
+
bytes.buffer[offset + 4] = value
|
|
218
|
+
} else {
|
|
219
|
+
const hi = Math.floor(value / Math.pow(2, 32))
|
|
220
|
+
const lo = value >>> 0
|
|
221
|
+
|
|
222
|
+
bytes.reserve(9)
|
|
223
|
+
bytes.buffer[offset] = 0xd3
|
|
224
|
+
bytes.buffer[offset + 1] = hi >> 24
|
|
225
|
+
bytes.buffer[offset + 2] = hi >> 16
|
|
226
|
+
bytes.buffer[offset + 3] = hi >> 8
|
|
227
|
+
bytes.buffer[offset + 4] = hi
|
|
228
|
+
bytes.buffer[offset + 5] = lo >> 24
|
|
229
|
+
bytes.buffer[offset + 6] = lo >> 16
|
|
230
|
+
bytes.buffer[offset + 7] = lo >> 8
|
|
231
|
+
bytes.buffer[offset + 8] = lo
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
encodeUnsigned (bytes, value) {
|
|
236
|
+
const offset = bytes.length
|
|
237
|
+
|
|
238
|
+
if (value <= 0x7f) {
|
|
239
|
+
bytes.reserve(1)
|
|
240
|
+
bytes.buffer[offset] = value
|
|
241
|
+
} else if (value <= 0xff) {
|
|
242
|
+
bytes.reserve(2)
|
|
243
|
+
bytes.buffer[offset] = 0xcc
|
|
244
|
+
bytes.buffer[offset + 1] = value
|
|
245
|
+
} else if (value <= 0xffff) {
|
|
246
|
+
bytes.reserve(3)
|
|
247
|
+
bytes.buffer[offset] = 0xcd
|
|
248
|
+
bytes.buffer[offset + 1] = value >> 8
|
|
249
|
+
bytes.buffer[offset + 2] = value
|
|
250
|
+
} else if (value <= 0xffffffff) {
|
|
251
|
+
bytes.reserve(5)
|
|
252
|
+
bytes.buffer[offset] = 0xce
|
|
253
|
+
bytes.buffer[offset + 1] = value >> 24
|
|
254
|
+
bytes.buffer[offset + 2] = value >> 16
|
|
255
|
+
bytes.buffer[offset + 3] = value >> 8
|
|
256
|
+
bytes.buffer[offset + 4] = value
|
|
257
|
+
} else {
|
|
258
|
+
const hi = (value / Math.pow(2, 32)) >> 0
|
|
259
|
+
const lo = value >>> 0
|
|
260
|
+
|
|
261
|
+
bytes.reserve(9)
|
|
262
|
+
bytes.buffer[offset] = 0xcf
|
|
263
|
+
bytes.buffer[offset + 1] = hi >> 24
|
|
264
|
+
bytes.buffer[offset + 2] = hi >> 16
|
|
265
|
+
bytes.buffer[offset + 3] = hi >> 8
|
|
266
|
+
bytes.buffer[offset + 4] = hi
|
|
267
|
+
bytes.buffer[offset + 5] = lo >> 24
|
|
268
|
+
bytes.buffer[offset + 6] = lo >> 16
|
|
269
|
+
bytes.buffer[offset + 7] = lo >> 8
|
|
270
|
+
bytes.buffer[offset + 8] = lo
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// TODO: Support BigInt larger than 64bit.
|
|
275
|
+
encodeBigInt (bytes, value) {
|
|
276
|
+
const offset = bytes.length
|
|
277
|
+
|
|
278
|
+
bytes.reserve(9)
|
|
279
|
+
|
|
280
|
+
if (value >= 0n) {
|
|
281
|
+
bytes.buffer[offset] = 0xcf
|
|
282
|
+
bytes.view.setBigUint64(offset + 1, value)
|
|
283
|
+
} else {
|
|
284
|
+
bytes.buffer[offset] = 0xd3
|
|
285
|
+
bytes.view.setBigInt64(offset + 1, value)
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
encodeMap (bytes, value) {
|
|
290
|
+
const keys = Object.keys(value)
|
|
291
|
+
|
|
292
|
+
this.encodeMapPrefix(bytes, keys.length)
|
|
293
|
+
|
|
294
|
+
for (const key of keys) {
|
|
295
|
+
this.encodeValue(bytes, key)
|
|
296
|
+
this.encodeValue(bytes, value[key])
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
encodeFloat (bytes, value) {
|
|
301
|
+
const offset = bytes.length
|
|
302
|
+
|
|
303
|
+
bytes.reserve(9)
|
|
304
|
+
bytes.buffer[offset] = 0xcb
|
|
305
|
+
bytes.view.setFloat64(offset + 1, value)
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
module.exports = { MsgpackEncoder }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const {
|
|
3
|
+
const { storage } = require('../../../datadog-core')
|
|
4
4
|
const { trace, ROOT_CONTEXT } = require('@opentelemetry/api')
|
|
5
5
|
const DataDogSpanContext = require('../opentracing/span_context')
|
|
6
6
|
|
|
@@ -9,7 +9,7 @@ const tracer = require('../../')
|
|
|
9
9
|
|
|
10
10
|
class ContextManager {
|
|
11
11
|
constructor () {
|
|
12
|
-
this._store =
|
|
12
|
+
this._store = storage('opentelemetry')
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
active () {
|
|
@@ -300,14 +300,17 @@ class TextMapPropagator {
|
|
|
300
300
|
case 'tracecontext':
|
|
301
301
|
extractedContext = this._extractTraceparentContext(carrier)
|
|
302
302
|
break
|
|
303
|
-
case 'b3' && this
|
|
304
|
-
._config
|
|
305
|
-
.tracePropagationStyle
|
|
306
|
-
.otelPropagators: // TODO: should match "b3 single header" in next major
|
|
307
303
|
case 'b3 single header': // TODO: delete in major after singular "b3"
|
|
308
304
|
extractedContext = this._extractB3SingleContext(carrier)
|
|
309
305
|
break
|
|
310
306
|
case 'b3':
|
|
307
|
+
if (this._config.tracePropagationStyle.otelPropagators) {
|
|
308
|
+
// TODO: should match "b3 single header" in next major
|
|
309
|
+
extractedContext = this._extractB3SingleContext(carrier)
|
|
310
|
+
} else {
|
|
311
|
+
extractedContext = this._extractB3MultiContext(carrier)
|
|
312
|
+
}
|
|
313
|
+
break
|
|
311
314
|
case 'b3multi':
|
|
312
315
|
extractedContext = this._extractB3MultiContext(carrier)
|
|
313
316
|
break
|
|
@@ -339,11 +342,11 @@ class TextMapPropagator {
|
|
|
339
342
|
context._links.push(link)
|
|
340
343
|
}
|
|
341
344
|
}
|
|
345
|
+
}
|
|
342
346
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
}
|
|
347
|
+
if (this._hasPropagationStyle('extract', 'baggage') && carrier.baggage) {
|
|
348
|
+
context = context || new DatadogSpanContext()
|
|
349
|
+
this._extractBaggageItems(carrier, context)
|
|
347
350
|
}
|
|
348
351
|
|
|
349
352
|
return context || this._extractSqsdContext(carrier)
|
|
@@ -496,7 +499,7 @@ class TextMapPropagator {
|
|
|
496
499
|
}
|
|
497
500
|
|
|
498
501
|
_extractGenericContext (carrier, traceKey, spanKey, radix) {
|
|
499
|
-
if (carrier[traceKey] && carrier[spanKey]) {
|
|
502
|
+
if (carrier && carrier[traceKey] && carrier[spanKey]) {
|
|
500
503
|
if (invalidSegment.test(carrier[traceKey])) return null
|
|
501
504
|
|
|
502
505
|
return new DatadogSpanContext({
|
|
@@ -91,7 +91,7 @@ class DatadogTracer {
|
|
|
91
91
|
}
|
|
92
92
|
this._propagators[format].inject(context, carrier)
|
|
93
93
|
} catch (e) {
|
|
94
|
-
log.error(e)
|
|
94
|
+
log.error('Error injecting trace', e)
|
|
95
95
|
runtimeMetrics.increment('datadog.tracer.node.inject.errors', true)
|
|
96
96
|
}
|
|
97
97
|
}
|
|
@@ -100,7 +100,7 @@ class DatadogTracer {
|
|
|
100
100
|
try {
|
|
101
101
|
return this._propagators[format].extract(carrier)
|
|
102
102
|
} catch (e) {
|
|
103
|
-
log.error(e)
|
|
103
|
+
log.error('Error extracting trace', e)
|
|
104
104
|
runtimeMetrics.increment('datadog.tracer.node.extract.errors', true)
|
|
105
105
|
return null
|
|
106
106
|
}
|
|
@@ -138,7 +138,8 @@ module.exports = class PluginManager {
|
|
|
138
138
|
clientIpEnabled,
|
|
139
139
|
memcachedCommandEnabled,
|
|
140
140
|
ciVisibilityTestSessionName,
|
|
141
|
-
ciVisAgentlessLogSubmissionEnabled
|
|
141
|
+
ciVisAgentlessLogSubmissionEnabled,
|
|
142
|
+
isTestDynamicInstrumentationEnabled
|
|
142
143
|
} = this._tracerConfig
|
|
143
144
|
|
|
144
145
|
const sharedConfig = {
|
|
@@ -149,7 +150,8 @@ module.exports = class PluginManager {
|
|
|
149
150
|
url,
|
|
150
151
|
headers: headerTags || [],
|
|
151
152
|
ciVisibilityTestSessionName,
|
|
152
|
-
ciVisAgentlessLogSubmissionEnabled
|
|
153
|
+
ciVisAgentlessLogSubmissionEnabled,
|
|
154
|
+
isTestDynamicInstrumentationEnabled
|
|
153
155
|
}
|
|
154
156
|
|
|
155
157
|
if (logInjection !== undefined) {
|
|
@@ -21,7 +21,9 @@ const {
|
|
|
21
21
|
ITR_CORRELATION_ID,
|
|
22
22
|
TEST_SOURCE_FILE,
|
|
23
23
|
TEST_LEVEL_EVENT_TYPES,
|
|
24
|
-
TEST_SUITE
|
|
24
|
+
TEST_SUITE,
|
|
25
|
+
getFileAndLineNumberFromError,
|
|
26
|
+
getTestSuitePath
|
|
25
27
|
} = require('./util/test')
|
|
26
28
|
const Plugin = require('./plugin')
|
|
27
29
|
const { COMPONENT } = require('../constants')
|
|
@@ -47,7 +49,7 @@ module.exports = class CiPlugin extends Plugin {
|
|
|
47
49
|
}
|
|
48
50
|
this.tracer._exporter.getLibraryConfiguration(this.testConfiguration, (err, libraryConfig) => {
|
|
49
51
|
if (err) {
|
|
50
|
-
log.error(
|
|
52
|
+
log.error('Library configuration could not be fetched. %s', err.message)
|
|
51
53
|
} else {
|
|
52
54
|
this.libraryConfig = libraryConfig
|
|
53
55
|
}
|
|
@@ -61,7 +63,7 @@ module.exports = class CiPlugin extends Plugin {
|
|
|
61
63
|
}
|
|
62
64
|
this.tracer._exporter.getSkippableSuites(this.testConfiguration, (err, skippableSuites, itrCorrelationId) => {
|
|
63
65
|
if (err) {
|
|
64
|
-
log.error(
|
|
66
|
+
log.error('Skippable suites could not be fetched. %s', err.message)
|
|
65
67
|
} else {
|
|
66
68
|
this.itrCorrelationId = itrCorrelationId
|
|
67
69
|
}
|
|
@@ -150,7 +152,7 @@ module.exports = class CiPlugin extends Plugin {
|
|
|
150
152
|
}
|
|
151
153
|
this.tracer._exporter.getKnownTests(this.testConfiguration, (err, knownTests) => {
|
|
152
154
|
if (err) {
|
|
153
|
-
log.error(
|
|
155
|
+
log.error('Known tests could not be fetched. %s', err.message)
|
|
154
156
|
this.libraryConfig.isEarlyFlakeDetectionEnabled = false
|
|
155
157
|
}
|
|
156
158
|
onDone({ err, knownTests })
|
|
@@ -180,6 +182,12 @@ module.exports = class CiPlugin extends Plugin {
|
|
|
180
182
|
|
|
181
183
|
configure (config) {
|
|
182
184
|
super.configure(config)
|
|
185
|
+
|
|
186
|
+
if (config.isTestDynamicInstrumentationEnabled) {
|
|
187
|
+
const testVisibilityDynamicInstrumentation = require('../ci-visibility/dynamic-instrumentation')
|
|
188
|
+
this.di = testVisibilityDynamicInstrumentation
|
|
189
|
+
}
|
|
190
|
+
|
|
183
191
|
this.testEnvironmentMetadata = getTestEnvironmentMetadata(this.constructor.id, this.config)
|
|
184
192
|
|
|
185
193
|
const {
|
|
@@ -283,4 +291,39 @@ module.exports = class CiPlugin extends Plugin {
|
|
|
283
291
|
|
|
284
292
|
return testSpan
|
|
285
293
|
}
|
|
294
|
+
|
|
295
|
+
// TODO: If the test finishes and the probe is not hit, we should remove the breakpoint
|
|
296
|
+
addDiProbe (err, probe) {
|
|
297
|
+
const [file, line] = getFileAndLineNumberFromError(err)
|
|
298
|
+
|
|
299
|
+
const relativePath = getTestSuitePath(file, this.repositoryRoot)
|
|
300
|
+
|
|
301
|
+
const [
|
|
302
|
+
snapshotId,
|
|
303
|
+
setProbePromise,
|
|
304
|
+
hitProbePromise
|
|
305
|
+
] = this.di.addLineProbe({ file: relativePath, line })
|
|
306
|
+
|
|
307
|
+
if (probe) { // not all frameworks may sync with the set probe promise
|
|
308
|
+
probe.setProbePromise = setProbePromise
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
hitProbePromise.then(({ snapshot }) => {
|
|
312
|
+
// TODO: handle race conditions for this.retriedTestIds
|
|
313
|
+
const { traceId, spanId } = this.retriedTestIds
|
|
314
|
+
this.tracer._exporter.exportDiLogs(this.testEnvironmentMetadata, {
|
|
315
|
+
debugger: { snapshot },
|
|
316
|
+
dd: {
|
|
317
|
+
trace_id: traceId,
|
|
318
|
+
span_id: spanId
|
|
319
|
+
}
|
|
320
|
+
})
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
return {
|
|
324
|
+
snapshotId,
|
|
325
|
+
file: relativePath,
|
|
326
|
+
line
|
|
327
|
+
}
|
|
328
|
+
}
|
|
286
329
|
}
|
|
@@ -79,7 +79,7 @@ module.exports = class Plugin {
|
|
|
79
79
|
return handler.apply(this, arguments)
|
|
80
80
|
} catch (e) {
|
|
81
81
|
logger.error('Error in plugin handler:', e)
|
|
82
|
-
logger.info('Disabling plugin:', plugin.id)
|
|
82
|
+
logger.info('Disabling plugin: %s', plugin.id)
|
|
83
83
|
plugin.configure(false)
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -94,7 +94,7 @@ class TracingPlugin extends Plugin {
|
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
addError (error, span = this.activeSpan) {
|
|
97
|
-
if (!span._spanContext._tags.error) {
|
|
97
|
+
if (span && !span._spanContext._tags.error) {
|
|
98
98
|
// Errors may be wrapped in a context.
|
|
99
99
|
error = (error && error.error) || error
|
|
100
100
|
span.setTag('error', error || 1)
|
|
@@ -61,7 +61,7 @@ function sanitizedExec (
|
|
|
61
61
|
exitCode: err.status || err.errno
|
|
62
62
|
})
|
|
63
63
|
}
|
|
64
|
-
log.error(err)
|
|
64
|
+
log.error('Git plugin error executing command', err)
|
|
65
65
|
return ''
|
|
66
66
|
} finally {
|
|
67
67
|
storage.enterWith(store)
|
|
@@ -144,7 +144,7 @@ function unshallowRepository () {
|
|
|
144
144
|
], { stdio: 'pipe' })
|
|
145
145
|
} catch (err) {
|
|
146
146
|
// If the local HEAD is a commit that has not been pushed to the remote, the above command will fail.
|
|
147
|
-
log.error(err)
|
|
147
|
+
log.error('Git plugin error executing git command', err)
|
|
148
148
|
incrementCountMetric(
|
|
149
149
|
TELEMETRY_GIT_COMMAND_ERRORS,
|
|
150
150
|
{ command: 'unshallow', errorType: err.code, exitCode: err.status || err.errno }
|
|
@@ -157,7 +157,7 @@ function unshallowRepository () {
|
|
|
157
157
|
], { stdio: 'pipe' })
|
|
158
158
|
} catch (err) {
|
|
159
159
|
// If the CI is working on a detached HEAD or branch tracking hasn’t been set up, the above command will fail.
|
|
160
|
-
log.error(err)
|
|
160
|
+
log.error('Git plugin error executing fallback git command', err)
|
|
161
161
|
incrementCountMetric(
|
|
162
162
|
TELEMETRY_GIT_COMMAND_ERRORS,
|
|
163
163
|
{ command: 'unshallow', errorType: err.code, exitCode: err.status || err.errno }
|
|
@@ -196,7 +196,7 @@ function getLatestCommits () {
|
|
|
196
196
|
distributionMetric(TELEMETRY_GIT_COMMAND_MS, { command: 'get_local_commits' }, Date.now() - startTime)
|
|
197
197
|
return result
|
|
198
198
|
} catch (err) {
|
|
199
|
-
log.error(
|
|
199
|
+
log.error('Get latest commits failed: %s', err.message)
|
|
200
200
|
incrementCountMetric(
|
|
201
201
|
TELEMETRY_GIT_COMMAND_ERRORS,
|
|
202
202
|
{ command: 'get_local_commits', errorType: err.status }
|
|
@@ -229,7 +229,7 @@ function getCommitsRevList (commitsToExclude, commitsToInclude) {
|
|
|
229
229
|
.split('\n')
|
|
230
230
|
.filter(commit => commit)
|
|
231
231
|
} catch (err) {
|
|
232
|
-
log.error(
|
|
232
|
+
log.error('Get commits to upload failed: %s', err.message)
|
|
233
233
|
incrementCountMetric(
|
|
234
234
|
TELEMETRY_GIT_COMMAND_ERRORS,
|
|
235
235
|
{ command: 'get_objects', errorType: err.code, exitCode: err.status || err.errno } // err.status might be null
|
|
@@ -272,7 +272,7 @@ function generatePackFilesForCommits (commitsToUpload) {
|
|
|
272
272
|
try {
|
|
273
273
|
result = execGitPackObjects(temporaryPath)
|
|
274
274
|
} catch (err) {
|
|
275
|
-
log.error(err)
|
|
275
|
+
log.error('Git plugin error executing git pack-objects command', err)
|
|
276
276
|
incrementCountMetric(
|
|
277
277
|
TELEMETRY_GIT_COMMAND_ERRORS,
|
|
278
278
|
{ command: 'pack_objects', exitCode: err.status || err.errno, errorType: err.code }
|
|
@@ -292,7 +292,7 @@ function generatePackFilesForCommits (commitsToUpload) {
|
|
|
292
292
|
try {
|
|
293
293
|
result = execGitPackObjects(cwdPath)
|
|
294
294
|
} catch (err) {
|
|
295
|
-
log.error(err)
|
|
295
|
+
log.error('Git plugin error executing fallback git pack-objects command', err)
|
|
296
296
|
incrementCountMetric(
|
|
297
297
|
TELEMETRY_GIT_COMMAND_ERRORS,
|
|
298
298
|
{ command: 'pack_objects', exitCode: err.status || err.errno, errorType: err.code }
|