dd-trace 5.38.0 → 5.40.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 (97) hide show
  1. package/LICENSE-3rdparty.csv +1 -0
  2. package/index.d.ts +30 -21
  3. package/package.json +4 -2
  4. package/packages/datadog-instrumentations/src/apollo-server-core.js +1 -1
  5. package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
  6. package/packages/datadog-instrumentations/src/express-session.js +41 -0
  7. package/packages/datadog-instrumentations/src/fetch.js +27 -6
  8. package/packages/datadog-instrumentations/src/helpers/fetch.js +6 -1
  9. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  10. package/packages/datadog-instrumentations/src/jest.js +16 -10
  11. package/packages/datadog-instrumentations/src/mocha/main.js +2 -1
  12. package/packages/datadog-instrumentations/src/nyc.js +2 -1
  13. package/packages/datadog-instrumentations/src/vitest.js +4 -2
  14. package/packages/datadog-plugin-amqplib/src/consumer.js +1 -1
  15. package/packages/datadog-plugin-amqplib/src/producer.js +1 -2
  16. package/packages/datadog-plugin-avsc/src/schema_iterator.js +1 -1
  17. package/packages/datadog-plugin-aws-sdk/src/base.js +5 -1
  18. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +9 -8
  19. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -4
  20. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -2
  21. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -2
  22. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +1 -1
  23. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +1 -2
  24. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +1 -1
  25. package/packages/datadog-plugin-kafkajs/src/consumer.js +5 -2
  26. package/packages/datadog-plugin-kafkajs/src/producer.js +4 -3
  27. package/packages/datadog-plugin-mongodb-core/src/index.js +10 -13
  28. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +1 -1
  29. package/packages/datadog-plugin-rhea/src/consumer.js +1 -1
  30. package/packages/datadog-plugin-rhea/src/producer.js +1 -2
  31. package/packages/datadog-shimmer/src/shimmer.js +95 -95
  32. package/packages/dd-trace/src/appsec/addresses.js +1 -0
  33. package/packages/dd-trace/src/appsec/channels.js +1 -0
  34. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +1 -1
  35. package/packages/dd-trace/src/appsec/iast/iast-context.js +2 -2
  36. package/packages/dd-trace/src/appsec/iast/index.js +0 -1
  37. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +1 -2
  38. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +3 -5
  39. package/packages/dd-trace/src/appsec/index.js +23 -1
  40. package/packages/dd-trace/src/appsec/reporter.js +3 -8
  41. package/packages/dd-trace/src/appsec/rule_manager.js +1 -1
  42. package/packages/dd-trace/src/appsec/sdk/set_user.js +9 -5
  43. package/packages/dd-trace/src/appsec/sdk/track_event.js +2 -4
  44. package/packages/dd-trace/src/appsec/telemetry/common.js +24 -0
  45. package/packages/dd-trace/src/appsec/telemetry/index.js +126 -0
  46. package/packages/dd-trace/src/appsec/telemetry/rasp.js +35 -0
  47. package/packages/dd-trace/src/appsec/telemetry/user.js +24 -0
  48. package/packages/dd-trace/src/appsec/telemetry/waf.js +92 -0
  49. package/packages/dd-trace/src/appsec/user_tracking.js +2 -4
  50. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +16 -4
  51. package/packages/dd-trace/src/config.js +31 -14
  52. package/packages/dd-trace/src/constants.js +1 -1
  53. package/packages/dd-trace/src/{data_streams.js → datastreams/checkpointer.js} +1 -1
  54. package/packages/dd-trace/src/{data_streams_context.js → datastreams/context.js} +2 -2
  55. package/packages/dd-trace/src/datastreams/index.js +104 -0
  56. package/packages/dd-trace/src/datastreams/manager.js +27 -0
  57. package/packages/dd-trace/src/datastreams/processor.js +1 -44
  58. package/packages/dd-trace/src/datastreams/size.js +53 -0
  59. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +2 -2
  60. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -1
  61. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +22 -15
  62. package/packages/dd-trace/src/dogstatsd.js +23 -4
  63. package/packages/dd-trace/src/exporters/agent/index.js +2 -2
  64. package/packages/dd-trace/src/flare/index.js +3 -0
  65. package/packages/dd-trace/src/noop/dogstatsd.js +6 -0
  66. package/packages/dd-trace/src/opentelemetry/tracer.js +45 -1
  67. package/packages/dd-trace/src/opentracing/propagation/text_map.js +11 -47
  68. package/packages/dd-trace/src/opentracing/propagation/text_map_dsm.js +1 -1
  69. package/packages/dd-trace/src/opentracing/span.js +12 -2
  70. package/packages/dd-trace/src/payload-tagging/config/aws.json +8 -0
  71. package/packages/dd-trace/src/plugin_manager.js +4 -3
  72. package/packages/dd-trace/src/plugins/ci_plugin.js +2 -2
  73. package/packages/dd-trace/src/priority_sampler.js +5 -3
  74. package/packages/dd-trace/src/profiling/profiler.js +1 -1
  75. package/packages/dd-trace/src/profiling/profilers/wall.js +15 -4
  76. package/packages/dd-trace/src/proxy.js +41 -22
  77. package/packages/dd-trace/src/{appsec/remote_config → remote_config}/capabilities.js +1 -0
  78. package/packages/dd-trace/src/{appsec/remote_config → remote_config}/index.js +8 -5
  79. package/packages/dd-trace/src/{appsec/remote_config → remote_config}/manager.js +5 -5
  80. package/packages/dd-trace/src/runtime_metrics/index.js +34 -0
  81. package/packages/dd-trace/src/{runtime_metrics.js → runtime_metrics/runtime_metrics.js} +4 -4
  82. package/packages/dd-trace/src/serverless.js +10 -1
  83. package/packages/dd-trace/src/service-naming/index.js +12 -4
  84. package/packages/dd-trace/src/span_processor.js +7 -4
  85. package/packages/dd-trace/src/span_stats.js +1 -2
  86. package/packages/dd-trace/src/standalone/index.js +70 -0
  87. package/packages/dd-trace/src/standalone/product.js +24 -0
  88. package/packages/dd-trace/src/standalone/tracesource.js +22 -0
  89. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +47 -0
  90. package/packages/dd-trace/src/telemetry/index.js +16 -387
  91. package/packages/dd-trace/src/telemetry/telemetry.js +394 -0
  92. package/packages/dd-trace/src/tracer.js +7 -15
  93. package/packages/dd-trace/src/appsec/standalone.js +0 -130
  94. package/packages/dd-trace/src/appsec/telemetry.js +0 -218
  95. package/packages/dd-trace/src/service-naming/schemas/index.js +0 -6
  96. /package/packages/dd-trace/src/{appsec/remote_config → remote_config}/apply_states.js +0 -0
  97. /package/packages/dd-trace/src/{appsec/remote_config → remote_config}/scheduler.js +0 -0
@@ -1,394 +1,23 @@
1
1
  'use strict'
2
- const tracerVersion = require('../../../../package.json').version
3
- const dc = require('dc-polyfill')
4
- const os = require('os')
5
- const dependencies = require('./dependencies')
6
- const { sendData } = require('./send-data')
7
- const { errors } = require('../startup-log')
8
- const { manager: metricsManager } = require('./metrics')
9
- const telemetryLogger = require('./logs')
10
- const logger = require('../log')
11
2
 
12
- const telemetryStartChannel = dc.channel('datadog:telemetry:start')
13
- const telemetryStopChannel = dc.channel('datadog:telemetry:stop')
14
- const telemetryAppClosingChannel = dc.channel('datadog:telemetry:app-closing')
3
+ const activate = () => {
4
+ const active = require('./telemetry')
15
5
 
16
- let config
17
- let pluginManager
18
-
19
- let application
20
- let host
21
- let heartbeatTimeout
22
- let heartbeatInterval
23
- let extendedInterval
24
- let integrations
25
- let configWithOrigin = []
26
- let retryData = null
27
- const extendedHeartbeatPayload = {}
28
-
29
- const sentIntegrations = new Set()
30
-
31
- function getRetryData () {
32
- return retryData
33
- }
34
-
35
- function updateRetryData (error, retryObj) {
36
- if (error) {
37
- if (retryObj.reqType === 'message-batch') {
38
- const payload = retryObj.payload[0].payload
39
- const reqType = retryObj.payload[0].request_type
40
- retryData = { payload, reqType }
41
-
42
- // Since this payload failed twice it now gets save in to the extended heartbeat
43
- const failedPayload = retryObj.payload[1].payload
44
- const failedReqType = retryObj.payload[1].request_type
45
-
46
- // save away the dependencies and integration request for extended heartbeat.
47
- if (failedReqType === 'app-integrations-change') {
48
- if (extendedHeartbeatPayload.integrations) {
49
- extendedHeartbeatPayload.integrations.push(failedPayload)
50
- } else {
51
- extendedHeartbeatPayload.integrations = [failedPayload]
52
- }
53
- }
54
- if (failedReqType === 'app-dependencies-loaded') {
55
- if (extendedHeartbeatPayload.dependencies) {
56
- extendedHeartbeatPayload.dependencies.push(failedPayload)
57
- } else {
58
- extendedHeartbeatPayload.dependencies = [failedPayload]
59
- }
60
- }
61
- } else {
62
- retryData = retryObj
63
- }
64
- } else {
65
- retryData = null
66
- }
67
- }
68
-
69
- function getIntegrations () {
70
- const newIntegrations = []
71
- for (const pluginName in pluginManager._pluginsByName) {
72
- if (sentIntegrations.has(pluginName)) {
73
- continue
74
- }
75
- newIntegrations.push({
76
- name: pluginName,
77
- enabled: pluginManager._pluginsByName[pluginName]._enabled,
78
- auto_enabled: true
79
- })
80
- sentIntegrations.add(pluginName)
81
- }
82
- return newIntegrations
83
- }
84
-
85
- function getProducts (config) {
86
- const products = {
87
- appsec: {
88
- enabled: config.appsec.enabled
89
- },
90
- profiler: {
91
- version: tracerVersion,
92
- enabled: profilingEnabledToBoolean(config.profiling.enabled)
93
- }
94
- }
95
- if (errors.profilingError) {
96
- products.profiler.error = errors.profilingError
97
- errors.profilingError = {}
98
- }
99
- return products
100
- }
101
-
102
- function getInstallSignature (config) {
103
- const { installSignature: sig } = config
104
- if (sig && (sig.id || sig.time || sig.type)) {
105
- return {
106
- install_id: sig.id,
107
- install_time: sig.time,
108
- install_type: sig.type
109
- }
110
- }
111
- }
112
-
113
- function appStarted (config) {
114
- const app = {
115
- products: getProducts(config),
116
- configuration: configWithOrigin
117
- }
118
- const installSignature = getInstallSignature(config)
119
- if (installSignature) {
120
- app.install_signature = installSignature
121
- }
122
- // TODO: add app.error with correct error codes
123
- // if (errors.agentError) {
124
- // app.error = errors.agentError
125
- // errors.agentError = {}
126
- // }
127
- return app
128
- }
129
-
130
- function appClosing () {
131
- if (!config?.telemetry?.enabled) {
132
- return
133
- }
134
- // Give chance to listeners to update metrics before shutting down.
135
- telemetryAppClosingChannel.publish()
136
- const { reqType, payload } = createPayload('app-closing')
137
- sendData(config, application, host, reqType, payload)
138
- // We flush before shutting down.
139
- metricsManager.send(config, application, host)
140
- telemetryLogger.send(config, application, host)
141
- }
142
-
143
- function onBeforeExit () {
144
- process.removeListener('beforeExit', onBeforeExit)
145
- appClosing()
146
- }
147
-
148
- function createAppObject (config) {
149
- return {
150
- service_name: config.service,
151
- env: config.env,
152
- service_version: config.version,
153
- tracer_version: tracerVersion,
154
- language_name: 'nodejs',
155
- language_version: process.versions.node
156
- }
157
- }
158
-
159
- function createHostObject () {
160
- const osName = os.type()
161
-
162
- if (osName === 'Linux' || osName === 'Darwin') {
163
- return {
164
- hostname: os.hostname(),
165
- os: osName,
166
- architecture: os.arch(),
167
- kernel_version: os.version(),
168
- kernel_release: os.release(),
169
- kernel_name: osName
170
- }
171
- }
172
-
173
- if (osName === 'Windows_NT') {
174
- return {
175
- hostname: os.hostname(),
176
- os: osName,
177
- architecture: os.arch(),
178
- os_version: os.version()
179
- }
180
- }
181
-
182
- return {
183
- hostname: os.hostname(), // TODO is this enough?
184
- os: osName
185
- }
186
- }
187
-
188
- function getTelemetryData () {
189
- return { config, application, host, heartbeatInterval }
6
+ return Object.setPrototypeOf(module.exports, active)
190
7
  }
191
8
 
192
- function createBatchPayload (payload) {
193
- const batchPayload = payload.map(item => {
194
- return {
195
- request_type: item.reqType,
196
- payload: item.payload
197
- }
198
- })
199
-
200
- return batchPayload
201
- }
202
-
203
- function createPayload (currReqType, currPayload = {}) {
204
- if (getRetryData()) {
205
- const payload = { reqType: currReqType, payload: currPayload }
206
- const batchPayload = createBatchPayload([payload, retryData])
207
- return { reqType: 'message-batch', payload: batchPayload }
208
- }
209
-
210
- return { reqType: currReqType, payload: currPayload }
9
+ const inactive = {
10
+ start (config, ...args) {
11
+ return config?.telemetry?.enabled && activate().start(config, ...args)
12
+ },
13
+ stop () {},
14
+ // This might be called before `start` so we have to trigger loading the
15
+ // underlying module here as well.
16
+ updateConfig (changes, config, ...args) {
17
+ return config?.telemetry?.enabled && activate().updateConfig(changes, config, ...args)
18
+ },
19
+ updateIntegrations () {},
20
+ appClosing () {}
211
21
  }
212
22
 
213
- function heartbeat (config, application, host) {
214
- heartbeatTimeout = setTimeout(() => {
215
- metricsManager.send(config, application, host)
216
- telemetryLogger.send(config, application, host)
217
-
218
- const { reqType, payload } = createPayload('app-heartbeat')
219
- sendData(config, application, host, reqType, payload, updateRetryData)
220
- heartbeat(config, application, host)
221
- }, heartbeatInterval).unref()
222
- return heartbeatTimeout
223
- }
224
-
225
- function extendedHeartbeat (config) {
226
- extendedInterval = setInterval(() => {
227
- const appPayload = appStarted(config)
228
- const payload = {
229
- ...appPayload,
230
- ...extendedHeartbeatPayload
231
- }
232
- sendData(config, application, host, 'app-extended-heartbeat', payload)
233
- Object.keys(extendedHeartbeatPayload).forEach(key => delete extendedHeartbeatPayload[key])
234
- }, 1000 * 60 * 60 * 24).unref()
235
- return extendedInterval
236
- }
237
-
238
- function start (aConfig, thePluginManager) {
239
- if (!aConfig.telemetry.enabled) {
240
- if (aConfig.sca?.enabled) {
241
- logger.warn('DD_APPSEC_SCA_ENABLED requires enabling telemetry to work.')
242
- }
243
-
244
- return
245
- }
246
- config = aConfig
247
- pluginManager = thePluginManager
248
- application = createAppObject(config)
249
- host = createHostObject()
250
- heartbeatInterval = config.telemetry.heartbeatInterval
251
- integrations = getIntegrations()
252
-
253
- dependencies.start(config, application, host, getRetryData, updateRetryData)
254
- telemetryLogger.start(config)
255
-
256
- sendData(config, application, host, 'app-started', appStarted(config))
257
-
258
- if (integrations.length > 0) {
259
- sendData(config, application, host, 'app-integrations-change',
260
- { integrations }, updateRetryData)
261
- }
262
-
263
- heartbeat(config, application, host)
264
-
265
- extendedHeartbeat(config)
266
-
267
- process.on('beforeExit', onBeforeExit)
268
- telemetryStartChannel.publish(getTelemetryData())
269
- }
270
-
271
- function stop () {
272
- if (!config) {
273
- return
274
- }
275
- clearInterval(extendedInterval)
276
- clearTimeout(heartbeatTimeout)
277
- process.removeListener('beforeExit', onBeforeExit)
278
-
279
- telemetryStopChannel.publish(getTelemetryData())
280
-
281
- config = undefined
282
- }
283
-
284
- function updateIntegrations () {
285
- if (!config || !config.telemetry.enabled) {
286
- return
287
- }
288
- const integrations = getIntegrations()
289
- if (integrations.length === 0) {
290
- return
291
- }
292
-
293
- const { reqType, payload } = createPayload('app-integrations-change', { integrations })
294
-
295
- sendData(config, application, host, reqType, payload, updateRetryData)
296
- }
297
-
298
- function formatMapForTelemetry (map) {
299
- // format from an object to a string map in order for
300
- // telemetry intake to accept the configuration
301
- return map
302
- ? Object.entries(map).map(([key, value]) => `${key}:${value}`).join(',')
303
- : ''
304
- }
305
-
306
- function updateConfig (changes, config) {
307
- if (!config.telemetry.enabled) return
308
- if (changes.length === 0) return
309
-
310
- logger.trace(changes)
311
-
312
- const application = createAppObject(config)
313
- const host = createHostObject()
314
-
315
- const nameMapping = {
316
- sampleRate: 'DD_TRACE_SAMPLE_RATE',
317
- logInjection: 'DD_LOG_INJECTION',
318
- headerTags: 'DD_TRACE_HEADER_TAGS',
319
- tags: 'DD_TAGS',
320
- 'sampler.rules': 'DD_TRACE_SAMPLING_RULES',
321
- traceEnabled: 'DD_TRACE_ENABLED',
322
- url: 'DD_TRACE_AGENT_URL',
323
- 'sampler.rateLimit': 'DD_TRACE_RATE_LIMIT',
324
- queryStringObfuscation: 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP',
325
- version: 'DD_VERSION',
326
- env: 'DD_ENV',
327
- service: 'DD_SERVICE',
328
- clientIpHeader: 'DD_TRACE_CLIENT_IP_HEADER',
329
- 'grpc.client.error.statuses': 'DD_GRPC_CLIENT_ERROR_STATUSES',
330
- 'grpc.server.error.statuses': 'DD_GRPC_SERVER_ERROR_STATUSES',
331
- traceId128BitLoggingEnabled: 'DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED'
332
- }
333
-
334
- const namesNeedFormatting = new Set(['DD_TAGS', 'peerServiceMapping', 'serviceMapping'])
335
-
336
- const configuration = []
337
- const names = [] // list of config names whose values have been changed
338
-
339
- for (const change of changes) {
340
- const name = nameMapping[change.name] || change.name
341
-
342
- names.push(name)
343
- const { origin, value } = change
344
- const entry = { name, value, origin }
345
-
346
- if (namesNeedFormatting.has(entry.name)) {
347
- entry.value = formatMapForTelemetry(entry.value)
348
- } else if (entry.name === 'url') {
349
- if (entry.value) {
350
- entry.value = entry.value.toString()
351
- }
352
- } else if (entry.name === 'DD_TRACE_SAMPLING_RULES') {
353
- entry.value = JSON.stringify(entry.value)
354
- } else if (Array.isArray(entry.value)) {
355
- entry.value = value.join(',')
356
- }
357
- configuration.push(entry)
358
- }
359
-
360
- function isNotModified (entry) {
361
- return !names.includes(entry.name)
362
- }
363
-
364
- if (!configWithOrigin.length) {
365
- configWithOrigin = configuration
366
- } else {
367
- // update configWithOrigin to contain up-to-date full list of config values for app-extended-heartbeat
368
- configWithOrigin = configWithOrigin.filter(isNotModified)
369
- configWithOrigin = configWithOrigin.concat(configuration)
370
- const { reqType, payload } = createPayload('app-client-configuration-change', { configuration })
371
- sendData(config, application, host, reqType, payload, updateRetryData)
372
- }
373
- }
374
-
375
- function profilingEnabledToBoolean (profilingEnabled) {
376
- if (typeof profilingEnabled === 'boolean') {
377
- return profilingEnabled
378
- }
379
- if (['auto', 'true'].includes(profilingEnabled)) {
380
- return true
381
- }
382
- if (profilingEnabled === 'false') {
383
- return false
384
- }
385
- return undefined
386
- }
387
-
388
- module.exports = {
389
- start,
390
- stop,
391
- updateIntegrations,
392
- updateConfig,
393
- appClosing
394
- }
23
+ module.exports = Object.setPrototypeOf({}, inactive)