dd-trace 4.18.0 → 4.23.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 (137) hide show
  1. package/LICENSE-3rdparty.csv +3 -2
  2. package/README.md +3 -3
  3. package/ext/kinds.d.ts +1 -0
  4. package/ext/kinds.js +2 -1
  5. package/ext/tags.d.ts +2 -1
  6. package/ext/tags.js +6 -1
  7. package/index.d.ts +29 -0
  8. package/package.json +12 -11
  9. package/packages/datadog-core/src/storage/async_resource.js +1 -1
  10. package/packages/datadog-esbuild/index.js +1 -20
  11. package/packages/datadog-instrumentations/src/aerospike.js +47 -0
  12. package/packages/datadog-instrumentations/src/apollo-server-core.js +41 -0
  13. package/packages/datadog-instrumentations/src/apollo-server.js +83 -0
  14. package/packages/datadog-instrumentations/src/child-process.js +4 -5
  15. package/packages/datadog-instrumentations/src/couchbase.js +5 -4
  16. package/packages/datadog-instrumentations/src/crypto.js +2 -1
  17. package/packages/datadog-instrumentations/src/dns.js +2 -1
  18. package/packages/datadog-instrumentations/src/graphql.js +18 -4
  19. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -2
  20. package/packages/datadog-instrumentations/src/helpers/hooks.js +10 -2
  21. package/packages/datadog-instrumentations/src/helpers/instrument.js +9 -4
  22. package/packages/datadog-instrumentations/src/helpers/register.js +19 -3
  23. package/packages/datadog-instrumentations/src/http/client.js +12 -2
  24. package/packages/datadog-instrumentations/src/http/server.js +7 -4
  25. package/packages/datadog-instrumentations/src/http2/client.js +3 -1
  26. package/packages/datadog-instrumentations/src/http2/server.js +3 -1
  27. package/packages/datadog-instrumentations/src/jest.js +12 -6
  28. package/packages/datadog-instrumentations/src/kafkajs.js +27 -0
  29. package/packages/datadog-instrumentations/src/net.js +10 -2
  30. package/packages/datadog-instrumentations/src/next.js +18 -6
  31. package/packages/datadog-instrumentations/src/restify.js +14 -1
  32. package/packages/datadog-instrumentations/src/rhea.js +15 -9
  33. package/packages/datadog-plugin-aerospike/src/index.js +113 -0
  34. package/packages/datadog-plugin-cucumber/src/index.js +34 -2
  35. package/packages/datadog-plugin-cypress/src/plugin.js +60 -8
  36. package/packages/datadog-plugin-graphql/src/resolve.js +26 -18
  37. package/packages/datadog-plugin-http/src/client.js +19 -2
  38. package/packages/datadog-plugin-jest/src/index.js +38 -4
  39. package/packages/datadog-plugin-kafkajs/src/consumer.js +59 -6
  40. package/packages/datadog-plugin-kafkajs/src/producer.js +64 -6
  41. package/packages/datadog-plugin-mocha/src/index.js +32 -1
  42. package/packages/datadog-plugin-next/src/index.js +40 -14
  43. package/packages/datadog-plugin-playwright/src/index.js +17 -1
  44. package/packages/dd-trace/src/appsec/activation.js +29 -0
  45. package/packages/dd-trace/src/appsec/addresses.js +3 -1
  46. package/packages/dd-trace/src/appsec/api_security_sampler.js +48 -0
  47. package/packages/dd-trace/src/appsec/blocked_templates.js +4 -1
  48. package/packages/dd-trace/src/appsec/blocking.js +95 -43
  49. package/packages/dd-trace/src/appsec/channels.js +5 -2
  50. package/packages/dd-trace/src/appsec/graphql.js +146 -0
  51. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +1 -0
  52. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +105 -0
  53. package/packages/dd-trace/src/appsec/iast/iast-log.js +1 -1
  54. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +1 -1
  55. package/packages/dd-trace/src/appsec/iast/index.js +1 -1
  56. package/packages/dd-trace/src/appsec/iast/path-line.js +1 -1
  57. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +1 -1
  58. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/constants.js +7 -0
  59. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +12 -19
  60. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +20 -0
  61. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/json-sensitive-analyzer.js +6 -10
  62. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +18 -25
  63. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +79 -85
  64. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +27 -36
  65. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +14 -11
  66. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +1 -0
  67. package/packages/dd-trace/src/appsec/index.js +33 -32
  68. package/packages/dd-trace/src/appsec/recommended.json +1737 -120
  69. package/packages/dd-trace/src/appsec/remote_config/capabilities.js +6 -1
  70. package/packages/dd-trace/src/appsec/remote_config/index.js +40 -15
  71. package/packages/dd-trace/src/appsec/reporter.js +50 -34
  72. package/packages/dd-trace/src/appsec/rule_manager.js +9 -6
  73. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +1 -1
  74. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +28 -13
  75. package/packages/dd-trace/src/appsec/waf/waf_manager.js +0 -1
  76. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +30 -1
  77. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +30 -1
  78. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +17 -1
  79. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +110 -59
  80. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-itr-configuration.js +40 -7
  81. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +26 -1
  82. package/packages/dd-trace/src/ci-visibility/telemetry.js +130 -0
  83. package/packages/dd-trace/src/config.js +145 -63
  84. package/packages/dd-trace/src/datastreams/processor.js +166 -26
  85. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +14 -1
  86. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +14 -0
  87. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +4 -0
  88. package/packages/dd-trace/src/exporters/common/form-data.js +4 -0
  89. package/packages/dd-trace/src/format.js +6 -1
  90. package/packages/dd-trace/src/id.js +12 -0
  91. package/packages/dd-trace/src/iitm.js +1 -1
  92. package/packages/dd-trace/src/log/channels.js +1 -1
  93. package/packages/dd-trace/src/noop/proxy.js +4 -0
  94. package/packages/dd-trace/src/opentelemetry/span.js +95 -2
  95. package/packages/dd-trace/src/opentelemetry/tracer.js +9 -10
  96. package/packages/dd-trace/src/opentracing/propagation/text_map.js +14 -5
  97. package/packages/dd-trace/src/opentracing/span.js +6 -0
  98. package/packages/dd-trace/src/opentracing/span_context.js +5 -2
  99. package/packages/dd-trace/src/opentracing/tracer.js +2 -2
  100. package/packages/dd-trace/src/plugin_manager.js +1 -1
  101. package/packages/dd-trace/src/plugins/ci_plugin.js +46 -9
  102. package/packages/dd-trace/src/plugins/database.js +1 -1
  103. package/packages/dd-trace/src/plugins/index.js +6 -0
  104. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  105. package/packages/dd-trace/src/plugins/util/ci.js +6 -19
  106. package/packages/dd-trace/src/plugins/util/exec.js +23 -2
  107. package/packages/dd-trace/src/plugins/util/git.js +98 -22
  108. package/packages/dd-trace/src/plugins/util/ip_extractor.js +7 -6
  109. package/packages/dd-trace/src/plugins/util/test.js +3 -2
  110. package/packages/dd-trace/src/plugins/util/url.js +26 -0
  111. package/packages/dd-trace/src/plugins/util/user-provided-git.js +4 -16
  112. package/packages/dd-trace/src/priority_sampler.js +30 -38
  113. package/packages/dd-trace/src/profiler.js +5 -3
  114. package/packages/dd-trace/src/profiling/config.js +26 -2
  115. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -0
  116. package/packages/dd-trace/src/profiling/profiler.js +17 -10
  117. package/packages/dd-trace/src/profiling/profilers/events.js +264 -0
  118. package/packages/dd-trace/src/profiling/profilers/shared.js +39 -0
  119. package/packages/dd-trace/src/profiling/profilers/space.js +2 -1
  120. package/packages/dd-trace/src/profiling/profilers/wall.js +121 -58
  121. package/packages/dd-trace/src/proxy.js +25 -1
  122. package/packages/dd-trace/src/ritm.js +1 -1
  123. package/packages/dd-trace/src/sampling_rule.js +130 -0
  124. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +5 -0
  125. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  126. package/packages/dd-trace/src/span_processor.js +4 -0
  127. package/packages/dd-trace/src/span_sampler.js +6 -64
  128. package/packages/dd-trace/src/spanleak.js +98 -0
  129. package/packages/dd-trace/src/startup-log.js +7 -1
  130. package/packages/dd-trace/src/telemetry/dependencies.js +56 -10
  131. package/packages/dd-trace/src/telemetry/index.js +171 -41
  132. package/packages/dd-trace/src/telemetry/logs/index.js +2 -2
  133. package/packages/dd-trace/src/telemetry/send-data.js +47 -5
  134. package/packages/dd-trace/src/tracer.js +8 -2
  135. package/scripts/install_plugin_modules.js +11 -3
  136. package/packages/diagnostics_channel/index.js +0 -3
  137. package/packages/diagnostics_channel/src/index.js +0 -121
@@ -6,7 +6,6 @@ const remoteConfig = require('./remote_config')
6
6
  const {
7
7
  bodyParser,
8
8
  cookieParser,
9
- graphqlFinishExecute,
10
9
  incomingHttpRequestStart,
11
10
  incomingHttpRequestEnd,
12
11
  passportVerify,
@@ -18,12 +17,14 @@ const waf = require('./waf')
18
17
  const addresses = require('./addresses')
19
18
  const Reporter = require('./reporter')
20
19
  const appsecTelemetry = require('./telemetry')
20
+ const apiSecuritySampler = require('./api_security_sampler')
21
21
  const web = require('../plugins/util/web')
22
22
  const { extractIp } = require('../plugins/util/ip_extractor')
23
23
  const { HTTP_CLIENT_IP } = require('../../../../ext/tags')
24
24
  const { block, setTemplates } = require('./blocking')
25
25
  const { passportTrackEvent } = require('./passport')
26
26
  const { storage } = require('../../../datadog-core')
27
+ const graphql = require('./graphql')
27
28
 
28
29
  let isEnabled = false
29
30
  let config
@@ -33,15 +34,18 @@ function enable (_config) {
33
34
 
34
35
  try {
35
36
  appsecTelemetry.enable(_config.telemetry)
37
+ graphql.enable()
36
38
 
37
39
  setTemplates(_config)
38
40
 
39
- RuleManager.applyRules(_config.appsec.rules, _config.appsec)
41
+ RuleManager.loadRules(_config.appsec)
40
42
 
41
43
  remoteConfig.enableWafUpdate(_config.appsec)
42
44
 
43
45
  Reporter.setRateLimit(_config.appsec.rateLimit)
44
46
 
47
+ apiSecuritySampler.configure(_config.appsec)
48
+
45
49
  incomingHttpRequestStart.subscribe(incomingHttpStartTranslator)
46
50
  incomingHttpRequestEnd.subscribe(incomingHttpEndTranslator)
47
51
  bodyParser.subscribe(onRequestBodyParsed)
@@ -49,7 +53,6 @@ function enable (_config) {
49
53
  nextQueryParsed.subscribe(onRequestQueryParsed)
50
54
  queryParser.subscribe(onRequestQueryParsed)
51
55
  cookieParser.subscribe(onRequestCookieParser)
52
- graphqlFinishExecute.subscribe(onGraphqlFinishExecute)
53
56
 
54
57
  if (_config.appsec.eventTracking.enabled) {
55
58
  passportVerify.subscribe(onPassportVerify)
@@ -80,17 +83,21 @@ function incomingHttpStartTranslator ({ req, res, abortController }) {
80
83
  const requestHeaders = Object.assign({}, req.headers)
81
84
  delete requestHeaders.cookie
82
85
 
83
- const payload = {
86
+ const persistent = {
84
87
  [addresses.HTTP_INCOMING_URL]: req.url,
85
88
  [addresses.HTTP_INCOMING_HEADERS]: requestHeaders,
86
89
  [addresses.HTTP_INCOMING_METHOD]: req.method
87
90
  }
88
91
 
89
92
  if (clientIp) {
90
- payload[addresses.HTTP_CLIENT_IP] = clientIp
93
+ persistent[addresses.HTTP_CLIENT_IP] = clientIp
94
+ }
95
+
96
+ if (apiSecuritySampler.sampleRequest()) {
97
+ persistent[addresses.WAF_CONTEXT_PROCESSOR] = { 'extract-schema': true }
91
98
  }
92
99
 
93
- const actions = waf.run(payload, req)
100
+ const actions = waf.run({ persistent }, req)
94
101
 
95
102
  handleResults(actions, req, res, rootSpan, abortController)
96
103
  }
@@ -100,32 +107,32 @@ function incomingHttpEndTranslator ({ req, res }) {
100
107
  const responseHeaders = Object.assign({}, res.getHeaders())
101
108
  delete responseHeaders['set-cookie']
102
109
 
103
- const payload = {
104
- [addresses.HTTP_INCOMING_RESPONSE_CODE]: res.statusCode,
110
+ const persistent = {
111
+ [addresses.HTTP_INCOMING_RESPONSE_CODE]: '' + res.statusCode,
105
112
  [addresses.HTTP_INCOMING_RESPONSE_HEADERS]: responseHeaders
106
113
  }
107
114
 
108
115
  // we need to keep this to support other body parsers
109
116
  // TODO: no need to analyze it if it was already done by the body-parser hook
110
117
  if (req.body !== undefined && req.body !== null) {
111
- payload[addresses.HTTP_INCOMING_BODY] = req.body
118
+ persistent[addresses.HTTP_INCOMING_BODY] = req.body
112
119
  }
113
120
 
114
121
  // TODO: temporary express instrumentation, will use express plugin later
115
122
  if (req.params && typeof req.params === 'object') {
116
- payload[addresses.HTTP_INCOMING_PARAMS] = req.params
123
+ persistent[addresses.HTTP_INCOMING_PARAMS] = req.params
117
124
  }
118
125
 
119
126
  // we need to keep this to support other cookie parsers
120
127
  if (req.cookies && typeof req.cookies === 'object') {
121
- payload[addresses.HTTP_INCOMING_COOKIES] = req.cookies
128
+ persistent[addresses.HTTP_INCOMING_COOKIES] = req.cookies
122
129
  }
123
130
 
124
131
  if (req.query && typeof req.query === 'object') {
125
- payload[addresses.HTTP_INCOMING_QUERY] = req.query
132
+ persistent[addresses.HTTP_INCOMING_QUERY] = req.query
126
133
  }
127
134
 
128
- waf.run(payload, req)
135
+ waf.run({ persistent }, req)
129
136
 
130
137
  waf.disposeContext(req)
131
138
 
@@ -144,7 +151,9 @@ function onRequestBodyParsed ({ req, res, body, abortController }) {
144
151
  if (!rootSpan) return
145
152
 
146
153
  const results = waf.run({
147
- [addresses.HTTP_INCOMING_BODY]: body
154
+ persistent: {
155
+ [addresses.HTTP_INCOMING_BODY]: body
156
+ }
148
157
  }, req)
149
158
 
150
159
  handleResults(results, req, res, rootSpan, abortController)
@@ -162,7 +171,9 @@ function onRequestQueryParsed ({ req, res, query, abortController }) {
162
171
  if (!rootSpan) return
163
172
 
164
173
  const results = waf.run({
165
- [addresses.HTTP_INCOMING_QUERY]: query
174
+ persistent: {
175
+ [addresses.HTTP_INCOMING_QUERY]: query
176
+ }
166
177
  }, req)
167
178
 
168
179
  handleResults(results, req, res, rootSpan, abortController)
@@ -175,7 +186,9 @@ function onRequestCookieParser ({ req, res, abortController, cookies }) {
175
186
  if (!rootSpan) return
176
187
 
177
188
  const results = waf.run({
178
- [addresses.HTTP_INCOMING_COOKIES]: cookies
189
+ persistent: {
190
+ [addresses.HTTP_INCOMING_COOKIES]: cookies
191
+ }
179
192
  }, req)
180
193
 
181
194
  handleResults(results, req, res, rootSpan, abortController)
@@ -183,7 +196,7 @@ function onRequestCookieParser ({ req, res, abortController, cookies }) {
183
196
 
184
197
  function onPassportVerify ({ credentials, user }) {
185
198
  const store = storage.getStore()
186
- const rootSpan = store && store.req && web.root(store.req)
199
+ const rootSpan = store?.req && web.root(store.req)
187
200
 
188
201
  if (!rootSpan) {
189
202
  log.warn('No rootSpan found in onPassportVerify')
@@ -193,20 +206,6 @@ function onPassportVerify ({ credentials, user }) {
193
206
  passportTrackEvent(credentials, user, rootSpan, config.appsec.eventTracking.mode)
194
207
  }
195
208
 
196
- function onGraphqlFinishExecute ({ context }) {
197
- const store = storage.getStore()
198
- const req = store?.req
199
-
200
- if (!req) return
201
-
202
- const resolvers = context?.resolvers
203
-
204
- if (!resolvers || typeof resolvers !== 'object') return
205
-
206
- // Don't collect blocking result because it only works in monitor mode.
207
- waf.run({ [addresses.HTTP_INCOMING_GRAPHQL_RESOLVERS]: resolvers }, req)
208
- }
209
-
210
209
  function handleResults (actions, req, res, rootSpan, abortController) {
211
210
  if (!actions || !req || !res || !rootSpan || !abortController) return
212
211
 
@@ -222,12 +221,14 @@ function disable () {
222
221
  RuleManager.clearAllRules()
223
222
 
224
223
  appsecTelemetry.disable()
224
+ graphql.disable()
225
225
 
226
226
  remoteConfig.disableWafUpdate()
227
227
 
228
+ apiSecuritySampler.disable()
229
+
228
230
  // Channel#unsubscribe() is undefined for non active channels
229
231
  if (bodyParser.hasSubscribers) bodyParser.unsubscribe(onRequestBodyParsed)
230
- if (graphqlFinishExecute.hasSubscribers) graphqlFinishExecute.unsubscribe(onGraphqlFinishExecute)
231
232
  if (incomingHttpRequestStart.hasSubscribers) incomingHttpRequestStart.unsubscribe(incomingHttpStartTranslator)
232
233
  if (incomingHttpRequestEnd.hasSubscribers) incomingHttpRequestEnd.unsubscribe(incomingHttpEndTranslator)
233
234
  if (queryParser.hasSubscribers) queryParser.unsubscribe(onRequestQueryParsed)