dd-trace 4.45.0 → 4.47.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 (153) hide show
  1. package/LICENSE-3rdparty.csv +2 -0
  2. package/index.d.ts +20 -8
  3. package/package.json +11 -5
  4. package/packages/datadog-instrumentations/src/aerospike.js +1 -1
  5. package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
  6. package/packages/datadog-instrumentations/src/aws-sdk.js +4 -4
  7. package/packages/datadog-instrumentations/src/body-parser.js +4 -4
  8. package/packages/datadog-instrumentations/src/cassandra-driver.js +2 -2
  9. package/packages/datadog-instrumentations/src/child_process.js +2 -2
  10. package/packages/datadog-instrumentations/src/connect.js +4 -4
  11. package/packages/datadog-instrumentations/src/cookie-parser.js +4 -4
  12. package/packages/datadog-instrumentations/src/couchbase.js +12 -12
  13. package/packages/datadog-instrumentations/src/cucumber.js +294 -56
  14. package/packages/datadog-instrumentations/src/dns.js +10 -10
  15. package/packages/datadog-instrumentations/src/elasticsearch.js +4 -4
  16. package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +3 -3
  17. package/packages/datadog-instrumentations/src/express.js +4 -4
  18. package/packages/datadog-instrumentations/src/fastify.js +6 -6
  19. package/packages/datadog-instrumentations/src/fetch.js +1 -1
  20. package/packages/datadog-instrumentations/src/find-my-way.js +2 -2
  21. package/packages/datadog-instrumentations/src/fs.js +2 -2
  22. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +2 -2
  23. package/packages/datadog-instrumentations/src/grpc/client.js +4 -6
  24. package/packages/datadog-instrumentations/src/grpc/server.js +2 -2
  25. package/packages/datadog-instrumentations/src/hapi.js +10 -13
  26. package/packages/datadog-instrumentations/src/helpers/register.js +1 -1
  27. package/packages/datadog-instrumentations/src/http/client.js +3 -3
  28. package/packages/datadog-instrumentations/src/jest.js +8 -5
  29. package/packages/datadog-instrumentations/src/kafkajs.js +67 -31
  30. package/packages/datadog-instrumentations/src/knex.js +2 -2
  31. package/packages/datadog-instrumentations/src/koa.js +5 -5
  32. package/packages/datadog-instrumentations/src/ldapjs.js +1 -1
  33. package/packages/datadog-instrumentations/src/mariadb.js +8 -8
  34. package/packages/datadog-instrumentations/src/memcached.js +2 -2
  35. package/packages/datadog-instrumentations/src/microgateway-core.js +7 -5
  36. package/packages/datadog-instrumentations/src/mocha/common.js +1 -1
  37. package/packages/datadog-instrumentations/src/mocha/main.js +139 -53
  38. package/packages/datadog-instrumentations/src/mocha/utils.js +37 -18
  39. package/packages/datadog-instrumentations/src/mocha/worker.js +29 -1
  40. package/packages/datadog-instrumentations/src/mocha.js +4 -0
  41. package/packages/datadog-instrumentations/src/moleculer/server.js +2 -2
  42. package/packages/datadog-instrumentations/src/mongodb-core.js +7 -7
  43. package/packages/datadog-instrumentations/src/mongoose.js +5 -6
  44. package/packages/datadog-instrumentations/src/mysql.js +3 -3
  45. package/packages/datadog-instrumentations/src/mysql2.js +6 -6
  46. package/packages/datadog-instrumentations/src/net.js +2 -2
  47. package/packages/datadog-instrumentations/src/next.js +5 -5
  48. package/packages/datadog-instrumentations/src/openai.js +62 -71
  49. package/packages/datadog-instrumentations/src/oracledb.js +8 -8
  50. package/packages/datadog-instrumentations/src/passport-http.js +1 -1
  51. package/packages/datadog-instrumentations/src/passport-local.js +1 -1
  52. package/packages/datadog-instrumentations/src/passport-utils.js +1 -1
  53. package/packages/datadog-instrumentations/src/pg.js +60 -5
  54. package/packages/datadog-instrumentations/src/pino.js +4 -4
  55. package/packages/datadog-instrumentations/src/playwright.js +6 -4
  56. package/packages/datadog-instrumentations/src/redis.js +2 -2
  57. package/packages/datadog-instrumentations/src/restify.js +4 -4
  58. package/packages/datadog-instrumentations/src/rhea.js +4 -4
  59. package/packages/datadog-instrumentations/src/router.js +5 -5
  60. package/packages/datadog-instrumentations/src/sharedb.js +2 -2
  61. package/packages/datadog-instrumentations/src/vitest.js +188 -12
  62. package/packages/datadog-instrumentations/src/winston.js +2 -3
  63. package/packages/datadog-plugin-amqplib/src/consumer.js +1 -3
  64. package/packages/datadog-plugin-aws-sdk/src/base.js +33 -0
  65. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -1
  66. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -0
  67. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -1
  68. package/packages/datadog-plugin-cucumber/src/index.js +24 -1
  69. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +39 -10
  70. package/packages/datadog-plugin-cypress/src/support.js +4 -1
  71. package/packages/datadog-plugin-hapi/src/index.js +2 -2
  72. package/packages/datadog-plugin-http/src/client.js +1 -42
  73. package/packages/datadog-plugin-http2/src/client.js +1 -26
  74. package/packages/datadog-plugin-jest/src/index.js +18 -1
  75. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +20 -0
  76. package/packages/datadog-plugin-kafkajs/src/consumer.js +1 -2
  77. package/packages/datadog-plugin-kafkajs/src/index.js +3 -1
  78. package/packages/datadog-plugin-mocha/src/index.js +18 -0
  79. package/packages/datadog-plugin-openai/src/index.js +85 -65
  80. package/packages/datadog-plugin-playwright/src/index.js +9 -0
  81. package/packages/datadog-plugin-rhea/src/consumer.js +1 -3
  82. package/packages/datadog-plugin-vitest/src/index.js +68 -3
  83. package/packages/datadog-shimmer/src/shimmer.js +144 -10
  84. package/packages/dd-trace/src/appsec/addresses.js +3 -1
  85. package/packages/dd-trace/src/appsec/blocking.js +23 -17
  86. package/packages/dd-trace/src/appsec/channels.js +4 -2
  87. package/packages/dd-trace/src/appsec/graphql.js +3 -1
  88. package/packages/dd-trace/src/appsec/iast/iast-log.js +2 -1
  89. package/packages/dd-trace/src/appsec/rasp/index.js +103 -0
  90. package/packages/dd-trace/src/appsec/rasp/sql_injection.js +86 -0
  91. package/packages/dd-trace/src/appsec/rasp/ssrf.js +37 -0
  92. package/packages/dd-trace/src/appsec/rasp/utils.js +63 -0
  93. package/packages/dd-trace/src/appsec/remote_config/capabilities.js +2 -0
  94. package/packages/dd-trace/src/appsec/remote_config/index.js +16 -7
  95. package/packages/dd-trace/src/appsec/remote_config/manager.js +93 -52
  96. package/packages/dd-trace/src/appsec/rule_manager.js +8 -0
  97. package/packages/dd-trace/src/appsec/telemetry.js +3 -3
  98. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +33 -14
  99. package/packages/dd-trace/src/appsec/waf/waf_manager.js +2 -1
  100. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +4 -0
  101. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +15 -1
  102. package/packages/dd-trace/src/config.js +100 -40
  103. package/packages/dd-trace/src/constants.js +11 -1
  104. package/packages/dd-trace/src/data_streams_context.js +3 -0
  105. package/packages/dd-trace/src/datastreams/fnv.js +23 -0
  106. package/packages/dd-trace/src/datastreams/pathway.js +12 -5
  107. package/packages/dd-trace/src/datastreams/processor.js +35 -0
  108. package/packages/dd-trace/src/datastreams/schemas/schema.js +8 -0
  109. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +125 -0
  110. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +29 -0
  111. package/packages/dd-trace/src/debugger/devtools_client/config.js +24 -0
  112. package/packages/dd-trace/src/debugger/devtools_client/index.js +57 -0
  113. package/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js +23 -0
  114. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +164 -0
  115. package/packages/dd-trace/src/debugger/devtools_client/send.js +28 -0
  116. package/packages/dd-trace/src/debugger/devtools_client/session.js +7 -0
  117. package/packages/dd-trace/src/debugger/devtools_client/state.js +47 -0
  118. package/packages/dd-trace/src/debugger/devtools_client/status.js +109 -0
  119. package/packages/dd-trace/src/debugger/index.js +92 -0
  120. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +29 -2
  121. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  122. package/packages/dd-trace/src/lambda/handler.js +1 -0
  123. package/packages/dd-trace/src/lambda/index.js +12 -1
  124. package/packages/dd-trace/src/opentracing/propagation/text_map.js +1 -6
  125. package/packages/dd-trace/src/payload-tagging/config/aws.json +30 -0
  126. package/packages/dd-trace/src/payload-tagging/config/index.js +30 -0
  127. package/packages/dd-trace/src/payload-tagging/index.js +93 -0
  128. package/packages/dd-trace/src/payload-tagging/tagging.js +83 -0
  129. package/packages/dd-trace/src/plugin_manager.js +11 -10
  130. package/packages/dd-trace/src/plugins/ci_plugin.js +33 -8
  131. package/packages/dd-trace/src/plugins/util/env.js +5 -2
  132. package/packages/dd-trace/src/plugins/util/test.js +24 -4
  133. package/packages/dd-trace/src/profiler.js +15 -5
  134. package/packages/dd-trace/src/profiling/config.js +7 -4
  135. package/packages/dd-trace/src/profiling/exporter_cli.js +13 -1
  136. package/packages/dd-trace/src/profiling/exporters/agent.js +8 -2
  137. package/packages/dd-trace/src/profiling/profiler.js +0 -9
  138. package/packages/dd-trace/src/profiling/profilers/event_plugins/dns.js +13 -0
  139. package/packages/dd-trace/src/profiling/profilers/event_plugins/dns_lookup.js +16 -0
  140. package/packages/dd-trace/src/profiling/profilers/event_plugins/dns_lookupservice.js +16 -0
  141. package/packages/dd-trace/src/profiling/profilers/event_plugins/dns_resolve.js +24 -0
  142. package/packages/dd-trace/src/profiling/profilers/event_plugins/dns_reverse.js +16 -0
  143. package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +48 -0
  144. package/packages/dd-trace/src/profiling/profilers/event_plugins/net.js +24 -0
  145. package/packages/dd-trace/src/profiling/profilers/events.js +108 -32
  146. package/packages/dd-trace/src/profiling/profilers/shared.js +5 -0
  147. package/packages/dd-trace/src/profiling/profilers/wall.js +9 -3
  148. package/packages/dd-trace/src/profiling/ssi-heuristics.js +59 -60
  149. package/packages/dd-trace/src/proxy.js +31 -24
  150. package/packages/dd-trace/src/span_stats.js +4 -2
  151. package/packages/dd-trace/src/telemetry/index.js +23 -6
  152. package/packages/dd-trace/src/telemetry/logs/index.js +20 -0
  153. package/packages/dd-trace/src/appsec/rasp.js +0 -176
@@ -89,7 +89,7 @@ function getProducts (config) {
89
89
  },
90
90
  profiler: {
91
91
  version: tracerVersion,
92
- enabled: config.profiling.enabled
92
+ enabled: profilingEnabledToBoolean(config.profiling.enabled)
93
93
  }
94
94
  }
95
95
  if (errors.profilingError) {
@@ -329,13 +329,17 @@ function updateConfig (changes, config) {
329
329
  const { origin, value } = change
330
330
  const entry = { name, value, origin }
331
331
 
332
- if (namesNeedFormatting.has(entry.name)) entry.value = formatMapForTelemetry(entry.value)
333
- if (entry.name === 'url' && entry.value) entry.value = entry.value.toString()
334
- if (entry.name === 'DD_TRACE_SAMPLING_RULES') {
332
+ if (namesNeedFormatting.has(entry.name)) {
333
+ entry.value = formatMapForTelemetry(entry.value)
334
+ } else if (entry.name === 'url') {
335
+ if (entry.value) {
336
+ entry.value = entry.value.toString()
337
+ }
338
+ } else if (entry.name === 'DD_TRACE_SAMPLING_RULES') {
335
339
  entry.value = JSON.stringify(entry.value)
340
+ } else if (Array.isArray(entry.value)) {
341
+ entry.value = value.join(',')
336
342
  }
337
- if (Array.isArray(entry.value)) entry.value = value.join(',')
338
-
339
343
  configuration.push(entry)
340
344
  }
341
345
 
@@ -354,6 +358,19 @@ function updateConfig (changes, config) {
354
358
  }
355
359
  }
356
360
 
361
+ function profilingEnabledToBoolean (profilingEnabled) {
362
+ if (typeof profilingEnabled === 'boolean') {
363
+ return profilingEnabled
364
+ }
365
+ if (['auto', 'true'].includes(profilingEnabled)) {
366
+ return true
367
+ }
368
+ if (profilingEnabled === 'false') {
369
+ return false
370
+ }
371
+ return undefined
372
+ }
373
+
357
374
  module.exports = {
358
375
  start,
359
376
  stop,
@@ -5,6 +5,7 @@ const logCollector = require('./log-collector')
5
5
  const { sendData } = require('../send-data')
6
6
 
7
7
  const telemetryLog = dc.channel('datadog:telemetry:log')
8
+ const errorLog = dc.channel('datadog:log:error')
8
9
 
9
10
  let enabled = false
10
11
 
@@ -33,12 +34,29 @@ function onLog (log) {
33
34
  }
34
35
  }
35
36
 
37
+ function onErrorLog (msg) {
38
+ if (msg instanceof Error) {
39
+ onLog({
40
+ level: 'ERROR',
41
+ message: msg.message,
42
+ stack_trace: msg.stack
43
+ })
44
+ } else if (typeof msg === 'string') {
45
+ onLog({
46
+ level: 'ERROR',
47
+ message: msg
48
+ })
49
+ }
50
+ }
51
+
36
52
  function start (config) {
37
53
  if (!config.telemetry.logCollection || enabled) return
38
54
 
39
55
  enabled = true
40
56
 
41
57
  telemetryLog.subscribe(onLog)
58
+
59
+ errorLog.subscribe(onErrorLog)
42
60
  }
43
61
 
44
62
  function stop () {
@@ -47,6 +65,8 @@ function stop () {
47
65
  if (telemetryLog.hasSubscribers) {
48
66
  telemetryLog.unsubscribe(onLog)
49
67
  }
68
+
69
+ errorLog.unsubscribe(onErrorLog)
50
70
  }
51
71
 
52
72
  function send (config, application, host) {
@@ -1,176 +0,0 @@
1
- 'use strict'
2
-
3
- const { storage } = require('../../../datadog-core')
4
- const web = require('./../plugins/util/web')
5
- const addresses = require('./addresses')
6
- const { httpClientRequestStart, setUncaughtExceptionCaptureCallbackStart } = require('./channels')
7
- const { reportStackTrace } = require('./stack_trace')
8
- const waf = require('./waf')
9
- const { getBlockingAction, block } = require('./blocking')
10
- const log = require('../log')
11
-
12
- const RULE_TYPES = {
13
- SSRF: 'ssrf'
14
- }
15
-
16
- class DatadogRaspAbortError extends Error {
17
- constructor (req, res, blockingAction) {
18
- super('DatadogRaspAbortError')
19
- this.name = 'DatadogRaspAbortError'
20
- this.req = req
21
- this.res = res
22
- this.blockingAction = blockingAction
23
- }
24
- }
25
-
26
- let config, abortOnUncaughtException
27
-
28
- function removeAllListeners (emitter, event) {
29
- const listeners = emitter.listeners(event)
30
- emitter.removeAllListeners(event)
31
-
32
- let cleaned = false
33
- return function () {
34
- if (cleaned === true) {
35
- return
36
- }
37
- cleaned = true
38
-
39
- for (let i = 0; i < listeners.length; ++i) {
40
- emitter.on(event, listeners[i])
41
- }
42
- }
43
- }
44
-
45
- function findDatadogRaspAbortError (err, deep = 10) {
46
- if (err instanceof DatadogRaspAbortError) {
47
- return err
48
- }
49
-
50
- if (err.cause && deep > 0) {
51
- return findDatadogRaspAbortError(err.cause, deep - 1)
52
- }
53
- }
54
-
55
- function handleUncaughtExceptionMonitor (err) {
56
- const abortError = findDatadogRaspAbortError(err)
57
- if (!abortError) return
58
-
59
- const { req, res, blockingAction } = abortError
60
- block(req, res, web.root(req), null, blockingAction)
61
-
62
- if (!process.hasUncaughtExceptionCaptureCallback()) {
63
- const cleanUp = removeAllListeners(process, 'uncaughtException')
64
- const handler = () => {
65
- process.removeListener('uncaughtException', handler)
66
- }
67
-
68
- setTimeout(() => {
69
- process.removeListener('uncaughtException', handler)
70
- cleanUp()
71
- })
72
-
73
- process.on('uncaughtException', handler)
74
- } else {
75
- // uncaughtException event is not executed when hasUncaughtExceptionCaptureCallback is true
76
- let previousCb
77
- const cb = ({ currentCallback, abortController }) => {
78
- setUncaughtExceptionCaptureCallbackStart.unsubscribe(cb)
79
- if (!currentCallback) {
80
- abortController.abort()
81
- return
82
- }
83
-
84
- previousCb = currentCallback
85
- }
86
-
87
- setUncaughtExceptionCaptureCallbackStart.subscribe(cb)
88
-
89
- process.setUncaughtExceptionCaptureCallback(null)
90
-
91
- // For some reason, previous callback was defined before the instrumentation
92
- // We can not restore it, so we let the app decide
93
- if (previousCb) {
94
- process.setUncaughtExceptionCaptureCallback(() => {
95
- process.setUncaughtExceptionCaptureCallback(null)
96
- process.setUncaughtExceptionCaptureCallback(previousCb)
97
- })
98
- }
99
- }
100
- }
101
-
102
- function enable (_config) {
103
- config = _config
104
- httpClientRequestStart.subscribe(analyzeSsrf)
105
-
106
- process.on('uncaughtExceptionMonitor', handleUncaughtExceptionMonitor)
107
- abortOnUncaughtException = process.execArgv?.includes('--abort-on-uncaught-exception')
108
-
109
- if (abortOnUncaughtException) {
110
- log.warn('The --abort-on-uncaught-exception flag is enabled. The RASP module will not block operations.')
111
- }
112
- }
113
-
114
- function disable () {
115
- if (httpClientRequestStart.hasSubscribers) httpClientRequestStart.unsubscribe(analyzeSsrf)
116
-
117
- process.off('uncaughtExceptionMonitor', handleUncaughtExceptionMonitor)
118
- }
119
-
120
- function analyzeSsrf (ctx) {
121
- const store = storage.getStore()
122
- const req = store?.req
123
- const url = ctx.args.uri
124
-
125
- if (!req || !url) return
126
-
127
- const persistent = {
128
- [addresses.HTTP_OUTGOING_URL]: url
129
- }
130
-
131
- const result = waf.run({ persistent }, req, RULE_TYPES.SSRF)
132
-
133
- const res = store?.res
134
- handleResult(result, req, res, ctx.abortController)
135
- }
136
-
137
- function getGenerateStackTraceAction (actions) {
138
- return actions?.generate_stack
139
- }
140
-
141
- function handleResult (actions, req, res, abortController) {
142
- const generateStackTraceAction = getGenerateStackTraceAction(actions)
143
- if (generateStackTraceAction && config.appsec.stackTrace.enabled) {
144
- const rootSpan = web.root(req)
145
- reportStackTrace(
146
- rootSpan,
147
- generateStackTraceAction.stack_id,
148
- config.appsec.stackTrace.maxDepth,
149
- config.appsec.stackTrace.maxStackTraces
150
- )
151
- }
152
-
153
- if (!abortController || abortOnUncaughtException) return
154
-
155
- const blockingAction = getBlockingAction(actions)
156
- if (blockingAction) {
157
- const rootSpan = web.root(req)
158
- // Should block only in express
159
- if (rootSpan?.context()._name === 'express.request') {
160
- const abortError = new DatadogRaspAbortError(req, res, blockingAction)
161
- abortController.abort(abortError)
162
-
163
- // TODO Delete this when support for node 16 is removed
164
- if (!abortController.signal.reason) {
165
- abortController.signal.reason = abortError
166
- }
167
- }
168
- }
169
- }
170
-
171
- module.exports = {
172
- enable,
173
- disable,
174
- handleResult,
175
- handleUncaughtExceptionMonitor // exported only for testing purpose
176
- }