dd-trace 5.96.0 → 5.98.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 (173) hide show
  1. package/index.d.ts +60 -2
  2. package/package.json +9 -7
  3. package/packages/datadog-esbuild/index.js +20 -9
  4. package/packages/datadog-instrumentations/src/child_process.js +7 -17
  5. package/packages/datadog-instrumentations/src/crypto.js +1 -2
  6. package/packages/datadog-instrumentations/src/cucumber.js +69 -4
  7. package/packages/datadog-instrumentations/src/cypress-config.js +318 -0
  8. package/packages/datadog-instrumentations/src/cypress.js +86 -4
  9. package/packages/datadog-instrumentations/src/dns.js +1 -2
  10. package/packages/datadog-instrumentations/src/express.js +4 -4
  11. package/packages/datadog-instrumentations/src/fs.js +27 -29
  12. package/packages/datadog-instrumentations/src/graphql.js +1 -1
  13. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +41 -13
  14. package/packages/datadog-instrumentations/src/helpers/hook.js +31 -6
  15. package/packages/datadog-instrumentations/src/helpers/hooks.js +12 -19
  16. package/packages/datadog-instrumentations/src/helpers/instrument.js +27 -13
  17. package/packages/datadog-instrumentations/src/helpers/register.js +103 -142
  18. package/packages/datadog-instrumentations/src/http/client.js +2 -3
  19. package/packages/datadog-instrumentations/src/http/server.js +2 -5
  20. package/packages/datadog-instrumentations/src/http2/client.js +1 -3
  21. package/packages/datadog-instrumentations/src/http2/server.js +1 -3
  22. package/packages/datadog-instrumentations/src/jest.js +117 -16
  23. package/packages/datadog-instrumentations/src/limitd-client.js +1 -1
  24. package/packages/datadog-instrumentations/src/mocha/utils.js +12 -1
  25. package/packages/datadog-instrumentations/src/net.js +2 -8
  26. package/packages/datadog-instrumentations/src/pino.js +1 -1
  27. package/packages/datadog-instrumentations/src/playwright.js +4 -1
  28. package/packages/datadog-instrumentations/src/prisma.js +1 -2
  29. package/packages/datadog-instrumentations/src/redis.js +12 -6
  30. package/packages/datadog-instrumentations/src/selenium.js +4 -1
  31. package/packages/datadog-instrumentations/src/sequelize.js +1 -1
  32. package/packages/datadog-instrumentations/src/url.js +1 -3
  33. package/packages/datadog-instrumentations/src/vitest.js +5 -1
  34. package/packages/datadog-instrumentations/src/vm.js +1 -3
  35. package/packages/datadog-plugin-aws-sdk/src/base.js +5 -4
  36. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +1 -0
  37. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -0
  38. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -0
  39. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +1 -0
  40. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -0
  41. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -0
  42. package/packages/datadog-plugin-cucumber/src/index.js +13 -3
  43. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +166 -6
  44. package/packages/datadog-plugin-cypress/src/index.js +59 -2
  45. package/packages/datadog-plugin-fs/src/index.js +1 -1
  46. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +2 -1
  47. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +2 -7
  48. package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
  49. package/packages/datadog-plugin-http/src/client.js +1 -1
  50. package/packages/datadog-plugin-http/src/server.js +10 -2
  51. package/packages/datadog-plugin-http2/src/client.js +1 -1
  52. package/packages/datadog-plugin-http2/src/server.js +10 -2
  53. package/packages/datadog-plugin-jest/src/index.js +4 -2
  54. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +31 -4
  55. package/packages/datadog-plugin-mocha/src/index.js +5 -2
  56. package/packages/datadog-plugin-mongodb-core/src/index.js +3 -3
  57. package/packages/datadog-plugin-mysql/src/index.js +1 -1
  58. package/packages/datadog-plugin-next/src/index.js +10 -16
  59. package/packages/datadog-plugin-openai/src/services.js +1 -0
  60. package/packages/datadog-plugin-pg/src/index.js +1 -1
  61. package/packages/datadog-plugin-tedious/src/index.js +1 -1
  62. package/packages/datadog-plugin-ws/src/close.js +1 -1
  63. package/packages/datadog-plugin-ws/src/receiver.js +1 -1
  64. package/packages/datadog-webpack/index.js +3 -3
  65. package/packages/dd-trace/index.js +12 -10
  66. package/packages/dd-trace/src/agent/url.js +2 -2
  67. package/packages/dd-trace/src/aiguard/sdk.js +26 -22
  68. package/packages/dd-trace/src/appsec/blocked_templates.js +4 -3
  69. package/packages/dd-trace/src/appsec/blocking.js +64 -33
  70. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +1 -1
  71. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +1 -1
  72. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +1 -1
  73. package/packages/dd-trace/src/appsec/remote_config.js +1 -0
  74. package/packages/dd-trace/src/appsec/sdk/index.js +4 -0
  75. package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
  76. package/packages/dd-trace/src/appsec/sdk/track_event.js +5 -5
  77. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  78. package/packages/dd-trace/src/appsec/sdk/utils.js +4 -2
  79. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +6 -1
  80. package/packages/dd-trace/src/ci-visibility/test-api-manual/test-api-manual-plugin.js +4 -0
  81. package/packages/dd-trace/src/config/defaults.js +315 -146
  82. package/packages/dd-trace/src/config/generated-config-types.d.ts +9 -1
  83. package/packages/dd-trace/src/config/helper.js +59 -10
  84. package/packages/dd-trace/src/config/index.js +587 -1496
  85. package/packages/dd-trace/src/config/parsers.js +256 -0
  86. package/packages/dd-trace/src/config/remote_config.js +59 -2
  87. package/packages/dd-trace/src/config/supported-configurations.json +406 -432
  88. package/packages/dd-trace/src/constants.js +1 -0
  89. package/packages/dd-trace/src/crashtracking/crashtracker.js +7 -1
  90. package/packages/dd-trace/src/crashtracking/index.js +1 -7
  91. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +5 -2
  92. package/packages/dd-trace/src/debugger/index.js +1 -1
  93. package/packages/dd-trace/src/dogstatsd.js +12 -9
  94. package/packages/dd-trace/src/encode/0.4.js +8 -7
  95. package/packages/dd-trace/src/encode/span-stats.js +4 -1
  96. package/packages/dd-trace/src/exporters/agent/writer.js +7 -1
  97. package/packages/dd-trace/src/exporters/common/request.js +9 -0
  98. package/packages/dd-trace/src/exporters/common/writer.js +12 -2
  99. package/packages/dd-trace/src/heap_snapshots.js +3 -0
  100. package/packages/dd-trace/src/index.js +5 -2
  101. package/packages/dd-trace/src/lambda/runtime/ritm.js +6 -6
  102. package/packages/dd-trace/src/llmobs/index.js +4 -1
  103. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +5 -1
  104. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +60 -12
  105. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +4 -2
  106. package/packages/dd-trace/src/llmobs/sdk.js +12 -8
  107. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  108. package/packages/dd-trace/src/llmobs/tagger.js +9 -6
  109. package/packages/dd-trace/src/llmobs/writers/base.js +2 -0
  110. package/packages/dd-trace/src/llmobs/writers/util.js +3 -0
  111. package/packages/dd-trace/src/log/index.js +20 -59
  112. package/packages/dd-trace/src/log/writer.js +7 -19
  113. package/packages/dd-trace/src/noop/proxy.js +8 -0
  114. package/packages/dd-trace/src/openfeature/remote_config.js +6 -1
  115. package/packages/dd-trace/src/opentelemetry/context_manager.js +6 -4
  116. package/packages/dd-trace/src/opentelemetry/logs/index.js +1 -1
  117. package/packages/dd-trace/src/opentelemetry/metrics/index.js +1 -1
  118. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +17 -2
  119. package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +14 -2
  120. package/packages/dd-trace/src/opentelemetry/otlp/trace.proto +358 -0
  121. package/packages/dd-trace/src/opentelemetry/otlp/trace_service.proto +78 -0
  122. package/packages/dd-trace/src/opentelemetry/trace/index.js +75 -0
  123. package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +66 -0
  124. package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +332 -0
  125. package/packages/dd-trace/src/opentracing/propagation/text_map.js +9 -4
  126. package/packages/dd-trace/src/opentracing/tracer.js +9 -4
  127. package/packages/dd-trace/src/payload-tagging/config/index.js +6 -5
  128. package/packages/dd-trace/src/plugin_manager.js +8 -6
  129. package/packages/dd-trace/src/plugins/ci_plugin.js +4 -0
  130. package/packages/dd-trace/src/plugins/log_plugin.js +3 -0
  131. package/packages/dd-trace/src/plugins/plugin.js +11 -13
  132. package/packages/dd-trace/src/plugins/storage.js +2 -2
  133. package/packages/dd-trace/src/plugins/tracing.js +22 -5
  134. package/packages/dd-trace/src/plugins/util/test.js +2 -0
  135. package/packages/dd-trace/src/plugins/util/web.js +6 -88
  136. package/packages/dd-trace/src/process-tags/index.js +3 -0
  137. package/packages/dd-trace/src/profiler.js +27 -2
  138. package/packages/dd-trace/src/profiling/config.js +73 -241
  139. package/packages/dd-trace/src/profiling/exporter_cli.js +1 -4
  140. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +6 -2
  141. package/packages/dd-trace/src/profiling/profiler.js +78 -109
  142. package/packages/dd-trace/src/profiling/profilers/events.js +2 -3
  143. package/packages/dd-trace/src/profiling/profilers/wall.js +89 -6
  144. package/packages/dd-trace/src/profiling/ssi-heuristics.js +4 -1
  145. package/packages/dd-trace/src/propagation-hash/index.js +2 -1
  146. package/packages/dd-trace/src/proxy.js +40 -6
  147. package/packages/dd-trace/src/remote_config/index.js +3 -0
  148. package/packages/dd-trace/src/require-package-json.js +8 -4
  149. package/packages/dd-trace/src/ritm.js +58 -26
  150. package/packages/dd-trace/src/runtime_metrics/index.js +3 -0
  151. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +18 -11
  152. package/packages/dd-trace/src/sampler.js +1 -1
  153. package/packages/dd-trace/src/service-naming/index.js +1 -1
  154. package/packages/dd-trace/src/service-naming/schemas/definition.js +4 -1
  155. package/packages/dd-trace/src/service-naming/schemas/util.js +15 -1
  156. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +24 -1
  157. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +60 -0
  158. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +17 -1
  159. package/packages/dd-trace/src/service-naming/schemas/v0/websocket.js +5 -0
  160. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +17 -0
  161. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +11 -1
  162. package/packages/dd-trace/src/service-naming/schemas/v1/websocket.js +6 -0
  163. package/packages/dd-trace/src/span_stats.js +5 -1
  164. package/packages/dd-trace/src/standalone/index.js +3 -0
  165. package/packages/dd-trace/src/telemetry/index.js +2 -3
  166. package/packages/dd-trace/src/telemetry/send-data.js +5 -19
  167. package/packages/dd-trace/src/telemetry/session-propagation.js +19 -44
  168. package/packages/dd-trace/src/telemetry/telemetry.js +28 -171
  169. package/packages/dd-trace/src/tracer.js +2 -2
  170. package/packages/dd-trace/src/util.js +0 -9
  171. package/vendor/dist/@apm-js-collab/code-transformer/index.js +28 -6
  172. package/vendor/dist/protobufjs/index.js +1 -1
  173. package/packages/dd-trace/src/log/utils.js +0 -16
@@ -1,5 +1,7 @@
1
1
  'use strict'
2
2
 
3
+ const { optionServiceSource } = require('../util')
4
+
3
5
  function configWithFallback ({ tracerService, pluginConfig }) {
4
6
  return pluginConfig.service || tracerService
5
7
  }
@@ -7,11 +9,13 @@ function configWithFallback ({ tracerService, pluginConfig }) {
7
9
  const redisNaming = {
8
10
  opName: () => 'redis.command',
9
11
  serviceName: configWithFallback,
12
+ serviceSource: optionServiceSource,
10
13
  }
11
14
 
12
15
  const mySQLNaming = {
13
16
  opName: () => 'mysql.query',
14
17
  serviceName: withFunction,
18
+ serviceSource: optionServiceSource,
15
19
  }
16
20
 
17
21
  function withFunction ({ tracerService, pluginConfig, params }) {
@@ -27,58 +31,71 @@ const storage = {
27
31
  aerospike: {
28
32
  opName: () => 'aerospike.command',
29
33
  serviceName: configWithFallback,
34
+ serviceSource: optionServiceSource,
30
35
  },
31
36
  'cassandra-driver': {
32
37
  opName: () => 'cassandra.query',
33
38
  serviceName: configWithFallback,
39
+ serviceSource: optionServiceSource,
34
40
  },
35
41
  couchbase: {
36
42
  opName: () => 'couchbase.query',
37
43
  serviceName: configWithFallback,
44
+ serviceSource: optionServiceSource,
38
45
  },
39
46
  elasticsearch: {
40
47
  opName: () => 'elasticsearch.query',
41
48
  serviceName: configWithFallback,
49
+ serviceSource: optionServiceSource,
42
50
  },
43
51
  ioredis: redisNaming,
44
52
  iovalkey: {
45
53
  opName: () => 'valkey.command',
46
54
  serviceName: configWithFallback,
55
+ serviceSource: optionServiceSource,
47
56
  },
48
57
  mariadb: {
49
58
  opName: () => 'mariadb.query',
50
59
  serviceName: withFunction,
60
+ serviceSource: optionServiceSource,
51
61
  },
52
62
  memcached: {
53
63
  opName: () => 'memcached.command',
54
64
  serviceName: configWithFallback,
65
+ serviceSource: optionServiceSource,
55
66
  },
56
67
  'mongodb-core': {
57
68
  opName: () => 'mongodb.query',
58
69
  serviceName: configWithFallback,
70
+ serviceSource: optionServiceSource,
59
71
  },
60
72
  mysql: mySQLNaming,
61
73
  mysql2: mySQLNaming,
62
74
  opensearch: {
63
75
  opName: () => 'opensearch.query',
64
76
  serviceName: configWithFallback,
77
+ serviceSource: optionServiceSource,
65
78
  },
66
79
  oracledb: {
67
80
  opName: () => 'oracle.query',
68
81
  serviceName: withFunction,
82
+ serviceSource: optionServiceSource,
69
83
  },
70
84
  pg: {
71
85
  opName: () => 'postgresql.query',
72
86
  serviceName: withFunction,
87
+ serviceSource: optionServiceSource,
73
88
  },
74
89
  prisma: {
75
90
  opName: ({ operation }) => `prisma.${operation}`,
76
91
  serviceName: configWithFallback,
92
+ serviceSource: optionServiceSource,
77
93
  },
78
94
  redis: redisNaming,
79
95
  tedious: {
80
96
  opName: () => 'mssql.query',
81
97
  serviceName: configWithFallback,
98
+ serviceSource: optionServiceSource,
82
99
  },
83
100
  },
84
101
  }
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { identityService, httpPluginClientService } = require('../util')
3
+ const { identityService, httpPluginClientService, optionServiceSource } = require('../util')
4
4
 
5
5
  const web = {
6
6
  client: {
@@ -15,18 +15,22 @@ const web = {
15
15
  http: {
16
16
  opName: () => 'http.client.request',
17
17
  serviceName: httpPluginClientService,
18
+ serviceSource: optionServiceSource,
18
19
  },
19
20
  genai: {
20
21
  opName: () => 'google_genai.request',
21
22
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
23
+ serviceSource: optionServiceSource,
22
24
  },
23
25
  fetch: {
24
26
  opName: () => 'http.client.request',
25
27
  serviceName: httpPluginClientService,
28
+ serviceSource: optionServiceSource,
26
29
  },
27
30
  http2: {
28
31
  opName: () => 'http.client.request',
29
32
  serviceName: httpPluginClientService,
33
+ serviceSource: optionServiceSource,
30
34
  },
31
35
  aws: {
32
36
  opName: ({ awsService }) => `aws.${awsService}.request`,
@@ -45,26 +49,32 @@ const web = {
45
49
  'apollo.gateway.request': {
46
50
  opName: () => 'apollo.gateway.request',
47
51
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
52
+ serviceSource: optionServiceSource,
48
53
  },
49
54
  'apollo.gateway.plan': {
50
55
  opName: () => 'apollo.gateway.plan',
51
56
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
57
+ serviceSource: optionServiceSource,
52
58
  },
53
59
  'apollo.gateway.validate': {
54
60
  opName: () => 'apollo.gateway.validate',
55
61
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
62
+ serviceSource: optionServiceSource,
56
63
  },
57
64
  'apollo.gateway.execute': {
58
65
  opName: () => 'apollo.gateway.execute',
59
66
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
67
+ serviceSource: optionServiceSource,
60
68
  },
61
69
  'apollo.gateway.fetch': {
62
70
  opName: () => 'apollo.gateway.fetch',
63
71
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
72
+ serviceSource: optionServiceSource,
64
73
  },
65
74
  'apollo.gateway.postprocessing': {
66
75
  opName: () => 'apollo.gateway.postprocessing',
67
76
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
77
+ serviceSource: optionServiceSource,
68
78
  },
69
79
  grpc: {
70
80
  opName: () => 'grpc.server.request',
@@ -1,28 +1,34 @@
1
1
  'use strict'
2
2
 
3
+ const { optionServiceSource } = require('../util')
4
+
3
5
  const websocket = {
4
6
  request: {
5
7
  ws: {
6
8
  opName: () => 'web.request',
7
9
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
10
+ serviceSource: optionServiceSource,
8
11
  },
9
12
  },
10
13
  producer: {
11
14
  ws: {
12
15
  opName: () => 'websocket.send',
13
16
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
17
+ serviceSource: optionServiceSource,
14
18
  },
15
19
  },
16
20
  consumer: {
17
21
  ws: {
18
22
  opName: () => 'websocket.receive',
19
23
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
24
+ serviceSource: optionServiceSource,
20
25
  },
21
26
  },
22
27
  close: {
23
28
  ws: {
24
29
  opName: () => 'websocket.close',
25
30
  serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService,
31
+ serviceSource: optionServiceSource,
26
32
  },
27
33
  },
28
34
  }
@@ -11,7 +11,7 @@ const {
11
11
  HTTP_ROUTE,
12
12
  HTTP_METHOD,
13
13
  } = require('../../../ext/tags')
14
- const { ORIGIN_KEY, TOP_LEVEL_KEY } = require('./constants')
14
+ const { ORIGIN_KEY, TOP_LEVEL_KEY, SVC_SRC_KEY } = require('./constants')
15
15
  const { version } = require('./pkg')
16
16
  const processTags = require('./process-tags')
17
17
 
@@ -60,6 +60,7 @@ class SpanAggStats {
60
60
  synthetics,
61
61
  method,
62
62
  endpoint,
63
+ srvSrc,
63
64
  } = this.aggKey
64
65
 
65
66
  return {
@@ -71,6 +72,7 @@ class SpanAggStats {
71
72
  Synthetics: synthetics,
72
73
  HTTPMethod: method,
73
74
  HTTPEndpoint: endpoint,
75
+ srv_src: srvSrc,
74
76
  Hits: this.hits,
75
77
  TopLevelHits: this.topLevelHits,
76
78
  Errors: this.errors,
@@ -91,6 +93,7 @@ class SpanAggKey {
91
93
  this.synthetics = span.meta[ORIGIN_KEY] === 'synthetics'
92
94
  this.endpoint = span.meta[HTTP_ROUTE] || span.meta[HTTP_ENDPOINT] || ''
93
95
  this.method = span.meta[HTTP_METHOD] || ''
96
+ this.srvSrc = span.meta[SVC_SRC_KEY] || ''
94
97
  }
95
98
 
96
99
  toString () {
@@ -103,6 +106,7 @@ class SpanAggKey {
103
106
  this.synthetics,
104
107
  this.method,
105
108
  this.endpoint,
109
+ this.srvSrc,
106
110
  ].join(',')
107
111
  }
108
112
  }
@@ -11,6 +11,9 @@ const startCh = channel('dd-trace:span:start')
11
11
  const injectCh = channel('dd-trace:span:inject')
12
12
  const extractCh = channel('dd-trace:span:extract')
13
13
 
14
+ /**
15
+ * @param {import('../config/config-base')} config - Tracer configuration
16
+ */
14
17
  function configure (config) {
15
18
  if (startCh.hasSubscribers) startCh.unsubscribe(onSpanStart)
16
19
  if (injectCh.hasSubscribers) injectCh.unsubscribe(onSpanInject)
@@ -5,15 +5,14 @@ let telemetry
5
5
  // Lazy load the telemetry module to avoid the performance impact of loading it unconditionally
6
6
  module.exports = {
7
7
  start (config, ...args) {
8
+ if (!config.telemetry.enabled) return
8
9
  telemetry ??= require('./telemetry')
9
10
  telemetry.start(config, ...args)
10
11
  },
11
- stop () {
12
- telemetry?.stop()
13
- },
14
12
  // This might be called before `start` so we have to trigger loading the
15
13
  // underlying module here as well.
16
14
  updateConfig (changes, config, ...args) {
15
+ if (!config.telemetry.enabled) return
17
16
  telemetry ??= require('./telemetry')
18
17
  telemetry.updateConfig(changes, config, ...args)
19
18
  },
@@ -62,19 +62,6 @@ const { getValueFromEnvSources } = require('../config/helper')
62
62
  * kernel_name?: string
63
63
  * } & Record<string, unknown>} TelemetryHost
64
64
  */
65
- /**
66
- * @typedef {{
67
- * hostname?: string,
68
- * port?: string | number,
69
- * url?: string | URL,
70
- * site?: string,
71
- * apiKey?: string,
72
- * isCiVisibility?: boolean,
73
- * spanAttributeSchema?: string,
74
- * tags: Record<string, string>,
75
- * telemetry?: { debug?: boolean }
76
- * }} TelemetryConfig
77
- */
78
65
  /**
79
66
  * @callback SendDataCallback
80
67
  * @param {Error | null | undefined} error
@@ -85,23 +72,22 @@ const { getValueFromEnvSources } = require('../config/helper')
85
72
  let agentTelemetry = true
86
73
 
87
74
  /**
88
- * @param {TelemetryConfig} config
75
+ * @param {import('../config/config-base')} config
89
76
  * @param {TelemetryApplication} application
90
77
  * @param {TelemetryRequestType} reqType
91
78
  * @returns {Record<string, string>}
92
79
  */
93
80
  function getHeaders (config, application, reqType) {
94
- const sessionId = config.tags['runtime-id']
95
81
  const headers = {
96
82
  'content-type': 'application/json',
97
83
  'dd-telemetry-api-version': 'v2',
98
84
  'dd-telemetry-request-type': reqType,
99
85
  'dd-client-library-language': application.language_name,
100
86
  'dd-client-library-version': application.tracer_version,
101
- 'dd-session-id': sessionId,
87
+ 'dd-session-id': config.tags['runtime-id'],
102
88
  }
103
- if (config.rootSessionId && config.rootSessionId !== sessionId) {
104
- headers['dd-root-session-id'] = config.rootSessionId
89
+ if (config.DD_ROOT_JS_SESSION_ID) {
90
+ headers['dd-root-session-id'] = config.DD_ROOT_JS_SESSION_ID
105
91
  }
106
92
  const debug = config.telemetry && config.telemetry.debug
107
93
  if (debug) {
@@ -141,7 +127,7 @@ function getPayload (payload) {
141
127
 
142
128
  // TODO(BridgeAR): Simplify this code. A lot does not need to be recalculated on every call.
143
129
  /**
144
- * @param {TelemetryConfig} config
130
+ * @param {import('../config/config-base')} config
145
131
  * @param {TelemetryApplication} application
146
132
  * @param {TelemetryHost} host
147
133
  * @param {TelemetryRequestType} reqType
@@ -1,53 +1,37 @@
1
1
  'use strict'
2
2
 
3
- const dc = require('dc-polyfill')
4
-
3
+ const dc = /** @type {typeof import('diagnostics_channel')} */ (require('dc-polyfill'))
5
4
  const childProcessChannel = dc.tracingChannel('datadog:child_process:execution')
6
5
 
7
6
  let subscribed = false
8
- let rootSessionId
9
7
  let runtimeId
10
8
 
11
- function injectSessionEnv (existingEnv) {
12
- // eslint-disable-next-line eslint-rules/eslint-process-env -- not in supported-configurations.json
13
- const base = existingEnv == null ? process.env : existingEnv
14
- return {
15
- ...base,
16
- DD_ROOT_JS_SESSION_ID: rootSessionId,
17
- DD_PARENT_JS_SESSION_ID: runtimeId,
18
- }
9
+ function isOptionsObject (value) {
10
+ return value != null && typeof value === 'object' && !Array.isArray(value) && value
19
11
  }
20
12
 
21
- function findOptionsIndex (args, shell) {
22
- if (Array.isArray(args[1])) {
23
- return { index: 2, exists: args[2] != null && typeof args[2] === 'object' }
24
- }
25
- if (args[1] != null && typeof args[1] === 'object') {
26
- return { index: 1, exists: true }
27
- }
28
- if (!shell && args[2] != null && typeof args[2] === 'object') {
29
- return { index: 2, exists: true }
30
- }
31
- return { index: shell ? 1 : 2, exists: false }
13
+ function getEnvWithRuntimeId (env) {
14
+ // eslint-disable-next-line eslint-rules/eslint-process-env
15
+ return { ...(env ?? process.env), DD_ROOT_JS_SESSION_ID: runtimeId }
32
16
  }
33
17
 
34
18
  function onChildProcessStart (context) {
35
- if (!context.callArgs) return
36
-
37
19
  const args = context.callArgs
38
- const { index, exists } = findOptionsIndex(args, context.shell)
20
+ if (!args) return
39
21
 
40
- if (exists) {
41
- args[index] = { ...args[index], env: injectSessionEnv(args[index].env) }
22
+ const index = Array.isArray(args[1]) || (!context.shell && !isOptionsObject(args[1])) ? 2 : 1
23
+ const options = isOptionsObject(args[index]) ? args[index] : undefined
24
+
25
+ if (options) {
26
+ args[index] = { ...options, env: getEnvWithRuntimeId(options.env) }
42
27
  return
43
28
  }
44
29
 
45
- const opts = { env: injectSessionEnv(null) }
46
-
47
- if (!context.shell && !Array.isArray(args[1])) {
30
+ if (index === 2 && !Array.isArray(args[1])) {
48
31
  args.splice(1, 0, [])
49
32
  }
50
33
 
34
+ const opts = { env: getEnvWithRuntimeId() }
51
35
  if (typeof args[index] === 'function') {
52
36
  args.splice(index, 0, opts)
53
37
  } else {
@@ -55,24 +39,15 @@ function onChildProcessStart (context) {
55
39
  }
56
40
  }
57
41
 
58
- const handler = { start: onChildProcessStart }
59
-
60
42
  function start (config) {
61
43
  if (!config.telemetry?.enabled || subscribed) return
62
44
  subscribed = true
63
45
 
64
- rootSessionId = config.rootSessionId
65
- runtimeId = config.tags['runtime-id']
66
-
67
- childProcessChannel.subscribe(handler)
68
- }
46
+ runtimeId = config.DD_ROOT_JS_SESSION_ID || config.tags['runtime-id']
69
47
 
70
- function stop () {
71
- if (!subscribed) return
72
- childProcessChannel.unsubscribe(handler)
73
- subscribed = false
74
- rootSessionId = undefined
75
- runtimeId = undefined
48
+ childProcessChannel.subscribe(
49
+ /** @type {import('diagnostics_channel').TracingChannelSubscribers<object>} */ ({ start: onChildProcessStart })
50
+ )
76
51
  }
77
52
 
78
- module.exports = { start, stop, _onChildProcessStart: onChildProcessStart }
53
+ module.exports = { start }