dd-trace 5.98.0 → 5.99.1

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 (139) hide show
  1. package/LICENSE-3rdparty.csv +0 -1
  2. package/ext/tags.js +1 -0
  3. package/index.d.ts +9 -1
  4. package/package.json +68 -47
  5. package/packages/datadog-instrumentations/src/crypto.js +45 -0
  6. package/packages/datadog-instrumentations/src/cypress-config.js +122 -16
  7. package/packages/datadog-instrumentations/src/dns.js +24 -56
  8. package/packages/datadog-instrumentations/src/graphql.js +1 -1
  9. package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +74 -0
  10. package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +4 -1
  11. package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
  12. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +10 -3
  13. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +1 -0
  14. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/modelcontextprotocol-sdk.js +59 -0
  15. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +11 -2
  16. package/packages/datadog-instrumentations/src/jest.js +5 -5
  17. package/packages/datadog-instrumentations/src/modelcontextprotocol-sdk.js +7 -0
  18. package/packages/datadog-instrumentations/src/pino.js +4 -28
  19. package/packages/datadog-instrumentations/src/playwright-browser-scripts.js +27 -0
  20. package/packages/datadog-instrumentations/src/playwright.js +5 -17
  21. package/packages/datadog-instrumentations/src/stripe.js +38 -24
  22. package/packages/datadog-instrumentations/src/vitest.js +32 -4
  23. package/packages/datadog-instrumentations/src/zlib.js +29 -0
  24. package/packages/datadog-plugin-aws-sdk/src/base.js +1 -2
  25. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +8 -15
  26. package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -9
  27. package/packages/datadog-plugin-cucumber/src/index.js +2 -2
  28. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +5 -5
  29. package/packages/datadog-plugin-cypress/src/source-map-utils.js +48 -1
  30. package/packages/datadog-plugin-dd-trace-api/src/index.js +1 -1
  31. package/packages/datadog-plugin-graphql/src/utils.js +2 -2
  32. package/packages/datadog-plugin-http/src/server.js +11 -11
  33. package/packages/datadog-plugin-jest/src/index.js +2 -2
  34. package/packages/datadog-plugin-memcached/src/index.js +1 -1
  35. package/packages/datadog-plugin-mocha/src/index.js +1 -2
  36. package/packages/datadog-plugin-modelcontextprotocol-sdk/src/index.js +24 -0
  37. package/packages/datadog-plugin-modelcontextprotocol-sdk/src/tracing.js +55 -0
  38. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -6
  39. package/packages/datadog-plugin-playwright/src/index.js +2 -3
  40. package/packages/datadog-plugin-vitest/src/index.js +14 -6
  41. package/packages/datadog-plugin-ws/src/close.js +2 -0
  42. package/packages/datadog-plugin-ws/src/producer.js +2 -0
  43. package/packages/datadog-plugin-ws/src/receiver.js +1 -0
  44. package/packages/dd-trace/src/aiguard/channels.js +8 -0
  45. package/packages/dd-trace/src/aiguard/index.js +7 -3
  46. package/packages/dd-trace/src/aiguard/sdk.js +44 -0
  47. package/packages/dd-trace/src/aiguard/tags.js +1 -0
  48. package/packages/dd-trace/src/appsec/blocking.js +18 -6
  49. package/packages/dd-trace/src/appsec/graphql.js +7 -7
  50. package/packages/dd-trace/src/appsec/index.js +9 -11
  51. package/packages/dd-trace/src/appsec/rasp/command_injection.js +4 -5
  52. package/packages/dd-trace/src/appsec/rasp/lfi.js +8 -4
  53. package/packages/dd-trace/src/appsec/rasp/sql_injection.js +5 -10
  54. package/packages/dd-trace/src/appsec/rasp/ssrf.js +5 -6
  55. package/packages/dd-trace/src/appsec/recommended.json +2438 -13
  56. package/packages/dd-trace/src/appsec/reporter.js +6 -5
  57. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +4 -8
  58. package/packages/dd-trace/src/appsec/store.js +50 -0
  59. package/packages/dd-trace/src/appsec/waf/index.js +3 -5
  60. package/packages/dd-trace/src/baggage.js +16 -13
  61. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -2
  62. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -2
  63. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -2
  64. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
  65. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +1 -1
  66. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +3 -4
  67. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -2
  68. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -5
  69. package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +3 -4
  70. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +6 -6
  71. package/packages/dd-trace/src/ci-visibility/requests/upload-coverage-report.js +2 -2
  72. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -2
  73. package/packages/dd-trace/src/config/config-types.d.ts +0 -4
  74. package/packages/dd-trace/src/config/defaults.js +10 -10
  75. package/packages/dd-trace/src/config/generated-config-types.d.ts +39 -38
  76. package/packages/dd-trace/src/config/index.js +29 -39
  77. package/packages/dd-trace/src/config/parsers.js +26 -9
  78. package/packages/dd-trace/src/config/supported-configurations.json +46 -78
  79. package/packages/dd-trace/src/debugger/config.js +2 -0
  80. package/packages/dd-trace/src/debugger/devtools_client/send.js +25 -5
  81. package/packages/dd-trace/src/dogstatsd.js +5 -8
  82. package/packages/dd-trace/src/encode/0.4.js +4 -5
  83. package/packages/dd-trace/src/exporter.js +1 -1
  84. package/packages/dd-trace/src/exporters/agent/index.js +0 -1
  85. package/packages/dd-trace/src/exporters/agent/writer.js +1 -2
  86. package/packages/dd-trace/src/exporters/agentless/writer.js +3 -3
  87. package/packages/dd-trace/src/exporters/common/util.js +2 -2
  88. package/packages/dd-trace/src/git_metadata_tagger.js +1 -1
  89. package/packages/dd-trace/src/id.js +2 -0
  90. package/packages/dd-trace/src/index.js +2 -5
  91. package/packages/dd-trace/src/lambda/handler.js +1 -3
  92. package/packages/dd-trace/src/llmobs/constants/tags.js +3 -0
  93. package/packages/dd-trace/src/llmobs/plugins/{anthropic.js → anthropic/index.js} +5 -63
  94. package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +106 -0
  95. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +3 -2
  96. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -2
  97. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +2 -1
  98. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +0 -49
  99. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +2 -1
  100. package/packages/dd-trace/src/llmobs/plugins/langchain/messages.js +76 -0
  101. package/packages/dd-trace/src/llmobs/plugins/langgraph/index.js +1 -26
  102. package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/index.js +68 -0
  103. package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/utils.js +57 -0
  104. package/packages/dd-trace/src/llmobs/sdk.js +23 -3
  105. package/packages/dd-trace/src/llmobs/span_processor.js +14 -1
  106. package/packages/dd-trace/src/llmobs/writers/base.js +7 -1
  107. package/packages/dd-trace/src/llmobs/writers/spans.js +1 -1
  108. package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +103 -0
  109. package/packages/dd-trace/src/openfeature/flagging_provider.js +3 -0
  110. package/packages/dd-trace/src/opentelemetry/logs/index.js +6 -6
  111. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +3 -2
  112. package/packages/dd-trace/src/opentelemetry/metrics/index.js +7 -7
  113. package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +3 -2
  114. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +19 -66
  115. package/packages/dd-trace/src/opentelemetry/trace/index.js +11 -16
  116. package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +11 -3
  117. package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +51 -41
  118. package/packages/dd-trace/src/opentelemetry/tracer.js +9 -11
  119. package/packages/dd-trace/src/opentracing/propagation/text_map.js +30 -23
  120. package/packages/dd-trace/src/opentracing/span.js +2 -2
  121. package/packages/dd-trace/src/opentracing/tracer.js +12 -5
  122. package/packages/dd-trace/src/plugin_manager.js +6 -6
  123. package/packages/dd-trace/src/plugins/index.js +1 -0
  124. package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
  125. package/packages/dd-trace/src/plugins/util/test.js +128 -7
  126. package/packages/dd-trace/src/plugins/util/url.js +2 -1
  127. package/packages/dd-trace/src/profiling/profilers/event_plugins/crypto.js +32 -0
  128. package/packages/dd-trace/src/profiling/profilers/event_plugins/zlib.js +19 -0
  129. package/packages/dd-trace/src/profiling/profilers/events.js +35 -0
  130. package/packages/dd-trace/src/proxy.js +8 -14
  131. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  132. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
  133. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
  134. package/packages/dd-trace/src/span_processor.js +1 -2
  135. package/packages/dd-trace/src/tagger.js +2 -2
  136. package/packages/dd-trace/src/telemetry/send-data.js +5 -7
  137. package/packages/dd-trace/src/tracer.js +2 -2
  138. package/vendor/dist/ignore/LICENSE +0 -21
  139. package/vendor/dist/ignore/index.js +0 -1
@@ -48,8 +48,6 @@ export interface GeneratedConfig {
48
48
  baggageMaxBytes: number;
49
49
  baggageMaxItems: number;
50
50
  baggageTagKeys: string[];
51
- ciVisAgentlessLogSubmissionEnabled: boolean;
52
- ciVisibilityTestSessionName: string | undefined;
53
51
  clientIpEnabled: boolean;
54
52
  clientIpHeader: string | undefined;
55
53
  cloudPayloadTagging: {
@@ -73,16 +71,18 @@ export interface GeneratedConfig {
73
71
  };
74
72
  dbmPropagationMode: string;
75
73
  DD_ACTION_EXECUTION_ID: string | undefined;
74
+ DD_AGENTLESS_LOG_SUBMISSION_ENABLED: boolean;
76
75
  DD_AGENTLESS_LOG_SUBMISSION_URL: string | undefined;
77
76
  DD_APM_FLUSH_DEADLINE_MILLISECONDS: number;
78
77
  DD_AZURE_RESOURCE_GROUP: string | undefined;
79
78
  DD_CIVISIBILITY_AGENTLESS_ENABLED: boolean;
80
79
  DD_CIVISIBILITY_AGENTLESS_URL: string | undefined;
81
- DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER: boolean;
80
+ DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER: string | undefined;
82
81
  DD_CIVISIBILITY_DANGEROUSLY_FORCE_COVERAGE: boolean;
83
82
  DD_CIVISIBILITY_DANGEROUSLY_FORCE_TEST_SKIPPING: boolean;
84
83
  DD_CIVISIBILITY_ENABLED: boolean;
85
84
  DD_CIVISIBILITY_GIT_UNSHALLOW_ENABLED: boolean;
85
+ DD_CIVISIBILITY_MANUAL_API_ENABLED: boolean;
86
86
  DD_CIVISIBILITY_RUM_FLUSH_WAIT_MILLIS: number;
87
87
  DD_CIVISIBILITY_TEST_COMMAND: string | undefined;
88
88
  DD_CIVISIBILITY_TEST_MODULE_ID: string | undefined;
@@ -111,8 +111,12 @@ export interface GeneratedConfig {
111
111
  DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA: string | undefined;
112
112
  DD_GIT_REPOSITORY_URL: string | undefined;
113
113
  DD_GIT_TAG: string | undefined;
114
+ DD_INJECT_FORCE: boolean;
115
+ DD_INJECTION_ENABLED: string | undefined;
116
+ DD_INSTRUMENTATION_CONFIG_ID: string | undefined;
114
117
  DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED: boolean;
115
118
  DD_LAMBDA_HANDLER: string | undefined;
119
+ DD_LOGS_OTEL_ENABLED: boolean;
116
120
  DD_MINI_AGENT_PATH: string | undefined;
117
121
  DD_PIPELINE_EXECUTION_ID: string | undefined;
118
122
  DD_PLAYWRIGHT_WORKER: string | undefined;
@@ -147,6 +151,8 @@ export interface GeneratedConfig {
147
151
  DD_TELEMETRY_FORWARDER_PATH: string | undefined;
148
152
  DD_TEST_FLEET_CONFIG_PATH: string | undefined;
149
153
  DD_TEST_LOCAL_CONFIG_PATH: string | undefined;
154
+ DD_TEST_SESSION_NAME: string | undefined;
155
+ DD_TEST_TIA_KEEP_COV_CONFIG: boolean;
150
156
  DD_TRACE_AEROSPIKE_ENABLED: boolean;
151
157
  DD_TRACE_AI_ENABLED: boolean;
152
158
  DD_TRACE_AMQP10_ENABLED: boolean;
@@ -239,11 +245,13 @@ export interface GeneratedConfig {
239
245
  DD_TRACE_FS_ENABLED: boolean;
240
246
  DD_TRACE_GCP_PUBSUB_PUSH_ENABLED: boolean;
241
247
  DD_TRACE_GENERIC_POOL_ENABLED: boolean;
248
+ DD_TRACE_GIT_METADATA_ENABLED: boolean;
242
249
  DD_TRACE_GOOGLE_CLOUD_PUBSUB_ENABLED: boolean;
243
250
  DD_TRACE_GOOGLE_CLOUD_VERTEXAI_ENABLED: boolean;
244
251
  DD_TRACE_GOOGLE_GAX_ENABLED: boolean;
245
252
  DD_TRACE_GOOGLE_GENAI_ENABLED: boolean;
246
253
  DD_TRACE_GRAPHQL_ENABLED: boolean;
254
+ DD_TRACE_GRAPHQL_ERROR_EXTENSIONS: string[];
247
255
  DD_TRACE_GRAPHQL_TAG_ENABLED: boolean;
248
256
  DD_TRACE_GRAPHQL_TOOLS_ENABLED: boolean;
249
257
  DD_TRACE_GRAPHQL_TOOLS_EXECUTOR_ENABLED: boolean;
@@ -292,11 +300,13 @@ export interface GeneratedConfig {
292
300
  DD_TRACE_LODASH_ENABLED: boolean;
293
301
  DD_TRACE_LOOPBACK_ENABLED: boolean;
294
302
  DD_TRACE_MARIADB_ENABLED: boolean;
303
+ DD_TRACE_MEMCACHED_COMMAND_ENABLED: boolean;
295
304
  DD_TRACE_MEMCACHED_ENABLED: boolean;
296
305
  DD_TRACE_MICROGATEWAY_CORE_ENABLED: boolean;
297
306
  DD_TRACE_MIDDIE_ENABLED: boolean;
298
307
  DD_TRACE_MOCHA_EACH_ENABLED: boolean;
299
308
  DD_TRACE_MOCHA_ENABLED: boolean;
309
+ DD_TRACE_MODELCONTEXTPROTOCOL_SDK_ENABLED: boolean;
300
310
  DD_TRACE_MOLECULER_ENABLED: boolean;
301
311
  DD_TRACE_MONGODB_CORE_ENABLED: boolean;
302
312
  DD_TRACE_MONGODB_ENABLED: boolean;
@@ -334,6 +344,7 @@ export interface GeneratedConfig {
334
344
  DD_TRACE_PROCESS_ENABLED: boolean;
335
345
  DD_TRACE_PROMISE_ENABLED: boolean;
336
346
  DD_TRACE_PROMISE_JS_ENABLED: boolean;
347
+ DD_TRACE_PROPAGATION_EXTRACT_FIRST: boolean;
337
348
  DD_TRACE_PROPAGATION_STYLE: string[];
338
349
  DD_TRACE_PROTOBUFJS_ENABLED: boolean;
339
350
  DD_TRACE_PUG_ENABLED: boolean;
@@ -351,6 +362,7 @@ export interface GeneratedConfig {
351
362
  DD_TRACE_SEQUELIZE_ENABLED: boolean;
352
363
  DD_TRACE_SHAREDB_ENABLED: boolean;
353
364
  DD_TRACE_SMITHY_SMITHY_CLIENT_ENABLED: boolean;
365
+ DD_TRACE_SPAN_LEAK_DEBUG: number;
354
366
  DD_TRACE_SQLITE3_ENABLED: boolean;
355
367
  DD_TRACE_SUFFIXPLUGIN_ENABLED: boolean;
356
368
  DD_TRACE_TAGS: Record<string, string> | undefined;
@@ -364,6 +376,7 @@ export interface GeneratedConfig {
364
376
  DD_TRACE_WINSTON_ENABLED: boolean;
365
377
  DD_TRACE_WORKERPOOL_ENABLED: boolean;
366
378
  DD_TRACE_WS_ENABLED: boolean;
379
+ DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH: number;
367
380
  DD_VITEST_WORKER: string | undefined;
368
381
  dogstatsd: {
369
382
  hostname: string;
@@ -404,8 +417,6 @@ export interface GeneratedConfig {
404
417
  flakyTestRetriesCount: number;
405
418
  flushInterval: number;
406
419
  flushMinSpans: number;
407
- gitMetadataEnabled: boolean;
408
- graphqlErrorExtensions: string[];
409
420
  grpc: {
410
421
  client: {
411
422
  error: {
@@ -442,21 +453,16 @@ export interface GeneratedConfig {
442
453
  telemetryVerbosity: string;
443
454
  };
444
455
  inferredProxyServicesEnabled: boolean;
445
- injectForce: boolean;
446
- injectionEnabled: string | undefined;
447
456
  installSignature: {
448
457
  id: string | undefined;
449
458
  time: string | undefined;
450
459
  type: string | undefined;
451
460
  };
452
- instrumentation_config_id: string | undefined;
453
461
  isEarlyFlakeDetectionEnabled: boolean;
454
462
  isFlakyTestRetriesEnabled: boolean;
455
463
  isGitUploadEnabled: boolean;
456
464
  isImpactedTestsEnabled: boolean;
457
465
  isIntelligentTestRunnerEnabled: boolean;
458
- isKeepingCoverageConfiguration: boolean;
459
- isManualApiEnabled: boolean;
460
466
  isTestDynamicInstrumentationEnabled: boolean;
461
467
  isTestManagementEnabled: boolean;
462
468
  langchain: {
@@ -471,43 +477,41 @@ export interface GeneratedConfig {
471
477
  };
472
478
  logInjection: boolean;
473
479
  logLevel: "debug" | "info" | "warn" | "error";
474
- memcachedCommandEnabled: boolean;
475
480
  middlewareTracingEnabled: boolean;
476
481
  openai: {
477
482
  spanCharLimit: number;
478
483
  };
479
484
  openAiLogsEnabled: boolean;
485
+ OTEL_BSP_MAX_EXPORT_BATCH_SIZE: number;
486
+ OTEL_BSP_MAX_QUEUE_SIZE: number;
487
+ OTEL_BSP_SCHEDULE_DELAY: number;
480
488
  OTEL_EXPORTER_OTLP_ENDPOINT: string | undefined;
489
+ OTEL_EXPORTER_OTLP_HEADERS: Record<string, string> | undefined;
490
+ OTEL_EXPORTER_OTLP_LOGS_ENDPOINT: string;
491
+ OTEL_EXPORTER_OTLP_LOGS_HEADERS: Record<string, string> | undefined;
492
+ OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: string;
493
+ OTEL_EXPORTER_OTLP_LOGS_TIMEOUT: number;
494
+ OTEL_EXPORTER_OTLP_METRICS_ENDPOINT: string;
495
+ OTEL_EXPORTER_OTLP_METRICS_HEADERS: Record<string, string> | undefined;
496
+ OTEL_EXPORTER_OTLP_METRICS_PROTOCOL: string;
497
+ OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: "DELTA" | "CUMULATIVE" | "LOWMEMORY";
498
+ OTEL_EXPORTER_OTLP_METRICS_TIMEOUT: number;
499
+ OTEL_EXPORTER_OTLP_PROTOCOL: string;
500
+ OTEL_EXPORTER_OTLP_TIMEOUT: number;
501
+ OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: string;
502
+ OTEL_EXPORTER_OTLP_TRACES_HEADERS: Record<string, string> | undefined;
503
+ OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: "http/json";
504
+ OTEL_EXPORTER_OTLP_TRACES_TIMEOUT: number;
481
505
  OTEL_LOGS_EXPORTER: "none" | "otlp" | undefined;
506
+ OTEL_METRIC_EXPORT_INTERVAL: number;
507
+ OTEL_METRIC_EXPORT_TIMEOUT: number;
482
508
  OTEL_METRICS_EXPORTER: "none" | "otlp" | undefined;
483
509
  OTEL_RESOURCE_ATTRIBUTES: Record<string, string>;
484
510
  OTEL_SDK_DISABLED: boolean;
485
- OTEL_TRACES_EXPORTER: "none" | "otlp";
511
+ OTEL_TRACES_EXPORTER: "none" | "otlp" | undefined;
486
512
  OTEL_TRACES_SAMPLER: "always_on" | "always_off" | "traceidratio" | "parentbased_always_on" | "parentbased_always_off" | "parentbased_traceidratio";
487
513
  OTEL_TRACES_SAMPLER_ARG: number | undefined;
488
- otelBatchTimeout: number;
489
- otelHeaders: string | undefined;
490
- otelLogsEnabled: boolean;
491
- otelLogsHeaders: string | undefined;
492
- otelLogsProtocol: string;
493
- otelLogsTimeout: number;
494
- otelLogsUrl: string | undefined;
495
- otelMaxExportBatchSize: number;
496
- otelMaxQueueSize: number;
497
514
  otelMetricsEnabled: boolean;
498
- otelMetricsExportInterval: number;
499
- otelMetricsExportTimeout: number;
500
- otelMetricsHeaders: string | undefined;
501
- otelMetricsProtocol: string;
502
- otelMetricsTemporalityPreference: "DELTA" | "CUMULATIVE" | "LOWMEMORY";
503
- otelMetricsTimeout: number;
504
- otelMetricsUrl: string | undefined;
505
- otelProtocol: string;
506
- otelTimeout: number;
507
- otelTracesHeaders: Record<string, string> | undefined;
508
- otelTracesProtocol: string;
509
- otelTracesTimeout: number;
510
- otelTracesUrl: string | undefined;
511
515
  peerServiceMapping: Record<string, string>;
512
516
  port: string | number;
513
517
  profiling: {
@@ -536,12 +540,11 @@ export interface GeneratedConfig {
536
540
  sampleRate: number | undefined;
537
541
  samplingRules: import('../../../../index').SamplingRule[];
538
542
  scope: string | undefined;
539
- service: string | undefined;
543
+ service: string;
540
544
  serviceMapping: Record<string, string>;
541
545
  site: string;
542
546
  spanAttributeSchema: "v0" | "v1";
543
547
  spanComputePeerService: boolean;
544
- spanLeakDebug: number;
545
548
  spanRemoveIntegrationFromService: boolean;
546
549
  spanSamplingRules: import('../../../../index').SpanSamplingRule[] | undefined;
547
550
  startupLogs: boolean;
@@ -549,7 +552,6 @@ export interface GeneratedConfig {
549
552
  enabled: boolean;
550
553
  };
551
554
  tags: Record<string, string>;
552
- tagsHeaderMaxLength: number;
553
555
  telemetry: {
554
556
  debug: boolean;
555
557
  dependencyCollection: boolean;
@@ -572,7 +574,6 @@ export interface GeneratedConfig {
572
574
  traceId128BitGenerationEnabled: boolean;
573
575
  traceId128BitLoggingEnabled: boolean;
574
576
  tracePropagationBehaviorExtract: "continue" | "restart" | "ignore";
575
- tracePropagationExtractFirst: boolean;
576
577
  tracePropagationStyle: {
577
578
  extract: string[];
578
579
  inject: string[];
@@ -131,7 +131,13 @@ function setAndTrack (config, name, value, rawValue = value, source = 'calculate
131
131
  }
132
132
  changeTracker[source].add(name)
133
133
  } else {
134
- const copy = typeof value === 'object' && value !== null ? rfdc(value) : value
134
+ // Programmatic-only options (e.g. logger, lookup, plugins) have no row in
135
+ // `configurationsTable` and hold opaque user-supplied references that may
136
+ // carry cycles or non-plain prototypes — for example a winston Logger
137
+ // extends a Transform stream. Use a reference for these instead of cloning.
138
+ const copy = typeof value === 'object' && value !== null && name in configurationsTable
139
+ ? rfdc(value)
140
+ : value
135
141
  changeTracker.baseValuesByPath[name] = { value: copy, source }
136
142
  }
137
143
  set(config, name, value)
@@ -208,7 +214,7 @@ class Config extends ConfigBase {
208
214
 
209
215
  warnWrongOtelSettings()
210
216
 
211
- if (this.gitMetadataEnabled) {
217
+ if (this.DD_TRACE_GIT_METADATA_ENABLED) {
212
218
  this.#loadGitMetadata()
213
219
  }
214
220
 
@@ -349,7 +355,7 @@ class Config extends ConfigBase {
349
355
  }
350
356
  // Disable log injection when OTEL logs are enabled
351
357
  // OTEL logs and DD log injection are mutually exclusive
352
- if (this.otelLogsEnabled) {
358
+ if (this.DD_LOGS_OTEL_ENABLED) {
353
359
  setAndTrack(this, 'logInjection', false)
354
360
  }
355
361
  if (this.otelMetricsEnabled &&
@@ -358,21 +364,9 @@ class Config extends ConfigBase {
358
364
  setAndTrack(this, 'otelMetricsEnabled', false)
359
365
  }
360
366
 
361
- const otelTracesEnabled = trackedConfigOrigins.has('OTEL_TRACES_EXPORTER') &&
362
- this.OTEL_TRACES_EXPORTER === 'otlp'
363
- if (this.protocolVersion && this.protocolVersion !== '0.4' && otelTracesEnabled) {
367
+ if (this.OTEL_TRACES_EXPORTER === 'otlp' && this.protocolVersion && this.protocolVersion !== '0.4') {
364
368
  log.warn('DD_TRACE_AGENT_PROTOCOL_VERSION is set, disabling OTLP traces export')
365
- setAndTrack(this, 'otelTracesEnabled', false)
366
- } else {
367
- setAndTrack(this, 'otelTracesEnabled', otelTracesEnabled)
368
- }
369
-
370
- if (this.otelTracesProtocol && this.otelTracesProtocol !== 'http/json') {
371
- log.warn(
372
- 'OTEL_EXPORTER_OTLP_TRACES_PROTOCOL=%s is not yet supported; only http/json is currently implemented',
373
- this.otelTracesProtocol
374
- )
375
- setAndTrack(this, 'otelTracesProtocol', 'http/json')
369
+ setAndTrack(this, 'OTEL_TRACES_EXPORTER', 'none')
376
370
  }
377
371
 
378
372
  if (this.telemetry.heartbeatInterval) {
@@ -433,7 +427,7 @@ class Config extends ConfigBase {
433
427
  ))
434
428
  }
435
429
 
436
- if (this.injectionEnabled) {
430
+ if (this.DD_INJECTION_ENABLED) {
437
431
  setAndTrack(this, 'instrumentationSource', 'ssi')
438
432
  }
439
433
 
@@ -441,16 +435,13 @@ class Config extends ConfigBase {
441
435
  setAndTrack(this, 'runtimeMetrics.enabled', false)
442
436
  }
443
437
 
444
- if (!trackedConfigOrigins.has('sampleRate')) {
445
- const effectiveSampler = (trackedConfigOrigins.has('OTEL_TRACES_EXPORTER') &&
446
- this.OTEL_TRACES_EXPORTER === 'otlp' &&
447
- !trackedConfigOrigins.has('OTEL_TRACES_SAMPLER'))
448
- ? 'parentbased_always_on'
449
- : this.OTEL_TRACES_SAMPLER
450
- if (effectiveSampler && (trackedConfigOrigins.has('OTEL_TRACES_SAMPLER') ||
451
- trackedConfigOrigins.has('OTEL_TRACES_EXPORTER'))) {
452
- setAndTrack(this, 'sampleRate', getFromOtelSamplerMap(effectiveSampler, this.OTEL_TRACES_SAMPLER_ARG))
453
- }
438
+ // Apply the OTel sampler when the user opted into OTel traces or explicitly set the sampler.
439
+ // OTEL_TRACES_SAMPLER has `default: parentbased_always_on` (per OTel spec), so opt-in users
440
+ // that don't set the sampler still get parent-based sampling.
441
+ if (!trackedConfigOrigins.has('sampleRate') &&
442
+ (trackedConfigOrigins.has('OTEL_TRACES_SAMPLER') || this.OTEL_TRACES_EXPORTER === 'otlp')) {
443
+ setAndTrack(this, 'sampleRate',
444
+ getFromOtelSamplerMap(this.OTEL_TRACES_SAMPLER, this.OTEL_TRACES_SAMPLER_ARG))
454
445
  }
455
446
 
456
447
  if (this.DD_SPAN_SAMPLING_RULES_FILE) {
@@ -605,19 +596,18 @@ class Config extends ConfigBase {
605
596
  }
606
597
  }
607
598
 
608
- const DEFAULT_OTLP_PORT = '4318'
609
- if (!this.otelLogsUrl) {
610
- setAndTrack(this, 'otelLogsUrl', `http://${agentHostname}:${DEFAULT_OTLP_PORT}`)
599
+ // TODO: This could likely be moved to the base class and allow easier GRPC handling
600
+ // Default OTLP endpoints follow the configured agent host so users who point DD at a custom
601
+ // agent (DD_AGENT_HOST / DD_TRACE_AGENT_URL) also reach OTLP on that host.
602
+ const defaultOtlpBase = this.OTEL_EXPORTER_OTLP_ENDPOINT?.replace(/\/$/, '') ?? `http://${agentHostname}:4318`
603
+ if (!this.OTEL_EXPORTER_OTLP_LOGS_ENDPOINT) {
604
+ setAndTrack(this, 'OTEL_EXPORTER_OTLP_LOGS_ENDPOINT', `${defaultOtlpBase}/v1/logs`)
611
605
  }
612
- if (!this.otelMetricsUrl) {
613
- setAndTrack(this, 'otelMetricsUrl', `http://${agentHostname}:${DEFAULT_OTLP_PORT}/v1/metrics`)
606
+ if (!this.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT) {
607
+ setAndTrack(this, 'OTEL_EXPORTER_OTLP_METRICS_ENDPOINT', `${defaultOtlpBase}/v1/metrics`)
614
608
  }
615
- if (!trackedConfigOrigins.has('otelTracesUrl') && this.OTEL_EXPORTER_OTLP_ENDPOINT) {
616
- // Generic OTLP endpoint: per spec, append /v1/traces signal-specific subpath
617
- setAndTrack(this, 'otelTracesUrl', this.OTEL_EXPORTER_OTLP_ENDPOINT.replace(/\/$/, '') + '/v1/traces')
618
- } else if (!this.otelTracesUrl) {
619
- const tracesHostname = agentHostname === '127.0.0.1' ? 'localhost' : agentHostname
620
- setAndTrack(this, 'otelTracesUrl', `http://${tracesHostname}:${DEFAULT_OTLP_PORT}/v1/traces`)
609
+ if (!this.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT) {
610
+ setAndTrack(this, 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', `${defaultOtlpBase}/v1/traces`)
621
611
  }
622
612
 
623
613
  if (process.platform === 'win32') {
@@ -13,6 +13,15 @@ const VALID_PROPAGATION_STYLES = new Set([
13
13
  'datadog', 'tracecontext', 'b3', 'b3 single header', 'b3multi', 'baggage', 'none',
14
14
  ])
15
15
 
16
+ const RENAMED_OTEL_TAGS = new Map(
17
+ [
18
+ ['deployment.environment.name', 'env'],
19
+ ['deployment.environment', 'env'],
20
+ ['service.name', 'service'],
21
+ ['service.version', 'version'],
22
+ ]
23
+ )
24
+
16
25
  function toCase (value, methodName) {
17
26
  if (Array.isArray(value)) {
18
27
  return value.map(item => {
@@ -66,12 +75,12 @@ const transformers = {
66
75
  }
67
76
  return value
68
77
  },
69
- parseOtelTags (value, optionName) {
70
- return parsers.MAP(value
71
- ?.replace(/(^|,)deployment\.environment=/, '$1env:')
72
- .replace(/(^|,)service\.name=/, '$1service:')
73
- .replace(/(^|,)service\.version=/, '$1version:')
74
- .replaceAll('=', ':'), optionName)
78
+ parseOtelTags (object) {
79
+ const tags = {}
80
+ for (const [key, value] of Object.entries(object)) {
81
+ tags[RENAMED_OTEL_TAGS.get(key) ?? key] = value
82
+ }
83
+ return tags
75
84
  },
76
85
  normalizeProfilingEnabled (configValue) {
77
86
  if (configValue == null) {
@@ -225,11 +234,19 @@ const parsers = {
225
234
  if (!raw) {
226
235
  return entries
227
236
  }
228
- // DD_TAGS is a special case. It may be a map of key-value pairs separated by spaces.
229
- if (optionName === 'DD_TAGS' && !raw.includes(',')) {
237
+ let valueSeparator = ':'
238
+ if (optionName.startsWith('OTEL_')) {
239
+ // OTEL spec uses `key=value,key=value`
240
+ // (https://opentelemetry.io/docs/specs/otel/protocol/exporter/#specifying-headers-via-environment-variables),
241
+ // while DD uses `key:value,key:value`. Parse OTEL-prefixed options with `=` so downstream code
242
+ // receives a proper map and telemetry reports the parsed entries. The char-by-char loop
243
+ // avoids the allocations that `split(',')` + `indexOf('=')` do per pair.
244
+ valueSeparator = '='
245
+ } else if (optionName === 'DD_TAGS' && !raw.includes(',')) {
246
+ // DD_TAGS is a special case. It may be a map of key-value pairs separated by spaces.
230
247
  raw = raw.replaceAll(/\s+/g, ',')
231
248
  }
232
- tagger.add(entries, raw)
249
+ tagger.add(entries, raw, valueSeparator)
233
250
  return entries
234
251
  },
235
252
  JSON (raw) {