dd-trace 5.99.1 → 5.101.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 (101) hide show
  1. package/LICENSE-3rdparty.csv +0 -1
  2. package/index.d.ts +14 -0
  3. package/package.json +8 -8
  4. package/packages/datadog-instrumentations/src/cucumber.js +69 -5
  5. package/packages/datadog-instrumentations/src/cypress.js +5 -3
  6. package/packages/datadog-instrumentations/src/express.js +3 -2
  7. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  8. package/packages/datadog-instrumentations/src/hono.js +15 -4
  9. package/packages/datadog-instrumentations/src/http/client.js +20 -3
  10. package/packages/datadog-instrumentations/src/jest.js +146 -90
  11. package/packages/datadog-instrumentations/src/mocha/common.js +4 -1
  12. package/packages/datadog-instrumentations/src/mocha/main.js +43 -26
  13. package/packages/datadog-instrumentations/src/mocha/utils.js +114 -96
  14. package/packages/datadog-instrumentations/src/mocha/worker.js +7 -4
  15. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +11 -6
  16. package/packages/datadog-instrumentations/src/path-to-regexp.js +44 -0
  17. package/packages/datadog-instrumentations/src/playwright.js +108 -18
  18. package/packages/datadog-instrumentations/src/router.js +53 -33
  19. package/packages/datadog-instrumentations/src/vitest.js +76 -30
  20. package/packages/datadog-plugin-aws-sdk/src/base.js +1 -1
  21. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +1 -1
  22. package/packages/datadog-plugin-bullmq/src/consumer.js +5 -4
  23. package/packages/datadog-plugin-bullmq/src/producer.js +37 -29
  24. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +49 -9
  25. package/packages/datadog-plugin-cypress/src/plugin.js +5 -14
  26. package/packages/datadog-plugin-cypress/src/support.js +22 -21
  27. package/packages/datadog-plugin-grpc/src/client.js +1 -1
  28. package/packages/datadog-plugin-grpc/src/server.js +1 -1
  29. package/packages/datadog-plugin-kafkajs/src/consumer.js +2 -9
  30. package/packages/datadog-plugin-kafkajs/src/producer.js +2 -8
  31. package/packages/datadog-plugin-mongodb-core/src/index.js +2 -3
  32. package/packages/datadog-plugin-playwright/src/index.js +6 -0
  33. package/packages/datadog-plugin-router/src/index.js +13 -0
  34. package/packages/dd-trace/index.js +4 -3
  35. package/packages/dd-trace/src/aiguard/sdk.js +2 -2
  36. package/packages/dd-trace/src/appsec/reporter.js +4 -1
  37. package/packages/dd-trace/src/baggage.js +10 -0
  38. package/packages/dd-trace/src/ci-visibility/lage.js +2 -1
  39. package/packages/dd-trace/src/ci-visibility/requests/request.js +11 -33
  40. package/packages/dd-trace/src/config/config-types.d.ts +0 -2
  41. package/packages/dd-trace/src/config/generated-config-types.d.ts +17 -41
  42. package/packages/dd-trace/src/config/index.js +7 -60
  43. package/packages/dd-trace/src/config/normalize-service.js +31 -0
  44. package/packages/dd-trace/src/config/supported-configurations.json +15 -32
  45. package/packages/dd-trace/src/datastreams/checkpointer.js +4 -10
  46. package/packages/dd-trace/src/datastreams/encoding.js +39 -28
  47. package/packages/dd-trace/src/datastreams/pathway.js +29 -26
  48. package/packages/dd-trace/src/datastreams/processor.js +17 -15
  49. package/packages/dd-trace/src/datastreams/size.js +6 -2
  50. package/packages/dd-trace/src/debugger/config.js +6 -3
  51. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -5
  52. package/packages/dd-trace/src/debugger/devtools_client/send.js +2 -1
  53. package/packages/dd-trace/src/dogstatsd.js +10 -7
  54. package/packages/dd-trace/src/encode/0.4.js +3 -3
  55. package/packages/dd-trace/src/encode/0.5.js +2 -2
  56. package/packages/dd-trace/src/encode/agentless-json.js +2 -2
  57. package/packages/dd-trace/src/encode/tags-processors.js +2 -27
  58. package/packages/dd-trace/src/exporters/common/request.js +22 -11
  59. package/packages/dd-trace/src/exporters/common/retry.js +104 -0
  60. package/packages/dd-trace/src/git_metadata.js +66 -0
  61. package/packages/dd-trace/src/git_metadata_tagger.js +13 -5
  62. package/packages/dd-trace/src/heap_snapshots.js +4 -4
  63. package/packages/dd-trace/src/id.js +15 -26
  64. package/packages/dd-trace/src/llmobs/constants/tags.js +2 -0
  65. package/packages/dd-trace/src/llmobs/plugins/anthropic/index.js +27 -16
  66. package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +3 -0
  67. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +30 -13
  68. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +20 -50
  69. package/packages/dd-trace/src/llmobs/sdk.js +5 -1
  70. package/packages/dd-trace/src/llmobs/span_processor.js +28 -2
  71. package/packages/dd-trace/src/llmobs/tagger.js +42 -0
  72. package/packages/dd-trace/src/llmobs/telemetry.js +29 -0
  73. package/packages/dd-trace/src/llmobs/util.js +80 -5
  74. package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +2 -2
  75. package/packages/dd-trace/src/opentelemetry/active-span-proxy.js +42 -0
  76. package/packages/dd-trace/src/opentelemetry/bridge-span-base.js +106 -0
  77. package/packages/dd-trace/src/opentelemetry/context_manager.js +22 -10
  78. package/packages/dd-trace/src/opentelemetry/span-helpers.js +308 -0
  79. package/packages/dd-trace/src/opentelemetry/span.js +42 -108
  80. package/packages/dd-trace/src/opentelemetry/tracer.js +11 -36
  81. package/packages/dd-trace/src/opentracing/propagation/text_map.js +95 -36
  82. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +98 -32
  83. package/packages/dd-trace/src/opentracing/span.js +58 -49
  84. package/packages/dd-trace/src/opentracing/span_context.js +1 -0
  85. package/packages/dd-trace/src/plugins/util/ci.js +119 -32
  86. package/packages/dd-trace/src/plugins/util/test.js +293 -27
  87. package/packages/dd-trace/src/priority_sampler.js +6 -4
  88. package/packages/dd-trace/src/profiling/config.js +5 -4
  89. package/packages/dd-trace/src/profiling/ssi-heuristics.js +2 -2
  90. package/packages/dd-trace/src/propagation-hash/index.js +1 -1
  91. package/packages/dd-trace/src/proxy.js +3 -3
  92. package/packages/dd-trace/src/remote_config/index.js +5 -3
  93. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
  94. package/packages/dd-trace/src/span_format.js +52 -5
  95. package/packages/dd-trace/src/span_processor.js +1 -5
  96. package/packages/dd-trace/src/spanleak.js +0 -1
  97. package/packages/dd-trace/src/telemetry/telemetry.js +7 -5
  98. package/packages/dd-trace/src/tracer_metadata.js +1 -1
  99. package/packages/dd-trace/src/util.js +17 -0
  100. package/vendor/dist/path-to-regexp/LICENSE +0 -21
  101. package/vendor/dist/path-to-regexp/index.js +0 -1
@@ -5,7 +5,6 @@ export interface GeneratedConfig {
5
5
  _DD_APM_TRACING_AGENTLESS_ENABLED: boolean;
6
6
  apiKey: string | undefined;
7
7
  apmTracingEnabled: boolean;
8
- appKey: string | undefined;
9
8
  appsec: {
10
9
  apiSecurity: {
11
10
  downstreamBodyAnalysisSampleRate: number;
@@ -63,9 +62,6 @@ export interface GeneratedConfig {
63
62
  };
64
63
  };
65
64
  };
66
- crashtracking: {
67
- enabled: boolean;
68
- };
69
65
  dbm: {
70
66
  injectSqlBaseHash: boolean;
71
67
  };
@@ -74,6 +70,7 @@ export interface GeneratedConfig {
74
70
  DD_AGENTLESS_LOG_SUBMISSION_ENABLED: boolean;
75
71
  DD_AGENTLESS_LOG_SUBMISSION_URL: string | undefined;
76
72
  DD_APM_FLUSH_DEADLINE_MILLISECONDS: number;
73
+ DD_APP_KEY: string | undefined;
77
74
  DD_AZURE_RESOURCE_GROUP: string | undefined;
78
75
  DD_CIVISIBILITY_AGENTLESS_ENABLED: boolean;
79
76
  DD_CIVISIBILITY_AGENTLESS_URL: string | undefined;
@@ -87,9 +84,11 @@ export interface GeneratedConfig {
87
84
  DD_CIVISIBILITY_TEST_COMMAND: string | undefined;
88
85
  DD_CIVISIBILITY_TEST_MODULE_ID: string | undefined;
89
86
  DD_CIVISIBILITY_TEST_SESSION_ID: string | undefined;
87
+ DD_CRASHTRACKING_ENABLED: boolean;
90
88
  DD_CUSTOM_TRACE_ID: string | undefined;
91
89
  DD_ENABLE_LAGE_PACKAGE_NAME: boolean;
92
90
  DD_ENABLE_NX_SERVICE_NAME: boolean;
91
+ DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED: boolean;
93
92
  DD_EXPERIMENTAL_TEST_OPT_GIT_CACHE_DIR: string;
94
93
  DD_EXPERIMENTAL_TEST_OPT_GIT_CACHE_ENABLED: boolean;
95
94
  DD_EXPERIMENTAL_TEST_OPT_SETTINGS_CACHE: string;
@@ -111,12 +110,22 @@ export interface GeneratedConfig {
111
110
  DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA: string | undefined;
112
111
  DD_GIT_REPOSITORY_URL: string | undefined;
113
112
  DD_GIT_TAG: string | undefined;
113
+ DD_GRPC_CLIENT_ERROR_STATUSES: number[];
114
+ DD_GRPC_SERVER_ERROR_STATUSES: number[];
115
+ DD_HEAP_SNAPSHOT_COUNT: number;
116
+ DD_HEAP_SNAPSHOT_DESTINATION: string;
117
+ DD_HEAP_SNAPSHOT_INTERVAL: number;
114
118
  DD_INJECT_FORCE: boolean;
115
119
  DD_INJECTION_ENABLED: string | undefined;
116
120
  DD_INSTRUMENTATION_CONFIG_ID: string | undefined;
121
+ DD_INSTRUMENTATION_INSTALL_ID: string | undefined;
122
+ DD_INSTRUMENTATION_INSTALL_TIME: string | undefined;
123
+ DD_INSTRUMENTATION_INSTALL_TYPE: string | undefined;
124
+ DD_INTERNAL_PROFILING_LONG_LIVED_THRESHOLD: number;
117
125
  DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED: boolean;
118
126
  DD_LAMBDA_HANDLER: string | undefined;
119
127
  DD_LOGS_OTEL_ENABLED: boolean;
128
+ DD_METRICS_OTEL_ENABLED: boolean;
120
129
  DD_MINI_AGENT_PATH: string | undefined;
121
130
  DD_PIPELINE_EXECUTION_ID: string | undefined;
122
131
  DD_PLAYWRIGHT_WORKER: string | undefined;
@@ -166,6 +175,7 @@ export interface GeneratedConfig {
166
175
  DD_TRACE_APOLLO_SERVER_FASTIFY_ENABLED: boolean;
167
176
  DD_TRACE_APOLLO_SUBGRAPH_ENABLED: boolean;
168
177
  DD_TRACE_AVSC_ENABLED: boolean;
178
+ DD_TRACE_AWS_ADD_SPAN_POINTERS: boolean;
169
179
  DD_TRACE_AWS_SDK_AWS_BATCH_PROPAGATION_ENABLED: boolean;
170
180
  DD_TRACE_AWS_SDK_AWS_ENABLED: boolean;
171
181
  DD_TRACE_AWS_SDK_BATCH_PROPAGATION_ENABLED: boolean;
@@ -229,6 +239,7 @@ export interface GeneratedConfig {
229
239
  DD_TRACE_DISABLED_INSTRUMENTATIONS: string;
230
240
  DD_TRACE_DISABLED_PLUGINS: string | undefined;
231
241
  DD_TRACE_DNS_ENABLED: boolean;
242
+ DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS: string | undefined;
232
243
  DD_TRACE_ELASTIC_ELASTICSEARCH_ENABLED: boolean;
233
244
  DD_TRACE_ELASTIC_TRANSPORT_ENABLED: boolean;
234
245
  DD_TRACE_ELASTICSEARCH_ENABLED: boolean;
@@ -316,6 +327,7 @@ export interface GeneratedConfig {
316
327
  DD_TRACE_MULTER_ENABLED: boolean;
317
328
  DD_TRACE_MYSQL_ENABLED: boolean;
318
329
  DD_TRACE_MYSQL2_ENABLED: boolean;
330
+ DD_TRACE_NATIVE_SPAN_EVENTS: boolean;
319
331
  DD_TRACE_NET_ENABLED: boolean;
320
332
  DD_TRACE_NEXT_ENABLED: boolean;
321
333
  DD_TRACE_NODE_CHILD_PROCESS_ENABLED: boolean;
@@ -344,6 +356,7 @@ export interface GeneratedConfig {
344
356
  DD_TRACE_PROCESS_ENABLED: boolean;
345
357
  DD_TRACE_PROMISE_ENABLED: boolean;
346
358
  DD_TRACE_PROMISE_JS_ENABLED: boolean;
359
+ DD_TRACE_PROPAGATION_BEHAVIOR_EXTRACT: "continue" | "restart" | "ignore";
347
360
  DD_TRACE_PROPAGATION_EXTRACT_FIRST: boolean;
348
361
  DD_TRACE_PROPAGATION_STYLE: string[];
349
362
  DD_TRACE_PROTOBUFJS_ENABLED: boolean;
@@ -417,24 +430,7 @@ export interface GeneratedConfig {
417
430
  flakyTestRetriesCount: number;
418
431
  flushInterval: number;
419
432
  flushMinSpans: number;
420
- grpc: {
421
- client: {
422
- error: {
423
- statuses: number[];
424
- };
425
- };
426
- server: {
427
- error: {
428
- statuses: number[];
429
- };
430
- };
431
- };
432
433
  headerTags: string[];
433
- heapSnapshot: {
434
- count: number;
435
- destination: string;
436
- interval: number;
437
- };
438
434
  hostname: string;
439
435
  iast: {
440
436
  dbRowsToTaint: number;
@@ -453,11 +449,6 @@ export interface GeneratedConfig {
453
449
  telemetryVerbosity: string;
454
450
  };
455
451
  inferredProxyServicesEnabled: boolean;
456
- installSignature: {
457
- id: string | undefined;
458
- time: string | undefined;
459
- type: string | undefined;
460
- };
461
452
  isEarlyFlakeDetectionEnabled: boolean;
462
453
  isFlakyTestRetriesEnabled: boolean;
463
454
  isGitUploadEnabled: boolean;
@@ -511,15 +502,10 @@ export interface GeneratedConfig {
511
502
  OTEL_TRACES_EXPORTER: "none" | "otlp" | undefined;
512
503
  OTEL_TRACES_SAMPLER: "always_on" | "always_off" | "traceidratio" | "parentbased_always_on" | "parentbased_always_off" | "parentbased_traceidratio";
513
504
  OTEL_TRACES_SAMPLER_ARG: number | undefined;
514
- otelMetricsEnabled: boolean;
515
505
  peerServiceMapping: Record<string, string>;
516
506
  port: string | number;
517
507
  profiling: {
518
508
  enabled: 'true' | 'false' | 'auto';
519
- longLivedThreshold: number;
520
- };
521
- propagateProcessTags: {
522
- enabled: boolean;
523
509
  };
524
510
  protocolVersion: string;
525
511
  queryStringObfuscation: string;
@@ -562,18 +548,8 @@ export interface GeneratedConfig {
562
548
  metrics: boolean;
563
549
  };
564
550
  testManagementAttemptToFixRetries: number;
565
- trace: {
566
- aws: {
567
- addSpanPointers: boolean;
568
- };
569
- dynamoDb: {
570
- tablePrimaryKeys: string | undefined;
571
- };
572
- nativeSpanEvents: boolean;
573
- };
574
551
  traceId128BitGenerationEnabled: boolean;
575
552
  traceId128BitLoggingEnabled: boolean;
576
- tracePropagationBehaviorExtract: "continue" | "restart" | "ignore";
577
553
  tracePropagationStyle: {
578
554
  extract: string[];
579
555
  inject: string[];
@@ -3,7 +3,6 @@
3
3
  const fs = require('node:fs')
4
4
  const os = require('node:os')
5
5
  const { URL } = require('node:url')
6
- const path = require('node:path')
7
6
 
8
7
  const rfdc = require('../../../../vendor/dist/rfdc')({ proto: false, circles: false })
9
8
  const uuid = require('../../../../vendor/dist/crypto-randomuuid') // we need to keep the old uuid dep because of cypress
@@ -12,7 +11,6 @@ const { DD_MAJOR } = require('../../../../version')
12
11
  const log = require('../log')
13
12
  const pkg = require('../pkg')
14
13
  const { isTrue } = require('../util')
15
- const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('../plugins/util/tags')
16
14
  const telemetry = require('../telemetry')
17
15
  const telemetryMetrics = require('../telemetry/metrics')
18
16
  const {
@@ -22,8 +20,6 @@ const {
22
20
  } = require('../serverless')
23
21
  const { ORIGIN_KEY, DATADOG_MINI_AGENT_PATH } = require('../constants')
24
22
  const { appendRules } = require('../payload-tagging/config')
25
- const { getGitMetadataFromGitProperties, removeUserSensitiveInfo, getRemoteOriginURL, resolveGitHeadSHA } =
26
- require('./git_properties')
27
23
  const ConfigBase = require('./config-base')
28
24
  const {
29
25
  getEnvironmentVariable,
@@ -39,6 +35,7 @@ const {
39
35
  parseErrors,
40
36
  generateTelemetry,
41
37
  } = require('./defaults')
38
+ const { normalizeService } = require('./normalize-service')
42
39
  const { transformers } = require('./parsers')
43
40
 
44
41
  const RUNTIME_ID = uuid()
@@ -214,10 +211,6 @@ class Config extends ConfigBase {
214
211
 
215
212
  warnWrongOtelSettings()
216
213
 
217
- if (this.DD_TRACE_GIT_METADATA_ENABLED) {
218
- this.#loadGitMetadata()
219
- }
220
-
221
214
  parseErrors.clear()
222
215
  }
223
216
 
@@ -358,10 +351,10 @@ class Config extends ConfigBase {
358
351
  if (this.DD_LOGS_OTEL_ENABLED) {
359
352
  setAndTrack(this, 'logInjection', false)
360
353
  }
361
- if (this.otelMetricsEnabled &&
354
+ if (this.DD_METRICS_OTEL_ENABLED &&
362
355
  trackedConfigOrigins.has('OTEL_METRICS_EXPORTER') &&
363
356
  this.OTEL_METRICS_EXPORTER === 'none') {
364
- setAndTrack(this, 'otelMetricsEnabled', false)
357
+ setAndTrack(this, 'DD_METRICS_OTEL_ENABLED', false)
365
358
  }
366
359
 
367
360
  if (this.OTEL_TRACES_EXPORTER === 'otlp' && this.protocolVersion && this.protocolVersion !== '0.4') {
@@ -512,8 +505,8 @@ class Config extends ConfigBase {
512
505
  } else {
513
506
  const NX_TASK_TARGET_PROJECT = getEnvironmentVariable('NX_TASK_TARGET_PROJECT')
514
507
  if (NX_TASK_TARGET_PROJECT) {
515
- if (this.DD_ENABLE_NX_SERVICE_NAME) {
516
- setAndTrack(this, 'service', NX_TASK_TARGET_PROJECT)
508
+ if (DD_MAJOR >= 6 || this.DD_ENABLE_NX_SERVICE_NAME) {
509
+ setAndTrack(this, 'service', normalizeService(NX_TASK_TARGET_PROJECT) || 'node')
517
510
  isServiceNameInferred = true
518
511
  } else if (DD_MAJOR < 6) {
519
512
  log.warn(
@@ -536,7 +529,7 @@ class Config extends ConfigBase {
536
529
  )
537
530
  : undefined
538
531
 
539
- setAndTrack(this, 'service', serverlessName || pkg.name || 'node')
532
+ setAndTrack(this, 'service', normalizeService(serverlessName) || normalizeService(pkg.name) || 'node')
540
533
  this.tags.service ??= /** @type {string} */ (this.service)
541
534
  isServiceNameInferred = true
542
535
  }
@@ -560,7 +553,7 @@ class Config extends ConfigBase {
560
553
 
561
554
  if (IS_SERVERLESS) {
562
555
  setAndTrack(this, 'telemetry.enabled', false)
563
- setAndTrack(this, 'crashtracking.enabled', false)
556
+ setAndTrack(this, 'DD_CRASHTRACKING_ENABLED', false)
564
557
  setAndTrack(this, 'remoteConfig.enabled', false)
565
558
  }
566
559
 
@@ -627,52 +620,6 @@ class Config extends ConfigBase {
627
620
 
628
621
  telemetry.updateConfig([...configWithOrigin.values()], this)
629
622
  }
630
-
631
- // TODO: Move outside of config. This is unrelated to the config system.
632
- #loadGitMetadata () {
633
- // Try to read Git metadata from the environment variables
634
- this.repositoryUrl = removeUserSensitiveInfo(this.DD_GIT_REPOSITORY_URL ?? this.tags[GIT_REPOSITORY_URL])
635
- this.commitSHA = this.DD_GIT_COMMIT_SHA ?? this.tags[GIT_COMMIT_SHA]
636
-
637
- // Otherwise, try to read Git metadata from the git.properties file
638
- if (!this.repositoryUrl || !this.commitSHA) {
639
- const DD_GIT_PROPERTIES_FILE = this.DD_GIT_PROPERTIES_FILE
640
- const gitPropertiesFile = DD_GIT_PROPERTIES_FILE ?? `${process.cwd()}/git.properties`
641
- try {
642
- const gitPropertiesString = fs.readFileSync(gitPropertiesFile, 'utf8')
643
- const { commitSHA, repositoryUrl } = getGitMetadataFromGitProperties(gitPropertiesString)
644
- this.commitSHA ??= commitSHA
645
- this.repositoryUrl ??= repositoryUrl
646
- } catch (error) {
647
- // Only log error if the user has set a git.properties path
648
- if (DD_GIT_PROPERTIES_FILE) {
649
- log.error('Error reading DD_GIT_PROPERTIES_FILE: %s', gitPropertiesFile, error)
650
- }
651
- }
652
- }
653
-
654
- // Otherwise, try to read Git metadata from the .git/ folder
655
- const DD_GIT_FOLDER_PATH = this.DD_GIT_FOLDER_PATH
656
- const gitFolderPath = DD_GIT_FOLDER_PATH ?? path.join(process.cwd(), '.git')
657
-
658
- if (!this.repositoryUrl) {
659
- // Try to read git config (repository URL)
660
- const gitConfigPath = path.join(gitFolderPath, 'config')
661
- try {
662
- const gitConfigContent = fs.readFileSync(gitConfigPath, 'utf8')
663
- if (gitConfigContent) {
664
- this.repositoryUrl = getRemoteOriginURL(gitConfigContent)
665
- }
666
- } catch (error) {
667
- // Only log error if the user has set a .git/ path
668
- if (DD_GIT_FOLDER_PATH) {
669
- log.error('Error reading git config: %s', gitConfigPath, error)
670
- }
671
- }
672
- }
673
- // Try to read git HEAD (commit SHA)
674
- this.commitSHA ??= resolveGitHeadSHA(gitFolderPath)
675
- }
676
623
  }
677
624
 
678
625
  /**
@@ -0,0 +1,31 @@
1
+ 'use strict'
2
+
3
+ const MAX_SERVICE_LENGTH = 100
4
+
5
+ /**
6
+ * Normalize an inferred service name so APM and runtime metrics agree.
7
+ *
8
+ * The trace agent normalizes span service names on the wire, but the
9
+ * DogStatsD client uses a different tag-value sanitizer, so an inferred
10
+ * `@scope/name` package name appears as `scope/name` in APM and
11
+ * `_scope/name` in runtime metrics. Pre-normalizing pins both consumers
12
+ * (and telemetry / process tags) to the same value.
13
+ *
14
+ * @see https://github.com/DataDog/datadog-agent/blob/main/pkg/trace/traceutil/normalize.go
15
+ * @param {string | undefined} name
16
+ */
17
+ function normalizeService (name) {
18
+ if (!name) return
19
+
20
+ let normalized = name.toLowerCase()
21
+ .replaceAll(/[^a-z0-9_:./-]/g, '_')
22
+ .replace(/^[^a-z0-9]+/, '')
23
+
24
+ if (normalized.length > MAX_SERVICE_LENGTH) {
25
+ normalized = normalized.slice(0, MAX_SERVICE_LENGTH)
26
+ }
27
+
28
+ return normalized
29
+ }
30
+
31
+ module.exports = { normalizeService }
@@ -421,8 +421,7 @@
421
421
  {
422
422
  "implementation": "A",
423
423
  "type": "string",
424
- "default": null,
425
- "internalPropertyName": "appKey"
424
+ "default": null
426
425
  }
427
426
  ],
428
427
  "DD_AZURE_RESOURCE_GROUP": [
@@ -595,8 +594,7 @@
595
594
  {
596
595
  "implementation": "A",
597
596
  "type": "boolean",
598
- "default": "true",
599
- "internalPropertyName": "crashtracking.enabled"
597
+ "default": "true"
600
598
  }
601
599
  ],
602
600
  "DD_CUSTOM_TRACE_ID": [
@@ -770,8 +768,7 @@
770
768
  {
771
769
  "implementation": "B",
772
770
  "type": "boolean",
773
- "default": "true",
774
- "internalPropertyName": "propagateProcessTags.enabled"
771
+ "default": "true"
775
772
  }
776
773
  ],
777
774
  "DD_EXPERIMENTAL_TEST_OPT_SETTINGS_CACHE": [
@@ -926,7 +923,6 @@
926
923
  "implementation": "C",
927
924
  "type": "string",
928
925
  "default": "1-16",
929
- "internalPropertyName": "grpc.client.error.statuses",
930
926
  "transform": "setGRPCRange"
931
927
  }
932
928
  ],
@@ -935,7 +931,6 @@
935
931
  "implementation": "C",
936
932
  "type": "string",
937
933
  "default": "2-16",
938
- "internalPropertyName": "grpc.server.error.statuses",
939
934
  "transform": "setGRPCRange"
940
935
  }
941
936
  ],
@@ -943,24 +938,21 @@
943
938
  {
944
939
  "implementation": "A",
945
940
  "type": "int",
946
- "default": "0",
947
- "internalPropertyName": "heapSnapshot.count"
941
+ "default": "0"
948
942
  }
949
943
  ],
950
944
  "DD_HEAP_SNAPSHOT_DESTINATION": [
951
945
  {
952
946
  "implementation": "A",
953
947
  "type": "string",
954
- "default": "",
955
- "internalPropertyName": "heapSnapshot.destination"
948
+ "default": ""
956
949
  }
957
950
  ],
958
951
  "DD_HEAP_SNAPSHOT_INTERVAL": [
959
952
  {
960
953
  "implementation": "A",
961
954
  "type": "int",
962
- "default": "3600",
963
- "internalPropertyName": "heapSnapshot.interval"
955
+ "default": "3600"
964
956
  }
965
957
  ],
966
958
  "DD_IAST_DB_ROWS_TO_TAINT": [
@@ -1124,24 +1116,21 @@
1124
1116
  {
1125
1117
  "implementation": "A",
1126
1118
  "type": "string",
1127
- "default": null,
1128
- "internalPropertyName": "installSignature.id"
1119
+ "default": null
1129
1120
  }
1130
1121
  ],
1131
1122
  "DD_INSTRUMENTATION_INSTALL_TIME": [
1132
1123
  {
1133
1124
  "implementation": "A",
1134
1125
  "type": "string",
1135
- "default": null,
1136
- "internalPropertyName": "installSignature.time"
1126
+ "default": null
1137
1127
  }
1138
1128
  ],
1139
1129
  "DD_INSTRUMENTATION_INSTALL_TYPE": [
1140
1130
  {
1141
1131
  "implementation": "A",
1142
1132
  "type": "string",
1143
- "default": null,
1144
- "internalPropertyName": "installSignature.type"
1133
+ "default": null
1145
1134
  }
1146
1135
  ],
1147
1136
  "DD_INSTRUMENTATION_TELEMETRY_ENABLED": [
@@ -1159,8 +1148,7 @@
1159
1148
  {
1160
1149
  "implementation": "A",
1161
1150
  "type": "int",
1162
- "default": "30000",
1163
- "internalPropertyName": "profiling.longLivedThreshold"
1151
+ "default": "30000"
1164
1152
  }
1165
1153
  ],
1166
1154
  "DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED": [
@@ -1257,8 +1245,7 @@
1257
1245
  {
1258
1246
  "implementation": "A",
1259
1247
  "type": "boolean",
1260
- "default": "false",
1261
- "internalPropertyName": "otelMetricsEnabled"
1248
+ "default": "false"
1262
1249
  }
1263
1250
  ],
1264
1251
  "DD_MINI_AGENT_PATH": [
@@ -1942,8 +1929,7 @@
1942
1929
  {
1943
1930
  "implementation": "A",
1944
1931
  "type": "boolean",
1945
- "default": "true",
1946
- "internalPropertyName": "trace.aws.addSpanPointers"
1932
+ "default": "true"
1947
1933
  }
1948
1934
  ],
1949
1935
  "DD_TRACE_AWS_SDK_AWS_BATCH_PROPAGATION_ENABLED": [
@@ -2475,8 +2461,7 @@
2475
2461
  {
2476
2462
  "implementation": "A",
2477
2463
  "type": "string",
2478
- "default": null,
2479
- "internalPropertyName": "trace.dynamoDb.tablePrimaryKeys"
2464
+ "default": null
2480
2465
  }
2481
2466
  ],
2482
2467
  "DD_TRACE_ELASTICSEARCH_ENABLED": [
@@ -3174,8 +3159,7 @@
3174
3159
  {
3175
3160
  "implementation": "A",
3176
3161
  "type": "boolean",
3177
- "default": "false",
3178
- "internalPropertyName": "trace.nativeSpanEvents"
3162
+ "default": "false"
3179
3163
  }
3180
3164
  ],
3181
3165
  "DD_TRACE_NET_ENABLED": [
@@ -3418,8 +3402,7 @@
3418
3402
  "type": "string",
3419
3403
  "allowed": "continue|restart|ignore",
3420
3404
  "transform": "toLowerCase",
3421
- "default": "continue",
3422
- "internalPropertyName": "tracePropagationBehaviorExtract"
3405
+ "default": "continue"
3423
3406
  }
3424
3407
  ],
3425
3408
  "DD_TRACE_PROPAGATION_EXTRACT_FIRST": [
@@ -19,10 +19,9 @@ class DataStreamsCheckpointer {
19
19
  if (!this.config.dsmEnabled) return
20
20
 
21
21
  const ctx = this.dsmProcessor.setCheckpoint(
22
- ['type:' + type, 'topic:' + target, 'direction:out', 'manual_checkpoint:true'],
22
+ ['direction:out', 'type:' + type, 'topic:' + target, 'manual_checkpoint:true'],
23
23
  null,
24
- DataStreamsContext.getDataStreamsContext(),
25
- null
24
+ DataStreamsContext.getDataStreamsContext()
26
25
  )
27
26
  DataStreamsContext.setDataStreamsContext(ctx)
28
27
 
@@ -45,17 +44,12 @@ class DataStreamsCheckpointer {
45
44
  const parentCtx = this.tracer.extract('text_map_dsm', carrier)
46
45
  DataStreamsContext.setDataStreamsContext(parentCtx)
47
46
 
48
- const tags = ['type:' + type, 'topic:' + source, 'direction:in']
47
+ const tags = ['direction:in', 'type:' + type, 'topic:' + source]
49
48
  if (manualCheckpoint) {
50
49
  tags.push('manual_checkpoint:true')
51
50
  }
52
51
 
53
- const ctx = this.dsmProcessor.setCheckpoint(
54
- tags,
55
- null,
56
- parentCtx,
57
- null
58
- )
52
+ const ctx = this.dsmProcessor.setCheckpoint(tags, null, parentCtx)
59
53
  DataStreamsContext.setDataStreamsContext(ctx)
60
54
 
61
55
  return ctx
@@ -1,5 +1,7 @@
1
1
  'use strict'
2
2
 
3
+ const maxVarLen64 = 9
4
+
3
5
  /**
4
6
  * Encodes positive and negative numbers, using zig zag encoding to reduce the size of the variable length encoding.
5
7
  * Uses high and low part to ensure those parts are under the limit for byte operations in javascript (32 bits)
@@ -8,15 +10,45 @@
8
10
  * @returns {Uint8Array|undefined}
9
11
  */
10
12
  function encodeVarint (v) {
11
- const sign = v >= 0 ? 0 : 1
13
+ const result = new Uint8Array(maxVarLen64)
14
+ const written = encodeVarintInto(result, 0, v)
15
+ if (written === 0) {
16
+ return
17
+ }
18
+ return result.slice(0, written)
19
+ }
20
+
21
+ /**
22
+ * Writes a zig-zag varint at `target[offset..]` and returns the offset just past the last
23
+ * byte written. Returns `offset` unchanged when the value exceeds MAX_SAFE_INTEGER/2, mirroring
24
+ * the `encodeVarint` overflow contract. Used on the DSM checkpoint hot path to avoid
25
+ * per-call Uint8Array / Buffer allocations.
26
+ * @param {Uint8Array | Buffer} target
27
+ * @param {number} offset
28
+ * @param {number} value
29
+ * @returns {number}
30
+ */
31
+ function encodeVarintInto (target, offset, value) {
32
+ const sign = value >= 0 ? 0 : 1
12
33
  // We leave the least significant bit for the sign.
13
- const double = Math.abs(v) * 2
34
+ const double = Math.abs(value) * 2
14
35
  if (double > Number.MAX_SAFE_INTEGER) {
15
- return
36
+ return offset
16
37
  }
17
- const high = Math.floor(double / 0x1_00_00_00_00)
18
- const low = (double & 0xFF_FF_FF_FF) | sign
19
- return encodeUvarint64(low, high)
38
+ let high = Math.floor(double / 0x1_00_00_00_00)
39
+ let low = (double & 0xFF_FF_FF_FF) | sign
40
+ let i = offset
41
+ const limit = offset + maxVarLen64 - 1
42
+ // if first byte is 1, the number is negative in javascript, but we want to interpret it as positive
43
+ while ((high !== 0 || low < 0 || low > 0x80) && i < limit) {
44
+ target[i] = (low & 0x7F) | 0x80
45
+ low >>>= 7
46
+ low |= (high & 0x7F) << 25
47
+ high >>>= 7
48
+ i++
49
+ }
50
+ target[i] = low & 0x7F
51
+ return i + 1
20
52
  }
21
53
 
22
54
  /**
@@ -35,28 +67,6 @@ function decodeVarint (b) {
35
67
  return [positive ? abs : -abs, bytes]
36
68
  }
37
69
 
38
- const maxVarLen64 = 9
39
-
40
- /**
41
- * @param {number} low
42
- * @param {number} high
43
- * @returns {Uint8Array}
44
- */
45
- function encodeUvarint64 (low, high) {
46
- const result = new Uint8Array(maxVarLen64)
47
- let i = 0
48
- // if first byte is 1, the number is negative in javascript, but we want to interpret it as positive
49
- while ((high !== 0 || low < 0 || low > 0x80) && i < maxVarLen64 - 1) {
50
- result[i] = (low & 0x7F) | 0x80
51
- low >>>= 7
52
- low |= (high & 0x7F) << 25
53
- high >>>= 7
54
- i++
55
- }
56
- result[i] = low & 0x7F
57
- return result.slice(0, i + 1)
58
- }
59
-
60
70
  /**
61
71
  * @param {Uint8Array} bytes
62
72
  * @returns {[number|undefined, number|undefined, Uint8Array]}
@@ -95,5 +105,6 @@ function decodeUvarint64 (
95
105
 
96
106
  module.exports = {
97
107
  encodeVarint,
108
+ encodeVarintInto,
98
109
  decodeVarint,
99
110
  }