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.
Files changed (172) hide show
  1. package/LICENSE-3rdparty.csv +8 -2
  2. package/ci/init.js +16 -0
  3. package/index.d.ts +31 -13
  4. package/init.js +4 -66
  5. package/initialize.mjs +13 -10
  6. package/loader-hook.mjs +4 -0
  7. package/package.json +16 -11
  8. package/packages/datadog-core/src/storage.js +39 -2
  9. package/packages/datadog-instrumentations/src/aerospike.js +1 -1
  10. package/packages/datadog-instrumentations/src/azure-functions.js +1 -1
  11. package/packages/datadog-instrumentations/src/cucumber.js +29 -3
  12. package/packages/datadog-instrumentations/src/express.js +38 -4
  13. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +3 -3
  14. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  15. package/packages/datadog-instrumentations/src/helpers/register.js +3 -4
  16. package/packages/datadog-instrumentations/src/http/client.js +1 -1
  17. package/packages/datadog-instrumentations/src/jest.js +27 -8
  18. package/packages/datadog-instrumentations/src/mocha/utils.js +2 -1
  19. package/packages/datadog-instrumentations/src/mysql2.js +13 -8
  20. package/packages/datadog-instrumentations/src/next.js +7 -4
  21. package/packages/datadog-instrumentations/src/passport-http.js +2 -14
  22. package/packages/datadog-instrumentations/src/passport-local.js +2 -14
  23. package/packages/datadog-instrumentations/src/passport-utils.js +43 -19
  24. package/packages/datadog-instrumentations/src/pg.js +6 -6
  25. package/packages/datadog-instrumentations/src/playwright.js +17 -4
  26. package/packages/datadog-instrumentations/src/router.js +97 -1
  27. package/packages/datadog-instrumentations/src/sequelize.js +9 -4
  28. package/packages/datadog-instrumentations/src/url.js +4 -0
  29. package/packages/datadog-instrumentations/src/vitest.js +27 -2
  30. package/packages/datadog-plugin-avsc/src/schema_iterator.js +8 -3
  31. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +154 -0
  32. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -1
  33. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -1
  34. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  35. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -1
  36. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -1
  37. package/packages/datadog-plugin-aws-sdk/src/util.js +92 -0
  38. package/packages/datadog-plugin-azure-functions/src/index.js +1 -1
  39. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -1
  40. package/packages/datadog-plugin-cucumber/src/index.js +39 -4
  41. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +3 -3
  42. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  43. package/packages/datadog-plugin-grpc/src/util.js +1 -1
  44. package/packages/datadog-plugin-jest/src/index.js +39 -4
  45. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +1 -1
  46. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +1 -1
  47. package/packages/datadog-plugin-mocha/src/index.js +36 -2
  48. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  49. package/packages/datadog-plugin-vitest/src/index.js +34 -2
  50. package/packages/datadog-shimmer/src/shimmer.js +8 -4
  51. package/packages/dd-trace/src/appsec/addresses.js +3 -0
  52. package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
  53. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  54. package/packages/dd-trace/src/appsec/blocking.js +1 -1
  55. package/packages/dd-trace/src/appsec/channels.js +1 -0
  56. package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +4 -0
  57. package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +2 -2
  58. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  59. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  60. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  61. package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +10 -3
  62. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +4 -0
  63. package/packages/dd-trace/src/appsec/iast/analyzers/template-injection-analyzer.js +4 -0
  64. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +8 -21
  65. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +3 -3
  66. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +2 -2
  67. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +64 -3
  68. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -8
  69. package/packages/dd-trace/src/appsec/iast/taint-tracking/source-types.js +2 -1
  70. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +7 -11
  71. package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +2 -3
  72. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +2 -2
  73. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +2 -2
  74. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +2 -2
  75. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +2 -2
  76. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +3 -3
  77. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +2 -2
  78. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +1 -1
  79. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +32 -37
  80. package/packages/dd-trace/src/appsec/index.js +18 -13
  81. package/packages/dd-trace/src/appsec/rasp/fs-plugin.js +2 -2
  82. package/packages/dd-trace/src/appsec/rasp/utils.js +1 -1
  83. package/packages/dd-trace/src/appsec/remote_config/capabilities.js +1 -0
  84. package/packages/dd-trace/src/appsec/remote_config/index.js +25 -1
  85. package/packages/dd-trace/src/appsec/remote_config/manager.js +2 -2
  86. package/packages/dd-trace/src/appsec/reporter.js +3 -1
  87. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  88. package/packages/dd-trace/src/appsec/sdk/track_event.js +37 -24
  89. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +4 -4
  90. package/packages/dd-trace/src/appsec/telemetry.js +10 -0
  91. package/packages/dd-trace/src/appsec/user_tracking.js +168 -0
  92. package/packages/dd-trace/src/appsec/waf/index.js +2 -2
  93. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -3
  94. package/packages/dd-trace/src/appsec/waf/waf_manager.js +1 -1
  95. package/packages/dd-trace/src/azure_metadata.js +4 -4
  96. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +5 -4
  97. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +39 -3
  98. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  99. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  100. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +1 -1
  101. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  102. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +29 -9
  103. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -2
  104. package/packages/dd-trace/src/config.js +24 -32
  105. package/packages/dd-trace/src/constants.js +1 -0
  106. package/packages/dd-trace/src/crashtracking/crashtracker.js +3 -2
  107. package/packages/dd-trace/src/datastreams/processor.js +4 -6
  108. package/packages/dd-trace/src/datastreams/writer.js +6 -5
  109. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +80 -0
  110. package/packages/dd-trace/src/debugger/devtools_client/config.js +3 -1
  111. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +6 -0
  112. package/packages/dd-trace/src/debugger/devtools_client/index.js +63 -8
  113. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +10 -67
  114. package/packages/dd-trace/src/debugger/devtools_client/send.js +2 -1
  115. package/packages/dd-trace/src/debugger/devtools_client/state.js +1 -1
  116. package/packages/dd-trace/src/debugger/devtools_client/status.js +4 -4
  117. package/packages/dd-trace/src/debugger/index.js +14 -10
  118. package/packages/dd-trace/src/dogstatsd.js +2 -2
  119. package/packages/dd-trace/src/encode/0.4.js +23 -78
  120. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +0 -32
  121. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -2
  122. package/packages/dd-trace/src/encode/span-stats.js +0 -30
  123. package/packages/dd-trace/src/exporters/agent/writer.js +3 -3
  124. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  125. package/packages/dd-trace/src/exporters/span-stats/writer.js +1 -1
  126. package/packages/dd-trace/src/flare/index.js +1 -1
  127. package/packages/dd-trace/src/guardrails/index.js +64 -0
  128. package/packages/dd-trace/src/guardrails/log.js +32 -0
  129. package/packages/dd-trace/src/guardrails/telemetry.js +78 -0
  130. package/packages/dd-trace/src/guardrails/util.js +10 -0
  131. package/packages/dd-trace/src/lambda/runtime/ritm.js +2 -2
  132. package/packages/dd-trace/src/llmobs/storage.js +2 -3
  133. package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
  134. package/packages/dd-trace/src/{encode → msgpack}/chunk.js +8 -5
  135. package/packages/dd-trace/src/msgpack/encoder.js +309 -0
  136. package/packages/dd-trace/src/msgpack/index.js +6 -0
  137. package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
  138. package/packages/dd-trace/src/opentracing/propagation/text_map.js +12 -9
  139. package/packages/dd-trace/src/opentracing/span.js +1 -1
  140. package/packages/dd-trace/src/opentracing/tracer.js +2 -2
  141. package/packages/dd-trace/src/plugin_manager.js +4 -2
  142. package/packages/dd-trace/src/plugins/ci_plugin.js +47 -4
  143. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  144. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  145. package/packages/dd-trace/src/plugins/util/git.js +7 -7
  146. package/packages/dd-trace/src/plugins/util/test.js +36 -3
  147. package/packages/dd-trace/src/plugins/util/web.js +2 -2
  148. package/packages/dd-trace/src/profiling/config.js +3 -0
  149. package/packages/dd-trace/src/profiling/exporters/agent.js +9 -68
  150. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +76 -0
  151. package/packages/dd-trace/src/profiling/exporters/file.js +8 -4
  152. package/packages/dd-trace/src/profiling/profiler.js +62 -10
  153. package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +22 -12
  154. package/packages/dd-trace/src/profiling/profilers/events.js +47 -8
  155. package/packages/dd-trace/src/profiling/profilers/wall.js +2 -17
  156. package/packages/dd-trace/src/profiling/webspan-utils.js +23 -0
  157. package/packages/dd-trace/src/proxy.js +7 -2
  158. package/packages/dd-trace/src/runtime_metrics.js +107 -4
  159. package/packages/dd-trace/src/serverless.js +1 -1
  160. package/packages/dd-trace/src/service-naming/schemas/v0/serverless.js +1 -1
  161. package/packages/dd-trace/src/service-naming/schemas/v1/serverless.js +1 -1
  162. package/packages/dd-trace/src/span_processor.js +10 -10
  163. package/packages/dd-trace/src/tagger.js +1 -1
  164. package/packages/dd-trace/src/telemetry/index.js +1 -0
  165. package/packages/dd-trace/src/telemetry/logs/index.js +2 -2
  166. package/packages/dd-trace/src/telemetry/logs/log-collector.js +10 -2
  167. package/packages/dd-trace/src/telemetry/send-data.js +2 -2
  168. package/packages/dd-trace/src/util.js +5 -16
  169. package/packages/datadog-instrumentations/src/qs.js +0 -24
  170. package/packages/dd-trace/src/appsec/iast/iast-log.js +0 -86
  171. package/packages/dd-trace/src/appsec/passport.js +0 -110
  172. 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.length += this.buffer.utf8Write(value, this.length, length)
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, this.length)
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 }
@@ -0,0 +1,6 @@
1
+ 'use strict'
2
+
3
+ const Chunk = require('./chunk')
4
+ const { MsgpackEncoder } = require('./encoder')
5
+
6
+ module.exports = { Chunk, MsgpackEncoder }
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { AsyncLocalStorage } = require('async_hooks')
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 = new AsyncLocalStorage()
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
- if (this._config.tracePropagationStyle.extract.includes('baggage') && carrier.baggage) {
344
- context = context || new DatadogSpanContext()
345
- this._extractBaggageItems(carrier, context)
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({
@@ -214,7 +214,7 @@ class DatadogSpan {
214
214
 
215
215
  if (DD_TRACE_EXPERIMENTAL_STATE_TRACKING === 'true') {
216
216
  if (!this._spanContext._tags['service.name']) {
217
- log.error(`Finishing invalid span: ${this}`)
217
+ log.error('Finishing invalid span: %s', this)
218
218
  }
219
219
  }
220
220
 
@@ -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(`Library configuration could not be fetched. ${err.message}`)
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(`Skippable suites could not be fetched. ${err.message}`)
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(`Known tests could not be fetched. ${err.message}`)
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(`Get latest commits failed: ${err.message}`)
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(`Get commits to upload failed: ${err.message}`)
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 }