dd-trace 5.82.0 → 5.84.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 (150) hide show
  1. package/LICENSE-3rdparty.csv +77 -79
  2. package/ci/init.js +6 -6
  3. package/index.d.ts +213 -4
  4. package/loader-hook.mjs +1 -1
  5. package/package.json +59 -56
  6. package/packages/datadog-core/src/storage.js +7 -7
  7. package/packages/datadog-esbuild/index.js +6 -0
  8. package/packages/datadog-instrumentations/src/ai.js +7 -3
  9. package/packages/datadog-instrumentations/src/child_process.js +1 -1
  10. package/packages/datadog-instrumentations/src/cucumber.js +1 -1
  11. package/packages/datadog-instrumentations/src/graphql.js +1 -1
  12. package/packages/datadog-instrumentations/src/helpers/instrumentations.js +4 -3
  13. package/packages/datadog-instrumentations/src/helpers/register.js +3 -7
  14. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +6 -0
  15. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +2 -1
  16. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +73 -16
  17. package/packages/datadog-instrumentations/src/http/client.js +2 -2
  18. package/packages/datadog-instrumentations/src/jest.js +124 -64
  19. package/packages/datadog-instrumentations/src/koa.js +2 -1
  20. package/packages/datadog-instrumentations/src/light-my-request.js +2 -2
  21. package/packages/datadog-instrumentations/src/mocha/main.js +2 -2
  22. package/packages/datadog-instrumentations/src/mocha/worker.js +1 -1
  23. package/packages/datadog-instrumentations/src/mocha.js +1 -1
  24. package/packages/datadog-instrumentations/src/mysql.js +1 -1
  25. package/packages/datadog-instrumentations/src/mysql2.js +2 -2
  26. package/packages/datadog-instrumentations/src/net.js +13 -5
  27. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  28. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -4
  29. package/packages/datadog-instrumentations/src/pg.js +4 -2
  30. package/packages/datadog-instrumentations/src/playwright.js +15 -11
  31. package/packages/datadog-instrumentations/src/selenium.js +2 -2
  32. package/packages/datadog-instrumentations/src/undici.js +12 -1
  33. package/packages/datadog-plugin-aws-sdk/src/base.js +4 -4
  34. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +2 -2
  35. package/packages/datadog-plugin-azure-service-bus/src/producer.js +2 -2
  36. package/packages/datadog-plugin-cucumber/src/index.js +35 -34
  37. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +2 -2
  38. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -2
  39. package/packages/datadog-plugin-express/src/code_origin.js +21 -15
  40. package/packages/datadog-plugin-fastify/src/code_origin.js +17 -4
  41. package/packages/datadog-plugin-jest/src/index.js +2 -2
  42. package/packages/datadog-plugin-mocha/src/index.js +2 -2
  43. package/packages/datadog-plugin-mongodb-core/src/index.js +2 -2
  44. package/packages/datadog-plugin-playwright/src/index.js +26 -26
  45. package/packages/datadog-plugin-undici/src/index.js +305 -2
  46. package/packages/datadog-plugin-vitest/src/index.js +5 -5
  47. package/packages/datadog-shimmer/src/shimmer.js +2 -5
  48. package/packages/dd-trace/index.js +19 -0
  49. package/packages/dd-trace/src/agent/info.js +57 -0
  50. package/packages/dd-trace/src/agent/url.js +28 -0
  51. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +1 -1
  52. package/packages/dd-trace/src/appsec/index.js +47 -7
  53. package/packages/dd-trace/src/appsec/rasp/index.js +2 -4
  54. package/packages/dd-trace/src/azure_metadata.js +8 -3
  55. package/packages/dd-trace/src/baggage.js +36 -11
  56. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +5 -1
  57. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -2
  58. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -4
  59. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -2
  60. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +5 -5
  61. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
  62. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +5 -11
  63. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +3 -3
  64. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +4 -4
  65. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +1 -1
  66. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -2
  67. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -4
  68. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -4
  69. package/packages/dd-trace/src/ci-visibility/telemetry.js +6 -2
  70. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -2
  71. package/packages/dd-trace/src/{config_defaults.js → config/defaults.js} +3 -3
  72. package/packages/dd-trace/src/{config-helper.js → config/helper.js} +88 -15
  73. package/packages/dd-trace/src/{config.js → config/index.js} +107 -46
  74. package/packages/dd-trace/src/config/remote_config.js +188 -19
  75. package/packages/dd-trace/src/{config_stable.js → config/stable.js} +20 -32
  76. package/packages/dd-trace/src/{supported-configurations.json → config/supported-configurations.json} +3 -1
  77. package/packages/dd-trace/src/crashtracking/crashtracker.js +2 -5
  78. package/packages/dd-trace/src/datastreams/processor.js +1 -1
  79. package/packages/dd-trace/src/datastreams/writer.js +2 -8
  80. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  81. package/packages/dd-trace/src/debugger/devtools_client/config.js +2 -7
  82. package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +10 -11
  83. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -3
  84. package/packages/dd-trace/src/debugger/devtools_client/snapshot/constants.js +1 -1
  85. package/packages/dd-trace/src/debugger/index.js +83 -15
  86. package/packages/dd-trace/src/dogstatsd.js +5 -11
  87. package/packages/dd-trace/src/encode/0.4.js +2 -2
  88. package/packages/dd-trace/src/exporter.js +1 -1
  89. package/packages/dd-trace/src/exporters/agent/index.js +5 -11
  90. package/packages/dd-trace/src/exporters/agent/writer.js +12 -16
  91. package/packages/dd-trace/src/exporters/common/{agent-info-exporter.js → buffering-exporter.js} +10 -37
  92. package/packages/dd-trace/src/exporters/common/docker.js +2 -2
  93. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  94. package/packages/dd-trace/src/exporters/common/util.js +2 -2
  95. package/packages/dd-trace/src/exporters/span-stats/index.js +3 -10
  96. package/packages/dd-trace/src/flare/index.js +1 -1
  97. package/packages/dd-trace/src/guardrails/telemetry.js +1 -1
  98. package/packages/dd-trace/src/index.js +4 -4
  99. package/packages/dd-trace/src/lambda/handler.js +2 -2
  100. package/packages/dd-trace/src/lambda/index.js +2 -2
  101. package/packages/dd-trace/src/lambda/runtime/patch.js +2 -2
  102. package/packages/dd-trace/src/lambda/runtime/ritm.js +2 -2
  103. package/packages/dd-trace/src/llmobs/constants/tags.js +8 -1
  104. package/packages/dd-trace/src/llmobs/index.js +2 -2
  105. package/packages/dd-trace/src/llmobs/noop.js +2 -0
  106. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +3 -4
  107. package/packages/dd-trace/src/llmobs/sdk.js +33 -6
  108. package/packages/dd-trace/src/llmobs/span_processor.js +17 -7
  109. package/packages/dd-trace/src/llmobs/tagger.js +175 -1
  110. package/packages/dd-trace/src/llmobs/writers/base.js +118 -45
  111. package/packages/dd-trace/src/llmobs/writers/spans.js +4 -3
  112. package/packages/dd-trace/src/llmobs/writers/util.js +3 -9
  113. package/packages/dd-trace/src/log/index.js +50 -35
  114. package/packages/dd-trace/src/log/writer.js +13 -78
  115. package/packages/dd-trace/src/noop/proxy.js +3 -3
  116. package/packages/dd-trace/src/openfeature/writers/base.js +9 -16
  117. package/packages/dd-trace/src/openfeature/writers/util.js +3 -8
  118. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +2 -2
  119. package/packages/dd-trace/src/opentelemetry/tracer.js +48 -6
  120. package/packages/dd-trace/src/opentracing/propagation/text_map.js +45 -21
  121. package/packages/dd-trace/src/opentracing/span.js +4 -4
  122. package/packages/dd-trace/src/plugin_manager.js +8 -6
  123. package/packages/dd-trace/src/plugins/util/ci.js +5 -8
  124. package/packages/dd-trace/src/plugins/util/git-cache.js +3 -3
  125. package/packages/dd-trace/src/plugins/util/test.js +1 -1
  126. package/packages/dd-trace/src/plugins/util/user-provided-git.js +41 -43
  127. package/packages/dd-trace/src/profiler.js +4 -39
  128. package/packages/dd-trace/src/profiling/config.js +74 -34
  129. package/packages/dd-trace/src/profiling/exporter_cli.js +5 -5
  130. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  131. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +9 -2
  132. package/packages/dd-trace/src/profiling/index.js +1 -1
  133. package/packages/dd-trace/src/profiling/libuv-size.js +1 -1
  134. package/packages/dd-trace/src/profiling/profiler.js +57 -2
  135. package/packages/dd-trace/src/proxy.js +34 -5
  136. package/packages/dd-trace/src/remote_config/capabilities.js +4 -0
  137. package/packages/dd-trace/src/remote_config/index.js +2 -7
  138. package/packages/dd-trace/src/ritm.js +8 -4
  139. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  140. package/packages/dd-trace/src/serverless.js +2 -2
  141. package/packages/dd-trace/src/span_processor.js +2 -2
  142. package/packages/dd-trace/src/startup-log.js +7 -16
  143. package/packages/dd-trace/src/telemetry/endpoints.js +67 -5
  144. package/packages/dd-trace/src/telemetry/send-data.js +103 -4
  145. package/packages/dd-trace/src/telemetry/telemetry.js +229 -110
  146. package/vendor/dist/@isaacs/ttlcache/index.js +1 -1
  147. package/vendor/dist/esquery/index.js +1 -1
  148. package/vendor/dist/meriyah/index.js +1 -1
  149. package/vendor/dist/protobufjs/index.js +1 -1
  150. /package/packages/dd-trace/src/{git_properties.js → config/git_properties.js} +0 -0
@@ -1,7 +1,8 @@
1
1
  'use strict'
2
2
 
3
3
  const { channel } = require('dc-polyfill')
4
- const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
4
+
5
+ const { getEnvironmentVariable, getValueFromEnvSources } = require('./config/helper')
5
6
  const { isFalse, isTrue, normalizePluginEnvName } = require('./util')
6
7
  const plugins = require('./plugins')
7
8
  const log = require('./log')
@@ -24,7 +25,7 @@ if (getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME') !== undefined) {
24
25
  require('./lambda')
25
26
  }
26
27
 
27
- const DD_TRACE_DISABLED_PLUGINS = getEnvironmentVariable('DD_TRACE_DISABLED_PLUGINS')
28
+ const DD_TRACE_DISABLED_PLUGINS = getValueFromEnvSources('DD_TRACE_DISABLED_PLUGINS')
28
29
 
29
30
  const disabledPlugins = new Set(
30
31
  DD_TRACE_DISABLED_PLUGINS && DD_TRACE_DISABLED_PLUGINS.split(',').map(plugin => plugin.trim())
@@ -41,7 +42,7 @@ loadChannel.subscribe(({ name }) => {
41
42
  function maybeEnable (Plugin) {
42
43
  if (!Plugin || typeof Plugin !== 'function') return
43
44
  if (!pluginClasses[Plugin.id]) {
44
- const enabled = getEnvEnabled(Plugin)
45
+ const enabled = getEnabled(Plugin)
45
46
 
46
47
  // TODO: remove the need to load the plugin class in order to disable the plugin
47
48
  if (isFalse(enabled) || disabledPlugins.has(Plugin.id)) {
@@ -54,9 +55,9 @@ function maybeEnable (Plugin) {
54
55
  }
55
56
  }
56
57
 
57
- function getEnvEnabled (Plugin) {
58
+ function getEnabled (Plugin) {
58
59
  const envName = `DD_TRACE_${Plugin.id.toUpperCase()}_ENABLED`
59
- return getEnvironmentVariable(normalizePluginEnvName(envName))
60
+ return getValueFromEnvSources(normalizePluginEnvName(envName))
60
61
  }
61
62
 
62
63
  // TODO this must always be a singleton.
@@ -94,7 +95,8 @@ module.exports = class PluginManager {
94
95
  this._pluginsByName[name] = new Plugin(this._tracer, this._tracerConfig)
95
96
  }
96
97
  const pluginConfig = this._configsByName[name] || {
97
- enabled: this._tracerConfig.plugins !== false && (!Plugin.experimental || isTrue(getEnvEnabled(Plugin)))
98
+ enabled: this._tracerConfig.plugins !== false &&
99
+ (!Plugin.experimental || isTrue(getEnabled(Plugin)))
98
100
  }
99
101
 
100
102
  // extracts predetermined configuration from tracer and combines it with plugin-specific config
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  const { readFileSync } = require('fs')
4
- const { getEnvironmentVariable, getEnvironmentVariables } = require('../../config-helper')
4
+ const { getEnvironmentVariable, getEnvironmentVariables, getValueFromEnvSources } = require('../../config/helper')
5
5
  const {
6
6
  GIT_BRANCH,
7
7
  GIT_COMMIT_SHA,
@@ -120,12 +120,12 @@ module.exports = {
120
120
  GIT_COMMIT: JENKINS_GIT_COMMIT,
121
121
  GIT_URL: JENKINS_GIT_REPOSITORY_URL,
122
122
  GIT_URL_1: JENKINS_GIT_REPOSITORY_URL_1,
123
- DD_CUSTOM_TRACE_ID,
124
123
  NODE_NAME,
125
124
  NODE_LABELS,
126
125
  CHANGE_ID,
127
126
  CHANGE_TARGET
128
127
  } = env
128
+ const DD_CUSTOM_TRACE_ID = getValueFromEnvSources('DD_CUSTOM_TRACE_ID')
129
129
 
130
130
  tags = {
131
131
  [CI_PIPELINE_ID]: BUILD_TAG,
@@ -689,16 +689,13 @@ module.exports = {
689
689
  }
690
690
 
691
691
  if (env.CODEBUILD_INITIATOR?.startsWith('codepipeline/')) {
692
- const {
693
- CODEBUILD_BUILD_ARN,
694
- DD_ACTION_EXECUTION_ID,
695
- DD_PIPELINE_EXECUTION_ID
696
- } = env
692
+ const DD_ACTION_EXECUTION_ID = getValueFromEnvSources('DD_ACTION_EXECUTION_ID')
693
+ const DD_PIPELINE_EXECUTION_ID = getValueFromEnvSources('DD_PIPELINE_EXECUTION_ID')
697
694
  tags = {
698
695
  [CI_PROVIDER_NAME]: 'awscodepipeline',
699
696
  [CI_PIPELINE_ID]: DD_PIPELINE_EXECUTION_ID,
700
697
  [CI_ENV_VARS]: JSON.stringify({
701
- CODEBUILD_BUILD_ARN,
698
+ CODEBUILD_BUILD_ARN: env.CODEBUILD_BUILD_ARN,
702
699
  DD_PIPELINE_EXECUTION_ID,
703
700
  DD_ACTION_EXECUTION_ID
704
701
  }),
@@ -7,11 +7,11 @@ const crypto = require('crypto')
7
7
  const cp = require('child_process')
8
8
 
9
9
  const log = require('../../log')
10
- const { getEnvironmentVariable } = require('../../config-helper')
10
+ const { getValueFromEnvSources } = require('../../config/helper')
11
11
  const { isTrue } = require('../../util')
12
12
 
13
- let isGitEnabled = isTrue(getEnvironmentVariable('DD_EXPERIMENTAL_TEST_OPT_GIT_CACHE_ENABLED'))
14
- const GIT_CACHE_DIR = getEnvironmentVariable('DD_EXPERIMENTAL_TEST_OPT_GIT_CACHE_DIR') ||
13
+ let isGitEnabled = isTrue(getValueFromEnvSources('DD_EXPERIMENTAL_TEST_OPT_GIT_CACHE_ENABLED'))
14
+ const GIT_CACHE_DIR = getValueFromEnvSources('DD_EXPERIMENTAL_TEST_OPT_GIT_CACHE_DIR') ||
15
15
  path.join(os.tmpdir(), 'dd-trace-git-cache')
16
16
 
17
17
  function ensureCacheDir () {
@@ -4,7 +4,7 @@ const path = require('path')
4
4
  const fs = require('fs')
5
5
  const { URL } = require('url')
6
6
  const log = require('../../log')
7
- const { getEnvironmentVariable } = require('../../config-helper')
7
+ const { getEnvironmentVariable } = require('../../config/helper')
8
8
  const satisfies = require('../../../../../vendor/dist/semifies')
9
9
 
10
10
  const istanbul = require('../../../../../vendor/dist/istanbul-lib-coverage')
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { getEnvironmentVariables } = require('../../config-helper')
3
+ const { getValueFromEnvSources } = require('../../config/helper')
4
4
  const {
5
5
  GIT_COMMIT_SHA,
6
6
  GIT_BRANCH,
@@ -21,16 +21,15 @@ const {
21
21
  const { normalizeRef } = require('./ci')
22
22
  const { filterSensitiveInfoFromRepository } = require('./url')
23
23
 
24
- function removeEmptyValues (tags) {
25
- return Object.keys(tags).reduce((filteredTags, tag) => {
26
- if (!tags[tag]) {
27
- return filteredTags
24
+ function removeEmptyValues (tagsAndValues) {
25
+ const filteredTags = {}
26
+ for (let i = 0; i < tagsAndValues.length; i += 2) {
27
+ const value = tagsAndValues[i + 1]
28
+ if (value) {
29
+ filteredTags[tagsAndValues[i]] = value
28
30
  }
29
- return {
30
- ...filteredTags,
31
- [tag]: tags[tag]
32
- }
33
- }, {})
31
+ }
32
+ return filteredTags
34
33
  }
35
34
 
36
35
  // The regex is inspired by
@@ -47,47 +46,46 @@ function validateGitCommitSha (gitCommitSha) {
47
46
  }
48
47
 
49
48
  function getUserProviderGitMetadata () {
50
- const {
51
- DD_GIT_COMMIT_SHA,
52
- DD_GIT_BRANCH,
53
- DD_GIT_REPOSITORY_URL,
54
- DD_GIT_TAG,
55
- DD_GIT_COMMIT_MESSAGE,
56
- DD_GIT_COMMIT_COMMITTER_NAME,
57
- DD_GIT_COMMIT_COMMITTER_EMAIL,
58
- DD_GIT_COMMIT_COMMITTER_DATE,
59
- DD_GIT_COMMIT_AUTHOR_NAME,
60
- DD_GIT_COMMIT_AUTHOR_EMAIL,
61
- DD_GIT_COMMIT_AUTHOR_DATE,
62
- DD_GIT_PULL_REQUEST_BASE_BRANCH,
63
- DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
64
- DD_GIT_COMMIT_HEAD_SHA
65
- } = getEnvironmentVariables()
49
+ const DD_GIT_COMMIT_SHA = getValueFromEnvSources('DD_GIT_COMMIT_SHA')
50
+ const DD_GIT_BRANCH = getValueFromEnvSources('DD_GIT_BRANCH')
51
+ const DD_GIT_REPOSITORY_URL = getValueFromEnvSources('DD_GIT_REPOSITORY_URL')
52
+ const DD_GIT_TAG = getValueFromEnvSources('DD_GIT_TAG')
53
+ const DD_GIT_COMMIT_MESSAGE = getValueFromEnvSources('DD_GIT_COMMIT_MESSAGE')
54
+ const DD_GIT_COMMIT_COMMITTER_NAME = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_NAME')
55
+ const DD_GIT_COMMIT_COMMITTER_EMAIL = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_EMAIL')
56
+ const DD_GIT_COMMIT_COMMITTER_DATE = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_DATE')
57
+ const DD_GIT_COMMIT_AUTHOR_NAME = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_NAME')
58
+ const DD_GIT_COMMIT_AUTHOR_EMAIL = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_EMAIL')
59
+ const DD_GIT_COMMIT_AUTHOR_DATE = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_DATE')
60
+ const DD_GIT_PULL_REQUEST_BASE_BRANCH = getValueFromEnvSources('DD_GIT_PULL_REQUEST_BASE_BRANCH')
61
+ const DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA = getValueFromEnvSources('DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA')
62
+ const DD_GIT_COMMIT_HEAD_SHA = getValueFromEnvSources('DD_GIT_COMMIT_HEAD_SHA')
66
63
 
67
64
  const branch = normalizeRef(DD_GIT_BRANCH)
68
65
  let tag = normalizeRef(DD_GIT_TAG)
69
66
 
70
67
  // if DD_GIT_BRANCH is a tag, we associate its value to TAG too
71
- if ((DD_GIT_BRANCH || '').includes('origin/tags') || (DD_GIT_BRANCH || '').includes('refs/heads/tags')) {
68
+ if ((DD_GIT_BRANCH ?? '').includes('origin/tags') || (DD_GIT_BRANCH ?? '').includes('refs/heads/tags')) {
72
69
  tag = normalizeRef(DD_GIT_BRANCH)
73
70
  }
74
71
 
75
- return removeEmptyValues({
76
- [GIT_COMMIT_SHA]: DD_GIT_COMMIT_SHA,
77
- [GIT_BRANCH]: branch,
78
- [GIT_REPOSITORY_URL]: filterSensitiveInfoFromRepository(DD_GIT_REPOSITORY_URL),
79
- [GIT_TAG]: tag,
80
- [GIT_COMMIT_MESSAGE]: DD_GIT_COMMIT_MESSAGE,
81
- [GIT_COMMIT_COMMITTER_NAME]: DD_GIT_COMMIT_COMMITTER_NAME,
82
- [GIT_COMMIT_COMMITTER_DATE]: DD_GIT_COMMIT_COMMITTER_DATE,
83
- [GIT_COMMIT_COMMITTER_EMAIL]: DD_GIT_COMMIT_COMMITTER_EMAIL,
84
- [GIT_COMMIT_AUTHOR_NAME]: DD_GIT_COMMIT_AUTHOR_NAME,
85
- [GIT_COMMIT_AUTHOR_EMAIL]: DD_GIT_COMMIT_AUTHOR_EMAIL,
86
- [GIT_COMMIT_AUTHOR_DATE]: DD_GIT_COMMIT_AUTHOR_DATE,
87
- [GIT_PULL_REQUEST_BASE_BRANCH]: DD_GIT_PULL_REQUEST_BASE_BRANCH,
88
- [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
89
- [GIT_COMMIT_HEAD_SHA]: DD_GIT_COMMIT_HEAD_SHA
90
- })
72
+ // Key value pairs are grouped in pairs of two
73
+ return removeEmptyValues([
74
+ GIT_COMMIT_SHA, DD_GIT_COMMIT_SHA,
75
+ GIT_BRANCH, branch,
76
+ GIT_REPOSITORY_URL, filterSensitiveInfoFromRepository(DD_GIT_REPOSITORY_URL),
77
+ GIT_TAG, tag,
78
+ GIT_COMMIT_MESSAGE, DD_GIT_COMMIT_MESSAGE,
79
+ GIT_COMMIT_COMMITTER_NAME, DD_GIT_COMMIT_COMMITTER_NAME,
80
+ GIT_COMMIT_COMMITTER_DATE, DD_GIT_COMMIT_COMMITTER_DATE,
81
+ GIT_COMMIT_COMMITTER_EMAIL, DD_GIT_COMMIT_COMMITTER_EMAIL,
82
+ GIT_COMMIT_AUTHOR_NAME, DD_GIT_COMMIT_AUTHOR_NAME,
83
+ GIT_COMMIT_AUTHOR_EMAIL, DD_GIT_COMMIT_AUTHOR_EMAIL,
84
+ GIT_COMMIT_AUTHOR_DATE, DD_GIT_COMMIT_AUTHOR_DATE,
85
+ GIT_PULL_REQUEST_BASE_BRANCH, DD_GIT_PULL_REQUEST_BASE_BRANCH,
86
+ GIT_PULL_REQUEST_BASE_BRANCH_SHA, DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
87
+ GIT_COMMIT_HEAD_SHA, DD_GIT_COMMIT_HEAD_SHA
88
+ ])
91
89
  }
92
90
 
93
91
  module.exports = { getUserProviderGitMetadata, validateGitRepositoryUrl, validateGitCommitSha }
@@ -1,49 +1,14 @@
1
1
  'use strict'
2
2
 
3
- const log = require('./log')
4
3
  const { profiler } = require('./profiling')
5
4
 
6
- // Stop profiler upon exit in order to collect and export the current profile
7
- process.once('beforeExit', () => { profiler.stop() })
5
+ globalThis[Symbol.for('dd-trace')].beforeExitHandlers.add(() => { profiler.stop() })
8
6
 
9
7
  module.exports = {
10
8
  start: config => {
11
- const { service, version, env, url, hostname, port, tags, repositoryUrl, commitSHA, injectionEnabled } = config
12
- const { enabled, sourceMap, exporters } = config.profiling
13
- const { heartbeatInterval } = config.telemetry
14
-
15
- const logger = {
16
- debug: (message) => log.debug(message),
17
- info: (message) => log.info(message),
18
- warn: (message) => log.warn(message),
19
- error: (...args) => log.error(...args)
20
- }
21
-
22
- const libraryInjected = injectionEnabled.length > 0
23
- let activation
24
- if (enabled === 'auto') {
25
- activation = 'auto'
26
- } else if (enabled === 'true') {
27
- activation = 'manual'
28
- } // else activation = undefined
29
-
30
- return profiler.start({
31
- service,
32
- version,
33
- env,
34
- logger,
35
- sourceMap,
36
- exporters,
37
- url,
38
- hostname,
39
- port,
40
- tags,
41
- repositoryUrl,
42
- commitSHA,
43
- libraryInjected,
44
- activation,
45
- heartbeatInterval
46
- })
9
+ // Forward the full tracer config to the profiling layer.
10
+ // Profiling code is responsible for deriving the specific options it needs.
11
+ return profiler.start(config)
47
12
  },
48
13
 
49
14
  stop: () => {
@@ -2,14 +2,14 @@
2
2
 
3
3
  const os = require('os')
4
4
  const path = require('path')
5
- const { URL, format, pathToFileURL } = require('url')
5
+ const { pathToFileURL } = require('url')
6
6
  const satisfies = require('../../../../vendor/dist/semifies')
7
7
  const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('../plugins/util/tags')
8
8
  const { getIsAzureFunction } = require('../serverless')
9
9
  const { isFalse, isTrue } = require('../util')
10
10
  const { getAzureTagsFromMetadata, getAzureAppMetadata, getAzureFunctionMetadata } = require('../azure_metadata')
11
- const { getEnvironmentVariables } = require('../config-helper')
12
- const defaults = require('../config_defaults')
11
+ const { getEnvironmentVariable, getValueFromEnvSources } = require('../config/helper')
12
+ const { getAgentUrl } = require('../agent/url')
13
13
  const { AgentExporter } = require('./exporters/agent')
14
14
  const { FileExporter } = require('./exporters/file')
15
15
  const { ConsoleLogger } = require('./loggers/console')
@@ -18,14 +18,16 @@ const SpaceProfiler = require('./profilers/space')
18
18
  const EventsProfiler = require('./profilers/events')
19
19
  const { oomExportStrategies, snapshotKinds } = require('./constants')
20
20
  const { tagger } = require('./tagger')
21
-
22
21
  class Config {
23
22
  constructor (options = {}) {
23
+ // TODO: Remove entries that were already resolved in config.
24
+ // For the others, move them over to config.
25
+ const AWS_LAMBDA_FUNCTION_NAME = getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME')
26
+ const NODE_OPTIONS = getEnvironmentVariable('NODE_OPTIONS')
27
+
28
+ // TODO: Move initialization of these values to packages/dd-trace/src/config/index.js, and just read from config
24
29
  const {
25
- AWS_LAMBDA_FUNCTION_NAME: functionname,
26
- DD_AGENT_HOST,
27
- DD_ENV,
28
- DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED, // used for testing
30
+ DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED,
29
31
  DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED,
30
32
  DD_PROFILING_CODEHOTSPOTS_ENABLED,
31
33
  DD_PROFILING_CPU_ENABLED,
@@ -40,40 +42,37 @@ class Config {
40
42
  DD_PROFILING_HEAP_SAMPLING_INTERVAL,
41
43
  DD_PROFILING_PPROF_PREFIX,
42
44
  DD_PROFILING_PROFILERS,
43
- DD_PROFILING_SOURCE_MAP,
44
45
  DD_PROFILING_TIMELINE_ENABLED,
45
46
  DD_PROFILING_UPLOAD_PERIOD,
46
47
  DD_PROFILING_UPLOAD_TIMEOUT,
47
48
  DD_PROFILING_V8_PROFILER_BUG_WORKAROUND,
48
49
  DD_PROFILING_WALLTIME_ENABLED,
49
- DD_SERVICE,
50
- DD_TAGS,
51
- DD_TRACE_AGENT_PORT,
52
- DD_TRACE_AGENT_URL,
53
- DD_VERSION,
54
- NODE_OPTIONS
55
- } = getEnvironmentVariables()
56
-
57
- const env = options.env ?? DD_ENV
58
- const service = options.service || DD_SERVICE || 'node'
50
+ DD_TAGS
51
+ } = getProfilingEnvValues()
52
+
59
53
  const host = os.hostname()
60
- const version = options.version ?? DD_VERSION
61
54
  // Must be longer than one minute so pad with five seconds
62
55
  const flushInterval = options.interval ?? (Number(DD_PROFILING_UPLOAD_PERIOD) * 1000 || 65 * 1000)
63
56
  const uploadTimeout = options.uploadTimeout ?? (Number(DD_PROFILING_UPLOAD_TIMEOUT) || 60 * 1000)
64
- const sourceMap = options.sourceMap ?? DD_PROFILING_SOURCE_MAP ?? true
65
57
  const pprofPrefix = options.pprofPrefix ?? DD_PROFILING_PPROF_PREFIX ?? ''
66
58
 
67
- this.service = service
68
- this.env = env
59
+ // TODO: Remove the fallback. Just use the value from the config.
60
+ this.service = options.service || 'node'
61
+ this.env = options.env
69
62
  this.host = host
70
- this.functionname = functionname
63
+ this.functionname = AWS_LAMBDA_FUNCTION_NAME
71
64
 
72
- this.version = version
65
+ this.version = options.version
73
66
  this.tags = Object.assign(
74
67
  tagger.parse(DD_TAGS),
75
68
  tagger.parse(options.tags),
76
- tagger.parse({ env, host, service, version, functionname }),
69
+ tagger.parse({
70
+ env: options.env,
71
+ host,
72
+ service: this.service,
73
+ version: this.version,
74
+ functionname: AWS_LAMBDA_FUNCTION_NAME
75
+ }),
77
76
  getAzureTagsFromMetadata(getIsAzureFunction() ? getAzureFunctionMetadata() : getAzureAppMetadata())
78
77
  )
79
78
 
@@ -104,7 +103,7 @@ class Config {
104
103
 
105
104
  this.flushInterval = flushInterval
106
105
  this.uploadTimeout = uploadTimeout
107
- this.sourceMap = sourceMap
106
+ this.sourceMap = options.sourceMap
108
107
  this.debugSourceMaps = isTrue(options.debugSourceMaps ?? DD_PROFILING_DEBUG_SOURCE_MAPS)
109
108
  this.endpointCollectionEnabled = isTrue(options.endpointCollection ??
110
109
  DD_PROFILING_ENDPOINT_COLLECTION_ENABLED ?? samplingContextsAvailable)
@@ -113,13 +112,7 @@ class Config {
113
112
  this.pprofPrefix = pprofPrefix
114
113
  this.v8ProfilerBugWorkaroundEnabled = isTrue(options.v8ProfilerBugWorkaround ??
115
114
  DD_PROFILING_V8_PROFILER_BUG_WORKAROUND ?? true)
116
- const hostname = (options.hostname ?? DD_AGENT_HOST) || defaults.hostname
117
- const port = (options.port ?? DD_TRACE_AGENT_PORT) || defaults.port
118
- this.url = new URL(options.url ?? DD_TRACE_AGENT_URL ?? format({
119
- protocol: 'http:',
120
- hostname,
121
- port
122
- }))
115
+ this.url = getAgentUrl(options)
123
116
 
124
117
  this.libraryInjected = options.libraryInjected
125
118
  this.activation = options.activation
@@ -439,3 +432,50 @@ function buildExportCommand (options) {
439
432
  path.join(__dirname, 'exporter_cli.js'),
440
433
  urls.join(','), tags, 'space']
441
434
  }
435
+
436
+ function getProfilingEnvValues () {
437
+ return {
438
+ DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED:
439
+ getValueFromEnvSources('DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED'),
440
+ DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED:
441
+ getValueFromEnvSources('DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED'),
442
+ DD_PROFILING_CODEHOTSPOTS_ENABLED:
443
+ getValueFromEnvSources('DD_PROFILING_CODEHOTSPOTS_ENABLED'),
444
+ DD_PROFILING_CPU_ENABLED:
445
+ getValueFromEnvSources('DD_PROFILING_CPU_ENABLED'),
446
+ DD_PROFILING_DEBUG_SOURCE_MAPS:
447
+ getValueFromEnvSources('DD_PROFILING_DEBUG_SOURCE_MAPS'),
448
+ DD_PROFILING_DEBUG_UPLOAD_COMPRESSION:
449
+ getValueFromEnvSources('DD_PROFILING_DEBUG_UPLOAD_COMPRESSION'),
450
+ DD_PROFILING_ENDPOINT_COLLECTION_ENABLED:
451
+ getValueFromEnvSources('DD_PROFILING_ENDPOINT_COLLECTION_ENABLED'),
452
+ DD_PROFILING_EXPERIMENTAL_OOM_EXPORT_STRATEGIES:
453
+ getValueFromEnvSources('DD_PROFILING_EXPERIMENTAL_OOM_EXPORT_STRATEGIES'),
454
+ DD_PROFILING_EXPERIMENTAL_OOM_HEAP_LIMIT_EXTENSION_SIZE:
455
+ getValueFromEnvSources('DD_PROFILING_EXPERIMENTAL_OOM_HEAP_LIMIT_EXTENSION_SIZE'),
456
+ DD_PROFILING_EXPERIMENTAL_OOM_MAX_HEAP_EXTENSION_COUNT:
457
+ getValueFromEnvSources('DD_PROFILING_EXPERIMENTAL_OOM_MAX_HEAP_EXTENSION_COUNT'),
458
+ DD_PROFILING_EXPERIMENTAL_OOM_MONITORING_ENABLED:
459
+ getValueFromEnvSources('DD_PROFILING_EXPERIMENTAL_OOM_MONITORING_ENABLED'),
460
+ DD_PROFILING_HEAP_ENABLED:
461
+ getValueFromEnvSources('DD_PROFILING_HEAP_ENABLED'),
462
+ DD_PROFILING_HEAP_SAMPLING_INTERVAL:
463
+ getValueFromEnvSources('DD_PROFILING_HEAP_SAMPLING_INTERVAL'),
464
+ DD_PROFILING_PPROF_PREFIX:
465
+ getValueFromEnvSources('DD_PROFILING_PPROF_PREFIX'),
466
+ DD_PROFILING_PROFILERS:
467
+ getValueFromEnvSources('DD_PROFILING_PROFILERS'),
468
+ DD_PROFILING_TIMELINE_ENABLED:
469
+ getValueFromEnvSources('DD_PROFILING_TIMELINE_ENABLED'),
470
+ DD_PROFILING_UPLOAD_PERIOD:
471
+ getValueFromEnvSources('DD_PROFILING_UPLOAD_PERIOD'),
472
+ DD_PROFILING_UPLOAD_TIMEOUT:
473
+ getValueFromEnvSources('DD_PROFILING_UPLOAD_TIMEOUT'),
474
+ DD_PROFILING_V8_PROFILER_BUG_WORKAROUND:
475
+ getValueFromEnvSources('DD_PROFILING_V8_PROFILER_BUG_WORKAROUND'),
476
+ DD_PROFILING_WALLTIME_ENABLED:
477
+ getValueFromEnvSources('DD_PROFILING_WALLTIME_ENABLED'),
478
+ DD_TAGS:
479
+ getValueFromEnvSources('DD_TAGS')
480
+ }
481
+ }
@@ -3,7 +3,7 @@
3
3
  const fs = require('fs')
4
4
  const { fileURLToPath } = require('url')
5
5
  const { SourceMapper, heap, encode } = require('@datadog/pprof')
6
- const { getEnvironmentVariable } = require('../config-helper')
6
+ const { getValueFromEnvSources } = require('../config/helper')
7
7
  const { AgentExporter } = require('./exporters/agent')
8
8
  const { FileExporter } = require('./exporters/file')
9
9
 
@@ -17,9 +17,9 @@ function exporterFromURL (url) {
17
17
  if (url.protocol === 'file:') {
18
18
  return new FileExporter({ pprofPrefix: fileURLToPath(url) })
19
19
  }
20
- const injectionEnabled = (getEnvironmentVariable('DD_INJECTION_ENABLED') ?? '').split(',')
20
+ const injectionEnabled = (getValueFromEnvSources('DD_INJECTION_ENABLED') ?? '').split(',')
21
21
  const libraryInjected = injectionEnabled.length > 0
22
- const profilingEnabled = (getEnvironmentVariable('DD_PROFILING_ENABLED') ?? '').toLowerCase()
22
+ const profilingEnabled = (getValueFromEnvSources('DD_PROFILING_ENABLED') ?? '').toLowerCase()
23
23
  const activation = ['true', '1'].includes(profilingEnabled)
24
24
  ? 'manual'
25
25
  : profilingEnabled === 'auto'
@@ -62,12 +62,12 @@ async function exportProfile (urls, tags, profileType, profile) {
62
62
  * Expected command line arguments are:
63
63
  * - Comma separated list of URLs (eg. "http://127.0.0.1:8126/,file:///tmp/foo.pprof")
64
64
  * - Tags (eg. "service:nodejs_oom_test,version:1.0.0")
65
- * - Profiletype (eg. space,wall,cpu)
65
+ * - Profile type (eg. space,wall,cpu)
66
66
  * - JSON profile filepath
67
67
  */
68
68
  const urls = process.argv[2].split(',').map(s => new URL(s))
69
69
  const tags = tagger.parse(process.argv[3])
70
70
  const profileType = process.argv[4]
71
- const profile = JSON.parse(fs.readFileSync(process.argv[5]))
71
+ const profile = JSON.parse(fs.readFileSync(process.argv[5], 'utf8'))
72
72
 
73
73
  exportProfile(urls, tags, profileType, profile)
@@ -73,7 +73,7 @@ function getBody (stream, callback) {
73
73
  callback(err)
74
74
  })
75
75
  stream.on('data', chunk => chunks.push(chunk))
76
- stream.on('end', () => {
76
+ stream.once('end', () => {
77
77
  callback(null, Buffer.concat(chunks))
78
78
  })
79
79
  }
@@ -6,6 +6,7 @@ const os = require('os')
6
6
  const perf = require('perf_hooks').performance
7
7
  const version = require('../../../../../package.json').version
8
8
  const { availableParallelism, libuvThreadPoolSize } = require('../libuv-size')
9
+ const processTags = require('../../process-tags')
9
10
 
10
11
  class EventSerializer {
11
12
  constructor ({ env, host, service, version, libraryInjected, activation } = {}) {
@@ -22,7 +23,7 @@ class EventSerializer {
22
23
  }
23
24
 
24
25
  getEventJSON ({ profiles, infos, start, end, tags = {}, endpointCounts }) {
25
- return JSON.stringify({
26
+ const event = {
26
27
  attachments: Object.keys(profiles).map(t => this.typeToFile(t)),
27
28
  start: start.toISOString(),
28
29
  end: end.toISOString(),
@@ -77,7 +78,13 @@ class EventSerializer {
77
78
  version: process.version.slice(1)
78
79
  }
79
80
  }
80
- })
81
+ }
82
+
83
+ if (processTags.serialized) {
84
+ event[processTags.PROFILING_FIELD_NAME] = processTags.serialized
85
+ }
86
+
87
+ return JSON.stringify(event)
81
88
  }
82
89
  }
83
90
 
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { getEnvironmentVariable } = require('../config-helper')
3
+ const { getEnvironmentVariable } = require('../config/helper')
4
4
  const { Profiler, ServerlessProfiler } = require('./profiler')
5
5
  const WallProfiler = require('./profilers/wall')
6
6
  const SpaceProfiler = require('./profilers/space')
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
3
  const os = require('node:os')
4
- const { getEnvironmentVariable } = require('../config-helper')
4
+ const { getEnvironmentVariable } = require('../config/helper')
5
5
 
6
6
  function getLibuvThreadPoolSize (envVar) {
7
7
  if (envVar === undefined) {
@@ -5,6 +5,7 @@ const { promisify } = require('util')
5
5
  const zlib = require('zlib')
6
6
  const dc = require('dc-polyfill')
7
7
  const crashtracker = require('../crashtracking')
8
+ const log = require('../log')
8
9
  const { Config } = require('./config')
9
10
  const { snapshotKinds } = require('./constants')
10
11
  const { threadNamePrefix } = require('./profilers/shared')
@@ -63,13 +64,64 @@ class Profiler extends EventEmitter {
63
64
  this._timeoutInterval = undefined
64
65
  }
65
66
 
67
+ get serverless () { return false }
68
+
66
69
  get flushInterval () {
67
70
  return this.#config?.flushInterval
68
71
  }
69
72
 
70
- start (options) {
73
+ start (config) {
74
+ const {
75
+ service,
76
+ version,
77
+ env,
78
+ url,
79
+ hostname,
80
+ port,
81
+ tags,
82
+ repositoryUrl,
83
+ commitSHA,
84
+ injectionEnabled
85
+ } = config
86
+ const { enabled, sourceMap, exporters } = config.profiling
87
+ const { heartbeatInterval } = config.telemetry
88
+
89
+ // TODO: Unify with main logger and rewrite template strings to use printf formatting.
90
+ const logger = {
91
+ debug (message) { log.debug(message) },
92
+ info (message) { log.info(message) },
93
+ warn (message) { log.warn(message) },
94
+ error (...args) { log.error(...args) }
95
+ }
96
+
97
+ const libraryInjected = injectionEnabled.length > 0
98
+ let activation
99
+ if (enabled === 'auto') {
100
+ activation = 'auto'
101
+ } else if (enabled === 'true') {
102
+ activation = 'manual'
103
+ } // else activation = undefined
104
+
105
+ const options = {
106
+ service,
107
+ version,
108
+ env,
109
+ logger,
110
+ sourceMap,
111
+ exporters,
112
+ url,
113
+ hostname,
114
+ port,
115
+ tags,
116
+ repositoryUrl,
117
+ commitSHA,
118
+ libraryInjected,
119
+ activation,
120
+ heartbeatInterval
121
+ }
122
+
71
123
  return this._start(options).catch((err) => {
72
- logError(options.logger, 'Error starting profiler. For troubleshooting tips, see ' +
124
+ logError(logger, 'Error starting profiler. For troubleshooting tips, see ' +
73
125
  '<https://dtdg.co/nodejs-profiler-troubleshooting>', err)
74
126
  return false
75
127
  })
@@ -242,6 +294,7 @@ class Profiler extends EventEmitter {
242
294
 
243
295
  #createInitialInfos () {
244
296
  return {
297
+ serverless: this.serverless,
245
298
  settings: this.#config.systemInfoReport
246
299
  }
247
300
  }
@@ -351,6 +404,8 @@ class ServerlessProfiler extends Profiler {
351
404
  this.#flushAfterIntervals = undefined
352
405
  }
353
406
 
407
+ get serverless () { return true }
408
+
354
409
  get profiledIntervals () {
355
410
  return this.#profiledIntervals
356
411
  }