dd-trace 6.12.0 → 6.14.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.
- package/LICENSE-3rdparty.csv +3 -1
- package/ci/init.js +8 -3
- package/ci/test-optimization-validation/ci-package-scripts.js +2 -2
- package/ci/test-optimization-validation/ci-remediation.js +6 -6
- package/ci/test-optimization-validation/command-blocker.js +7 -5
- package/ci/test-optimization-validation/framework-adapters/cucumber.js +1 -1
- package/ci/test-optimization-validation/framework-adapters/cypress.js +9 -11
- package/ci/test-optimization-validation/framework-adapters/vitest.js +3 -3
- package/ci/test-optimization-validation/package-check.js +1 -1
- package/ci/test-optimization-validation/report-writer.js +7 -5
- package/ci/test-optimization-validation/scenarios/ci-wiring.js +5 -4
- package/ci/vitest-no-worker-init-runner-setup.mjs +8 -0
- package/ci/vitest-no-worker-init-setup.mjs +13 -13
- package/ci/vitest-no-worker-init-v5-setup.mjs +4 -0
- package/index.d.ts +127 -26
- package/package.json +22 -19
- package/packages/datadog-esbuild/index.js +3 -1
- package/packages/datadog-instrumentations/src/bunyan.js +4 -2
- package/packages/datadog-instrumentations/src/cypress-config.js +19 -17
- package/packages/datadog-instrumentations/src/fs.js +24 -20
- package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -2
- package/packages/datadog-instrumentations/src/graphql.js +16 -16
- package/packages/datadog-instrumentations/src/helpers/bunyan.js +12 -3
- package/packages/datadog-instrumentations/src/helpers/graphql-jit-runtime.js +504 -0
- package/packages/datadog-instrumentations/src/helpers/hooks.js +2 -0
- package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +266 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +1 -2
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +95 -30
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/ai.js +0 -25
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/graphql-jit.js +83 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/graphql.js +85 -1
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +1 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/mercurius.js +30 -12
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +13 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +279 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +12 -1
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +562 -27
- package/packages/datadog-instrumentations/src/jest.js +165 -38
- package/packages/datadog-instrumentations/src/knex.js +76 -0
- package/packages/datadog-instrumentations/src/mariadb-bundle.js +1597 -0
- package/packages/datadog-instrumentations/src/mariadb.js +13 -0
- package/packages/datadog-instrumentations/src/mocha/common.js +59 -2
- package/packages/datadog-instrumentations/src/mocha/main.js +25 -15
- package/packages/datadog-instrumentations/src/mocha/utils.js +2 -1
- package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +98 -0
- package/packages/datadog-instrumentations/src/mocha/worker.js +12 -8
- package/packages/datadog-instrumentations/src/net.js +14 -17
- package/packages/datadog-instrumentations/src/next.js +212 -62
- package/packages/datadog-instrumentations/src/openai.js +42 -40
- package/packages/datadog-instrumentations/src/pg.js +15 -0
- package/packages/datadog-instrumentations/src/pino.js +15 -4
- package/packages/datadog-instrumentations/src/playwright.js +137 -27
- package/packages/datadog-instrumentations/src/rum-browser-scripts.js +40 -0
- package/packages/datadog-instrumentations/src/sequelize.js +94 -2
- package/packages/datadog-instrumentations/src/undici.js +53 -4
- package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +44 -7
- package/packages/datadog-instrumentations/src/vitest-main.js +92 -9
- package/packages/datadog-instrumentations/src/vitest-worker.js +82 -14
- package/packages/datadog-instrumentations/src/webdriverio.js +986 -1
- package/packages/datadog-instrumentations/src/winston.js +6 -3
- package/packages/datadog-plugin-amqp10/src/consumer.js +3 -1
- package/packages/datadog-plugin-amqp10/src/producer.js +3 -1
- package/packages/datadog-plugin-amqp10/src/util.js +2 -1
- package/packages/datadog-plugin-avsc/src/schema_iterator.js +6 -1
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +16 -5
- package/packages/datadog-plugin-cassandra-driver/src/index.js +8 -3
- package/packages/datadog-plugin-cucumber/src/index.js +0 -2
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +262 -48
- package/packages/datadog-plugin-cypress/src/support.js +1 -0
- package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +4 -1
- package/packages/datadog-plugin-graphql/src/execute.js +998 -196
- package/packages/datadog-plugin-graphql/src/index.js +27 -7
- package/packages/datadog-plugin-graphql/src/jit.js +136 -0
- package/packages/datadog-plugin-graphql/src/request.js +18 -27
- package/packages/datadog-plugin-graphql/src/resolve-error.js +108 -0
- package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -2
- package/packages/datadog-plugin-graphql/src/tools/transforms.js +45 -3
- package/packages/datadog-plugin-graphql/src/utils.js +208 -120
- package/packages/datadog-plugin-graphql/src/validate.js +10 -23
- package/packages/datadog-plugin-http/src/client.js +2 -15
- package/packages/datadog-plugin-http2/src/client.js +2 -15
- package/packages/datadog-plugin-jest/src/index.js +0 -6
- package/packages/datadog-plugin-langchain/src/tracing.js +7 -0
- package/packages/datadog-plugin-mocha/src/index.js +403 -75
- package/packages/datadog-plugin-mongodb-core/src/query.js +6 -0
- package/packages/datadog-plugin-mysql/src/index.js +41 -15
- package/packages/datadog-plugin-net/src/tcp.js +3 -1
- package/packages/datadog-plugin-next/src/index.js +63 -29
- package/packages/datadog-plugin-openai-agents/src/integration.js +15 -11
- package/packages/datadog-plugin-playwright/src/index.js +176 -28
- package/packages/datadog-plugin-undici/src/index.js +29 -56
- package/packages/datadog-plugin-vitest/src/index.js +6 -12
- package/packages/dd-trace/src/aiguard/evaluation.js +96 -21
- package/packages/dd-trace/src/aiguard/integrations/vercel-ai.js +2 -3
- package/packages/dd-trace/src/aiguard/messages/anthropic.js +29 -10
- package/packages/dd-trace/src/aiguard/messages/openai.js +8 -1
- package/packages/dd-trace/src/aiguard/messages/vercel-ai.js +20 -6
- package/packages/dd-trace/src/aiguard/noop.js +9 -1
- package/packages/dd-trace/src/aiguard/redaction.js +183 -0
- package/packages/dd-trace/src/aiguard/sdk.js +7 -2
- package/packages/dd-trace/src/aiguard/tags.js +2 -0
- package/packages/dd-trace/src/appsec/api_security/index.js +23 -6
- package/packages/dd-trace/src/appsec/api_security/sampler.js +99 -40
- package/packages/dd-trace/src/appsec/graphql.js +6 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +3 -3
- package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -1
- package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +8 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +11 -36
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +10 -9
- package/packages/dd-trace/src/appsec/lambda.js +44 -26
- package/packages/dd-trace/src/appsec/rule_manager.js +2 -0
- package/packages/dd-trace/src/ci-visibility/encode/json-encoder.js +32 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +8 -8
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +6 -4
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +20 -4
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/request-tracker.js +7 -150
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +7 -6
- package/packages/dd-trace/src/ci-visibility/exporters/agents.js +54 -0
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/writer.js +1 -2
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +397 -234
- package/packages/dd-trace/src/ci-visibility/exporters/limits.js +9 -0
- package/packages/dd-trace/src/ci-visibility/exporters/request.js +323 -31
- package/packages/dd-trace/src/ci-visibility/exporters/settings-cache-key.js +42 -0
- package/packages/dd-trace/src/ci-visibility/final-flush.js +21 -0
- package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +57 -18
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +0 -3
- package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +164 -71
- package/packages/dd-trace/src/ci-visibility/requests/video-request.js +176 -0
- package/packages/dd-trace/src/ci-visibility/telemetry.js +10 -7
- package/packages/dd-trace/src/ci-visibility/test-video.js +61 -0
- package/packages/dd-trace/src/config/generated-config-types.d.ts +10 -0
- package/packages/dd-trace/src/config/index.js +75 -14
- package/packages/dd-trace/src/config/parsers.js +11 -1
- package/packages/dd-trace/src/config/stable.js +3 -3
- package/packages/dd-trace/src/config/supported-configurations.json +47 -2
- package/packages/dd-trace/src/crashtracking/crashtracker.js +82 -18
- package/packages/dd-trace/src/debugger/config.js +12 -1
- package/packages/dd-trace/src/debugger/constants.js +1 -0
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +2 -1
- package/packages/dd-trace/src/debugger/devtools_client/request-options.js +33 -0
- package/packages/dd-trace/src/debugger/devtools_client/send.js +7 -39
- package/packages/dd-trace/src/debugger/devtools_client/status.js +11 -6
- package/packages/dd-trace/src/debugger/devtools_client/tags.js +41 -0
- package/packages/dd-trace/src/debugger/index.js +23 -3
- package/packages/dd-trace/src/dogstatsd.js +532 -71
- package/packages/dd-trace/src/encode/0.4-cross-payload.js +170 -0
- package/packages/dd-trace/src/encode/0.4.js +5 -5
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +9 -8
- package/packages/dd-trace/src/evp_proxy/direct.js +27 -23
- package/packages/dd-trace/src/exporters/agent/index.js +24 -3
- package/packages/dd-trace/src/exporters/agent/writer.js +28 -11
- package/packages/dd-trace/src/exporters/agentless/index.js +7 -9
- package/packages/dd-trace/src/exporters/agentless/writer.js +100 -118
- package/packages/dd-trace/src/exporters/common/agents.js +28 -6
- package/packages/dd-trace/src/exporters/common/buffering-exporter.js +2 -2
- package/packages/dd-trace/src/exporters/common/final-flush-request-tracker.js +191 -0
- package/packages/dd-trace/src/exporters/common/request.js +31 -11
- package/packages/dd-trace/src/exporters/common/url.js +40 -1
- package/packages/dd-trace/src/exporters/common/writer.js +31 -7
- package/packages/dd-trace/src/exporters/span-stats/index.js +23 -4
- package/packages/dd-trace/src/external-logger/src/index.js +4 -3
- package/packages/dd-trace/src/flush.js +105 -0
- package/packages/dd-trace/src/id.js +14 -0
- package/packages/dd-trace/src/index.js +5 -2
- package/packages/dd-trace/src/llmobs/experiments/client.js +4 -0
- package/packages/dd-trace/src/llmobs/experiments/dataset.js +52 -2
- package/packages/dd-trace/src/llmobs/experiments/experiment.js +420 -105
- package/packages/dd-trace/src/llmobs/experiments/index.js +54 -42
- package/packages/dd-trace/src/llmobs/experiments/noop.js +39 -8
- package/packages/dd-trace/src/llmobs/experiments/result.js +1 -0
- package/packages/dd-trace/src/llmobs/experiments/util.js +21 -0
- package/packages/dd-trace/src/llmobs/index.js +111 -48
- package/packages/dd-trace/src/llmobs/noop.js +2 -1
- package/packages/dd-trace/src/llmobs/plugins/ai/ddTelemetry.js +22 -71
- package/packages/dd-trace/src/llmobs/plugins/ai/vercelTelemetry.js +23 -13
- package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +8 -4
- package/packages/dd-trace/src/llmobs/plugins/claude-agent-sdk/index.js +6 -3
- package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +7 -0
- package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +13 -6
- package/packages/dd-trace/src/llmobs/plugins/openai-agents/utils.js +5 -7
- package/packages/dd-trace/src/llmobs/util.js +0 -33
- package/packages/dd-trace/src/llmobs/writers/base.js +106 -53
- package/packages/dd-trace/src/log/index.js +7 -1
- package/packages/dd-trace/src/log-submission/log-submission-plugin.js +249 -0
- package/packages/dd-trace/src/noop/span.js +5 -0
- package/packages/dd-trace/src/openfeature/writers/base.js +14 -12
- package/packages/dd-trace/src/openfeature/writers/exposures.js +8 -1
- package/packages/dd-trace/src/openfeature/writers/util.js +1 -1
- package/packages/dd-trace/src/opentelemetry/logs/batch_log_processor.js +45 -3
- package/packages/dd-trace/src/opentelemetry/logs/index.js +9 -25
- package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +7 -4
- package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +14 -4
- package/packages/dd-trace/src/opentelemetry/metrics/index.js +18 -23
- package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +8 -0
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +18 -6
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_exporter.js +14 -2
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +25 -5
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +61 -25
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +19 -4
- package/packages/dd-trace/src/opentelemetry/resource-attributes.js +55 -0
- package/packages/dd-trace/src/opentelemetry/trace/index.js +6 -1
- package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +10 -0
- package/packages/dd-trace/src/opentelemetry/tracer.js +26 -2
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +494 -351
- package/packages/dd-trace/src/opentracing/span.js +28 -0
- package/packages/dd-trace/src/otel-thread-ctx.js +23 -5
- package/packages/dd-trace/src/payload-tagging/index.js +2 -1
- package/packages/dd-trace/src/plugin_manager.js +2 -0
- package/packages/dd-trace/src/plugins/ci_plugin.js +1 -6
- package/packages/dd-trace/src/plugins/tracing.js +12 -10
- package/packages/dd-trace/src/plugins/util/ci.js +3 -1
- package/packages/dd-trace/src/plugins/util/inferred_proxy.js +16 -15
- package/packages/dd-trace/src/plugins/util/status-validator.js +98 -0
- package/packages/dd-trace/src/plugins/util/test.js +157 -41
- package/packages/dd-trace/src/plugins/util/url.js +2 -2
- package/packages/dd-trace/src/plugins/util/web.js +6 -74
- package/packages/dd-trace/src/profiling/config.js +1 -0
- package/packages/dd-trace/src/profiling/oom.js +11 -5
- package/packages/dd-trace/src/profiling/profiler.js +30 -13
- package/packages/dd-trace/src/profiling/profilers/events.js +3 -3
- package/packages/dd-trace/src/profiling/profilers/space.js +38 -11
- package/packages/dd-trace/src/profiling/profilers/wall.js +14 -14
- package/packages/dd-trace/src/profiling/webspan-utils.js +7 -4
- package/packages/dd-trace/src/proxy.js +108 -10
- package/packages/dd-trace/src/remote_config/index.js +319 -101
- package/packages/dd-trace/src/remote_config/scheduler.js +37 -12
- package/packages/dd-trace/src/runtime_metrics/client.js +37 -8
- package/packages/dd-trace/src/runtime_metrics/index.js +5 -0
- package/packages/dd-trace/src/runtime_metrics/otlp_runtime_metrics.js +10 -1
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +22 -7
- package/packages/dd-trace/src/sampling_rule.js +36 -9
- package/packages/dd-trace/src/serverless/telemetry-delivery-tracker.js +51 -0
- package/packages/dd-trace/src/serverless/vercel.js +155 -0
- package/packages/dd-trace/src/serverless.js +45 -21
- package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
- package/packages/dd-trace/src/span_stats.js +64 -31
- package/packages/dd-trace/src/startup-log.js +3 -2
- package/packages/dd-trace/src/telemetry/agentless-url.js +28 -0
- package/packages/dd-trace/src/telemetry/send-data.js +18 -16
- package/packages/dd-trace/src/telemetry/session-propagation.js +3 -2
- package/packages/dd-trace/src/tracer.js +26 -5
- package/packages/dd-trace/src/tracer_metadata.js +11 -3
- package/packages/dd-trace/src/web-tags-cache.js +67 -13
- package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -1
- package/vendor/dist/@datadog/sketches-js/index.js +1 -1
- package/vendor/dist/protobufjs/index.js +1 -1
- package/vendor/dist/protobufjs/minimal/index.js +1 -1
- package/packages/datadog-instrumentations/src/playwright-browser-scripts.js +0 -27
- package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +0 -53
- package/packages/dd-trace/src/encode/agentless-json.js +0 -209
|
@@ -45,10 +45,16 @@ function formatMetricTags (tagsDictionary) {
|
|
|
45
45
|
return Object.keys(tagsDictionary).reduce((/** @type {string[]} */ acc, tagKey) => {
|
|
46
46
|
if (tagKey === 'statusCode') {
|
|
47
47
|
const statusCode = tagsDictionary[tagKey]
|
|
48
|
-
if (
|
|
49
|
-
acc.push(`status_code:${statusCode}`)
|
|
48
|
+
if (statusCode) {
|
|
49
|
+
acc.push(`status_code:${statusCode}`, `error_type:${getErrorTypeFromStatusCode(statusCode)}`)
|
|
50
|
+
} else if (!tagsDictionary.errorType) {
|
|
51
|
+
acc.push('error_type:network')
|
|
50
52
|
}
|
|
51
|
-
acc
|
|
53
|
+
return acc
|
|
54
|
+
}
|
|
55
|
+
if (tagKey === 'errorType') {
|
|
56
|
+
const errorType = tagsDictionary[tagKey]
|
|
57
|
+
if (errorType) acc.push(`error_type:${errorType}`)
|
|
52
58
|
return acc
|
|
53
59
|
}
|
|
54
60
|
const formattedTagKey = /** @type {string} */(formattedTags[tagKey] || tagKey)
|
|
@@ -129,11 +135,8 @@ const TELEMETRY_TEST_MANAGEMENT_TESTS_ERRORS = 'test_management_tests.request_er
|
|
|
129
135
|
const TELEMETRY_TEST_MANAGEMENT_TESTS_RESPONSE_TESTS = 'test_management_tests.response_tests'
|
|
130
136
|
const TELEMETRY_TEST_MANAGEMENT_TESTS_RESPONSE_BYTES = 'test_management_tests.response_bytes'
|
|
131
137
|
|
|
132
|
-
function isStatusCode400 (statusCode) {
|
|
133
|
-
return statusCode >= 400 && statusCode < 500
|
|
134
|
-
}
|
|
135
|
-
|
|
136
138
|
function getErrorTypeFromStatusCode (statusCode) {
|
|
139
|
+
if (typeof statusCode !== 'number') return 'network'
|
|
137
140
|
if (statusCode >= 400 && statusCode < 500) {
|
|
138
141
|
return 'status_code_4xx_response'
|
|
139
142
|
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
TEST_FAILURE_VIDEO_SCOPE,
|
|
5
|
+
TEST_FAILURE_VIDEO_UPLOADED,
|
|
6
|
+
TEST_FAILURE_VIDEO_UPLOAD_ERROR,
|
|
7
|
+
} = require('../plugins/util/test')
|
|
8
|
+
|
|
9
|
+
const VIDEO_UPLOAD_RESULT_UPLOADED = 'uploaded'
|
|
10
|
+
const VIDEO_UPLOAD_RESULT_ERROR = 'error'
|
|
11
|
+
const VIDEO_UPLOAD_SCOPE_TEST_SUITE = 'test_suite'
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Combines video upload results, giving errors precedence over successes.
|
|
15
|
+
*
|
|
16
|
+
* @param {Array<string|undefined>} uploadResults - Per-video upload results
|
|
17
|
+
* @returns {string|undefined} Combined upload result
|
|
18
|
+
*/
|
|
19
|
+
function getVideoUploadResult (uploadResults) {
|
|
20
|
+
let hasUploaded = false
|
|
21
|
+
for (const uploadResult of uploadResults) {
|
|
22
|
+
if (uploadResult === VIDEO_UPLOAD_RESULT_ERROR) return VIDEO_UPLOAD_RESULT_ERROR
|
|
23
|
+
if (uploadResult === VIDEO_UPLOAD_RESULT_UPLOADED) hasUploaded = true
|
|
24
|
+
}
|
|
25
|
+
return hasUploaded ? VIDEO_UPLOAD_RESULT_UPLOADED : undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Returns the tag that represents an aggregate video upload outcome.
|
|
30
|
+
*
|
|
31
|
+
* @param {string|undefined} uploadResult - Aggregate video upload result
|
|
32
|
+
* @returns {string|undefined} Video upload result tag
|
|
33
|
+
*/
|
|
34
|
+
function getVideoUploadTag (uploadResult) {
|
|
35
|
+
if (uploadResult === VIDEO_UPLOAD_RESULT_ERROR) return TEST_FAILURE_VIDEO_UPLOAD_ERROR
|
|
36
|
+
if (uploadResult === VIDEO_UPLOAD_RESULT_UPLOADED) return TEST_FAILURE_VIDEO_UPLOADED
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Tags a test or test suite span with its video upload outcome and optional scope.
|
|
41
|
+
*
|
|
42
|
+
* @param {object} span - Test or test suite span to tag
|
|
43
|
+
* @param {string|undefined} uploadResult - Aggregate video upload result
|
|
44
|
+
* @param {string} [scope] - Media lookup scope
|
|
45
|
+
* @returns {void}
|
|
46
|
+
*/
|
|
47
|
+
function setVideoUploadTags (span, uploadResult, scope) {
|
|
48
|
+
const uploadTag = getVideoUploadTag(uploadResult)
|
|
49
|
+
if (!uploadTag) return
|
|
50
|
+
span.setTag(uploadTag, 'true')
|
|
51
|
+
if (scope) span.setTag(TEST_FAILURE_VIDEO_SCOPE, scope)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = {
|
|
55
|
+
VIDEO_UPLOAD_RESULT_ERROR,
|
|
56
|
+
VIDEO_UPLOAD_RESULT_UPLOADED,
|
|
57
|
+
VIDEO_UPLOAD_SCOPE_TEST_SUITE,
|
|
58
|
+
getVideoUploadResult,
|
|
59
|
+
getVideoUploadTag,
|
|
60
|
+
setVideoUploadTags,
|
|
61
|
+
}
|
|
@@ -65,6 +65,7 @@ export interface GeneratedConfig {
|
|
|
65
65
|
};
|
|
66
66
|
dbmPropagationMode: "disabled" | "service" | "full" | "dynamic_service";
|
|
67
67
|
DD_ACTION_EXECUTION_ID: string | undefined;
|
|
68
|
+
DD_AGENTLESS_ENABLED: boolean;
|
|
68
69
|
DD_AGENTLESS_LOG_SUBMISSION_ENABLED: boolean;
|
|
69
70
|
DD_AGENTLESS_LOG_SUBMISSION_URL: string | undefined;
|
|
70
71
|
DD_API_KEY: string | undefined;
|
|
@@ -272,6 +273,7 @@ export interface GeneratedConfig {
|
|
|
272
273
|
DD_TRACE_HAPI_ENABLED: boolean;
|
|
273
274
|
DD_TRACE_HAPI_HAPI_ENABLED: boolean;
|
|
274
275
|
DD_TRACE_HONO_ENABLED: boolean;
|
|
276
|
+
DD_TRACE_HTTP_CLIENT_ERROR_STATUSES: string;
|
|
275
277
|
DD_TRACE_HTTP_ENABLED: boolean;
|
|
276
278
|
DD_TRACE_HTTP_SERVER_ERROR_STATUSES: string;
|
|
277
279
|
DD_TRACE_HTTP2_ENABLED: boolean;
|
|
@@ -418,6 +420,7 @@ export interface GeneratedConfig {
|
|
|
418
420
|
endpoint: string | undefined;
|
|
419
421
|
maxContentSize: number;
|
|
420
422
|
maxMessagesLength: number;
|
|
423
|
+
redactionEnabled: boolean;
|
|
421
424
|
timeout: number;
|
|
422
425
|
};
|
|
423
426
|
appsec: {
|
|
@@ -473,6 +476,7 @@ export interface GeneratedConfig {
|
|
|
473
476
|
agentlessEnabled: boolean | undefined;
|
|
474
477
|
DD_LLMOBS_ENABLED: boolean;
|
|
475
478
|
mlApp: string | undefined;
|
|
479
|
+
projectName: string | undefined;
|
|
476
480
|
sampleRate: number;
|
|
477
481
|
};
|
|
478
482
|
logInjection: boolean;
|
|
@@ -578,6 +582,7 @@ export interface GeneratedConfig {
|
|
|
578
582
|
DD_TEST_EARLY_FLAKE_DETECTION_RETRY_COUNT: number | undefined;
|
|
579
583
|
DD_TEST_FAILED_TEST_REPLAY_ENABLED: boolean;
|
|
580
584
|
DD_TEST_FAILURE_SCREENSHOTS_ENABLED: boolean | undefined;
|
|
585
|
+
DD_TEST_FAILURE_VIDEOS_ENABLED: boolean | undefined;
|
|
581
586
|
DD_TEST_FLEET_CONFIG_PATH: string | undefined;
|
|
582
587
|
DD_TEST_LOCAL_CONFIG_PATH: string | undefined;
|
|
583
588
|
DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES: number;
|
|
@@ -607,6 +612,7 @@ export interface GeneratedEnvVarConfig {
|
|
|
607
612
|
DATADOG_API_KEY: string | undefined;
|
|
608
613
|
DD_ACTION_EXECUTION_ID: string | undefined;
|
|
609
614
|
DD_AGENT_HOST: string;
|
|
615
|
+
DD_AGENTLESS_ENABLED: boolean;
|
|
610
616
|
DD_AGENTLESS_LOG_SUBMISSION_ENABLED: boolean;
|
|
611
617
|
DD_AGENTLESS_LOG_SUBMISSION_URL: string | undefined;
|
|
612
618
|
DD_AI_GUARD_BLOCK: boolean;
|
|
@@ -614,6 +620,7 @@ export interface GeneratedEnvVarConfig {
|
|
|
614
620
|
DD_AI_GUARD_ENDPOINT: string | undefined;
|
|
615
621
|
DD_AI_GUARD_MAX_CONTENT_SIZE: number;
|
|
616
622
|
DD_AI_GUARD_MAX_MESSAGES_LENGTH: number;
|
|
623
|
+
DD_AI_GUARD_REDACTION_ENABLED: boolean;
|
|
617
624
|
DD_AI_GUARD_TIMEOUT: number;
|
|
618
625
|
DD_API_KEY: string | undefined;
|
|
619
626
|
DD_API_SECURITY_DOWNSTREAM_BODY_ANALYSIS_SAMPLE_RATE: number;
|
|
@@ -758,6 +765,7 @@ export interface GeneratedEnvVarConfig {
|
|
|
758
765
|
DD_LLMOBS_AGENTLESS_ENABLED: boolean | undefined;
|
|
759
766
|
DD_LLMOBS_ENABLED: boolean;
|
|
760
767
|
DD_LLMOBS_ML_APP: string | undefined;
|
|
768
|
+
DD_LLMOBS_PROJECT_NAME: string | undefined;
|
|
761
769
|
DD_LLMOBS_SAMPLE_RATE: number;
|
|
762
770
|
DD_LOG_LEVEL: "debug" | "info" | "warn" | "error";
|
|
763
771
|
DD_LOGS_INJECTION: boolean;
|
|
@@ -822,6 +830,7 @@ export interface GeneratedEnvVarConfig {
|
|
|
822
830
|
DD_TEST_EARLY_FLAKE_DETECTION_RETRY_COUNT: number | undefined;
|
|
823
831
|
DD_TEST_FAILED_TEST_REPLAY_ENABLED: boolean;
|
|
824
832
|
DD_TEST_FAILURE_SCREENSHOTS_ENABLED: boolean | undefined;
|
|
833
|
+
DD_TEST_FAILURE_VIDEOS_ENABLED: boolean | undefined;
|
|
825
834
|
DD_TEST_FLEET_CONFIG_PATH: string | undefined;
|
|
826
835
|
DD_TEST_LOCAL_CONFIG_PATH: string | undefined;
|
|
827
836
|
DD_TEST_MANAGEMENT_ATTEMPT_TO_FIX_RETRIES: number;
|
|
@@ -970,6 +979,7 @@ export interface GeneratedEnvVarConfig {
|
|
|
970
979
|
DD_TRACE_HAPI_HAPI_ENABLED: boolean;
|
|
971
980
|
DD_TRACE_HEADER_TAGS: string[];
|
|
972
981
|
DD_TRACE_HONO_ENABLED: boolean;
|
|
982
|
+
DD_TRACE_HTTP_CLIENT_ERROR_STATUSES: string;
|
|
973
983
|
DD_TRACE_HTTP_ENABLED: boolean;
|
|
974
984
|
DD_TRACE_HTTP_SERVER_ERROR_STATUSES: string;
|
|
975
985
|
DD_TRACE_HTTP2_ENABLED: boolean;
|
|
@@ -4,8 +4,10 @@ const fs = require('node:fs')
|
|
|
4
4
|
const os = require('node:os')
|
|
5
5
|
const { URL, format } = require('node:url')
|
|
6
6
|
|
|
7
|
+
const { channel } = require('dc-polyfill')
|
|
8
|
+
|
|
7
9
|
const exporters = require('../../../../ext/exporters')
|
|
8
|
-
const
|
|
10
|
+
const createRfdc = require('../../../../vendor/dist/rfdc')
|
|
9
11
|
const uuid = require('../../../../vendor/dist/crypto-randomuuid') // we need to keep the old uuid dep because of cypress
|
|
10
12
|
const set = require('../../../datadog-core/src/utils/src/set')
|
|
11
13
|
const { DD_MAJOR, NODE_MAJOR } = require('../../../../version')
|
|
@@ -42,7 +44,12 @@ const {
|
|
|
42
44
|
const { normalizeService } = require('./normalize-service')
|
|
43
45
|
const { programmaticTypeCoercions, transformers } = require('./parsers')
|
|
44
46
|
|
|
45
|
-
const
|
|
47
|
+
const rfdc = createRfdc({
|
|
48
|
+
proto: false,
|
|
49
|
+
circles: false,
|
|
50
|
+
constructorHandlers: [[RegExp, transformers.toCamelCase]],
|
|
51
|
+
})
|
|
52
|
+
|
|
46
53
|
const TEST_OPTIMIZATION_WORKER_EXPORTERS = new Set([
|
|
47
54
|
exporters.CUCUMBER_WORKER,
|
|
48
55
|
exporters.JEST_WORKER,
|
|
@@ -51,6 +58,21 @@ const TEST_OPTIMIZATION_WORKER_EXPORTERS = new Set([
|
|
|
51
58
|
exporters.VITEST_WORKER,
|
|
52
59
|
])
|
|
53
60
|
|
|
61
|
+
let runtimeId
|
|
62
|
+
|
|
63
|
+
channel('datadog:identity:update').subscribe(refreshRuntimeId)
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Lazily generates the process-wide runtime ID on first access instead of at module load,
|
|
67
|
+
* so modules that merely require this file without constructing a Config never pay for it.
|
|
68
|
+
*
|
|
69
|
+
* @returns {string}
|
|
70
|
+
*/
|
|
71
|
+
function getRuntimeId () {
|
|
72
|
+
runtimeId ??= uuid()
|
|
73
|
+
return runtimeId
|
|
74
|
+
}
|
|
75
|
+
|
|
54
76
|
const tracerMetrics = telemetryMetrics.manager.namespace('tracers')
|
|
55
77
|
|
|
56
78
|
/**
|
|
@@ -390,11 +412,6 @@ class Config extends ConfigBase {
|
|
|
390
412
|
if (!trackedConfigOrigins.has('dogstatsd.hostname')) {
|
|
391
413
|
setAndTrack(this, 'dogstatsd.hostname', agentHostname)
|
|
392
414
|
}
|
|
393
|
-
// Disable log injection when OTEL logs are enabled
|
|
394
|
-
// OTEL logs and DD log injection are mutually exclusive
|
|
395
|
-
if (this.DD_LOGS_OTEL_ENABLED) {
|
|
396
|
-
setAndTrack(this, 'logInjection', false)
|
|
397
|
-
}
|
|
398
415
|
if (this.DD_METRICS_OTEL_ENABLED &&
|
|
399
416
|
trackedConfigOrigins.has('OTEL_METRICS_EXPORTER') &&
|
|
400
417
|
this.OTEL_METRICS_EXPORTER === 'none') {
|
|
@@ -476,6 +493,12 @@ class Config extends ConfigBase {
|
|
|
476
493
|
setAndTrack(this, 'runtimeMetrics.enabled', false)
|
|
477
494
|
}
|
|
478
495
|
|
|
496
|
+
const agentlessTracingEnabled = this.DD_AGENTLESS_ENABLED ||
|
|
497
|
+
isTrue(getEnvironmentVariable('_DD_APM_TRACING_AGENTLESS_ENABLED'))
|
|
498
|
+
if (agentlessTracingEnabled && !this.isCiVisibility) {
|
|
499
|
+
setAndTrack(this, 'OTEL_TRACES_EXPORTER', 'none')
|
|
500
|
+
}
|
|
501
|
+
|
|
479
502
|
// Apply the OTel sampler when the user opted into OTel traces or explicitly set the sampler.
|
|
480
503
|
// OTEL_TRACES_SAMPLER has `default: parentbased_always_on` (per OTel spec), so opt-in users
|
|
481
504
|
// that don't set the sampler still get parent-based sampling. Electron exporter spans go over
|
|
@@ -510,7 +533,8 @@ class Config extends ConfigBase {
|
|
|
510
533
|
if (!this.llmobs.DD_LLMOBS_ENABLED &&
|
|
511
534
|
!trackedConfigOrigins.has('llmobs.DD_LLMOBS_ENABLED') &&
|
|
512
535
|
(trackedConfigOrigins.has('llmobs.agentlessEnabled') ||
|
|
513
|
-
trackedConfigOrigins.has('llmobs.mlApp')
|
|
536
|
+
trackedConfigOrigins.has('llmobs.mlApp') ||
|
|
537
|
+
trackedConfigOrigins.has('llmobs.projectName'))) {
|
|
514
538
|
setAndTrack(this, 'llmobs.DD_LLMOBS_ENABLED', true)
|
|
515
539
|
}
|
|
516
540
|
|
|
@@ -601,7 +625,7 @@ class Config extends ConfigBase {
|
|
|
601
625
|
if (this.version) {
|
|
602
626
|
this.tags.version = this.version
|
|
603
627
|
}
|
|
604
|
-
this.tags['runtime-id'] =
|
|
628
|
+
this.tags['runtime-id'] = getRuntimeId()
|
|
605
629
|
const platformTags = getServerlessPlatformTags()
|
|
606
630
|
if (platformTags) {
|
|
607
631
|
for (let i = 0; i < platformTags.length; i += 2) {
|
|
@@ -621,11 +645,30 @@ class Config extends ConfigBase {
|
|
|
621
645
|
setAndTrack(this, 'telemetry.DD_INSTRUMENTATION_TELEMETRY_ENABLED', false)
|
|
622
646
|
}
|
|
623
647
|
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
648
|
+
if (this.DD_AGENTLESS_ENABLED) {
|
|
649
|
+
if (!trackedConfigOrigins.has('DD_AGENTLESS_LOG_SUBMISSION_ENABLED') && !this.DD_LOGS_OTEL_ENABLED) {
|
|
650
|
+
setAndTrack(this, 'DD_AGENTLESS_LOG_SUBMISSION_ENABLED', true)
|
|
651
|
+
}
|
|
652
|
+
setAndTrack(this, 'testOptimization.DD_CIVISIBILITY_AGENTLESS_ENABLED', true)
|
|
653
|
+
setAndTrack(this, 'llmobs.agentlessEnabled', true)
|
|
654
|
+
setAndTrack(this, 'featureFlags.DD_FEATURE_FLAGS_CONFIGURATION_SOURCE', 'agentless')
|
|
655
|
+
if (this.DD_API_KEY === undefined) {
|
|
656
|
+
setAndTrack(this, 'dynamicInstrumentation.enabled', false)
|
|
657
|
+
}
|
|
658
|
+
setAndTrack(this, 'runtimeMetrics.enabled', false)
|
|
659
|
+
setAndTrack(this, 'dsmEnabled', false)
|
|
660
|
+
const profilingExporters = this.DD_PROFILING_EXPORTERS.filter(exporter => exporter !== 'agent')
|
|
661
|
+
setAndTrack(this, 'DD_PROFILING_EXPORTERS', profilingExporters)
|
|
662
|
+
if (profilingExporters.length === 0) {
|
|
663
|
+
setAndTrack(this, 'profiling.DD_PROFILING_ENABLED', 'false')
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
if (this.DD_AGENTLESS_LOG_SUBMISSION_ENABLED && this.DD_LOGS_OTEL_ENABLED) {
|
|
668
|
+
setAndTrack(this, 'DD_LOGS_OTEL_ENABLED', false)
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
if (agentlessTracingEnabled && !this.isCiVisibility) {
|
|
629
672
|
setAndTrack(this, 'experimental.exporter', 'agentless')
|
|
630
673
|
// Disable client-side stats computation
|
|
631
674
|
setAndTrack(this, 'stats.DD_TRACE_STATS_COMPUTATION_ENABLED', false)
|
|
@@ -641,6 +684,12 @@ class Config extends ConfigBase {
|
|
|
641
684
|
}
|
|
642
685
|
}
|
|
643
686
|
|
|
687
|
+
// Disable log injection when OTEL logs are enabled
|
|
688
|
+
// OTEL logs and DD log injection are mutually exclusive
|
|
689
|
+
if (this.DD_LOGS_OTEL_ENABLED) {
|
|
690
|
+
setAndTrack(this, 'logInjection', false)
|
|
691
|
+
}
|
|
692
|
+
|
|
644
693
|
// Apply all fallbacks to the calculated config.
|
|
645
694
|
for (const [configName, alias] of fallbackConfigurations) {
|
|
646
695
|
if (!trackedConfigOrigins.has(configName) && trackedConfigOrigins.has(alias)) {
|
|
@@ -787,3 +836,15 @@ function getConfig (options) {
|
|
|
787
836
|
}
|
|
788
837
|
return configInstance
|
|
789
838
|
}
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* Regenerates the runtime ID.
|
|
842
|
+
*
|
|
843
|
+
* Used for Lambda MicroVM `/run` lifecycle hooks, giving each clone a distinct runtime identity.
|
|
844
|
+
*
|
|
845
|
+
* @param {import('./config-base')} config
|
|
846
|
+
*/
|
|
847
|
+
function refreshRuntimeId (config) {
|
|
848
|
+
runtimeId = uuid()
|
|
849
|
+
config.tags['runtime-id'] = runtimeId
|
|
850
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const fs = require('fs')
|
|
4
|
+
const { isRegExp } = require('node:util').types
|
|
4
5
|
|
|
5
6
|
const { DD_MAJOR, NODE_MAJOR } = require('../../../../version')
|
|
6
7
|
const tagger = require('../tagger')
|
|
@@ -72,6 +73,9 @@ const transformers = {
|
|
|
72
73
|
toUpperCase (value) {
|
|
73
74
|
return toCase(value, 'toUpperCase')
|
|
74
75
|
},
|
|
76
|
+
/**
|
|
77
|
+
* @param {unknown} value
|
|
78
|
+
*/
|
|
75
79
|
toCamelCase (value) {
|
|
76
80
|
if (Array.isArray(value)) {
|
|
77
81
|
return value.map(item => {
|
|
@@ -79,6 +83,10 @@ const transformers = {
|
|
|
79
83
|
})
|
|
80
84
|
}
|
|
81
85
|
if (typeof value === 'object' && value !== null) {
|
|
86
|
+
// RegExp matchers are supported configuration leaves and need their own clone.
|
|
87
|
+
if (isRegExp(value)) {
|
|
88
|
+
return new RegExp(value)
|
|
89
|
+
}
|
|
82
90
|
const result = {}
|
|
83
91
|
for (const [key, innerValue] of Object.entries(value)) {
|
|
84
92
|
const camelCaseKey = key.replaceAll(/_(\w)/g, (_, letter) => letter.toUpperCase())
|
|
@@ -90,8 +98,10 @@ const transformers = {
|
|
|
90
98
|
},
|
|
91
99
|
parseOtelTags (object) {
|
|
92
100
|
const tags = {}
|
|
101
|
+
const environment = object['deployment.environment.name'] ?? object['deployment.environment']
|
|
93
102
|
for (const [key, value] of Object.entries(object)) {
|
|
94
|
-
|
|
103
|
+
const renamedKey = RENAMED_OTEL_TAGS.get(key)
|
|
104
|
+
tags[renamedKey ?? key] = renamedKey === 'env' ? environment : value
|
|
95
105
|
}
|
|
96
106
|
return tags
|
|
97
107
|
},
|
|
@@ -22,16 +22,16 @@ class StableConfig {
|
|
|
22
22
|
|
|
23
23
|
// Note: we don't enforce loading because there may be cases where the library is not available and we
|
|
24
24
|
// want to avoid breaking the application. In those cases, we will not have the file-based configuration.
|
|
25
|
-
let
|
|
25
|
+
let libdatadogExtras
|
|
26
26
|
try {
|
|
27
|
-
|
|
27
|
+
libdatadogExtras = require('@datadog/libdatadog-extras')
|
|
28
28
|
this.wasm_loaded = true
|
|
29
29
|
} catch {
|
|
30
30
|
this.warnings.push('Can\'t load libdatadog library')
|
|
31
31
|
return
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
const libconfig =
|
|
34
|
+
const libconfig = libdatadogExtras.maybeLoad('library_config')
|
|
35
35
|
if (libconfig === undefined) {
|
|
36
36
|
this.warnings.push('Can\'t load library_config library')
|
|
37
37
|
return
|
|
@@ -8,18 +8,28 @@
|
|
|
8
8
|
"default": null
|
|
9
9
|
}
|
|
10
10
|
],
|
|
11
|
+
"DD_AGENTLESS_ENABLED": [
|
|
12
|
+
{
|
|
13
|
+
"implementation": "A",
|
|
14
|
+
"type": "boolean",
|
|
15
|
+
"default": "false",
|
|
16
|
+
"description": "Enable agentless mode for supported features and disable Agent-only features."
|
|
17
|
+
}
|
|
18
|
+
],
|
|
11
19
|
"DD_AGENTLESS_LOG_SUBMISSION_ENABLED": [
|
|
12
20
|
{
|
|
13
21
|
"implementation": "A",
|
|
14
22
|
"type": "boolean",
|
|
15
|
-
"default": "false"
|
|
23
|
+
"default": "false",
|
|
24
|
+
"description": "Submit supported logger output directly to the Datadog logs intake."
|
|
16
25
|
}
|
|
17
26
|
],
|
|
18
27
|
"DD_AGENTLESS_LOG_SUBMISSION_URL": [
|
|
19
28
|
{
|
|
20
29
|
"implementation": "A",
|
|
21
30
|
"type": "string",
|
|
22
|
-
"default": null
|
|
31
|
+
"default": null,
|
|
32
|
+
"description": "Override the automatic log submission intake URL."
|
|
23
33
|
}
|
|
24
34
|
],
|
|
25
35
|
"_DD_APM_TRACING_AGENTLESS_ENABLED": [
|
|
@@ -93,6 +103,16 @@
|
|
|
93
103
|
"default": "16"
|
|
94
104
|
}
|
|
95
105
|
],
|
|
106
|
+
"DD_AI_GUARD_REDACTION_ENABLED": [
|
|
107
|
+
{
|
|
108
|
+
"implementation": "A",
|
|
109
|
+
"type": "boolean",
|
|
110
|
+
"configurationNames": [
|
|
111
|
+
"experimental.aiguard.redactionEnabled"
|
|
112
|
+
],
|
|
113
|
+
"default": "true"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
96
116
|
"DD_AI_GUARD_TIMEOUT": [
|
|
97
117
|
{
|
|
98
118
|
"implementation": "A",
|
|
@@ -1341,6 +1361,16 @@
|
|
|
1341
1361
|
"default": null
|
|
1342
1362
|
}
|
|
1343
1363
|
],
|
|
1364
|
+
"DD_LLMOBS_PROJECT_NAME": [
|
|
1365
|
+
{
|
|
1366
|
+
"implementation": "A",
|
|
1367
|
+
"type": "string",
|
|
1368
|
+
"configurationNames": [
|
|
1369
|
+
"llmobs.projectName"
|
|
1370
|
+
],
|
|
1371
|
+
"default": null
|
|
1372
|
+
}
|
|
1373
|
+
],
|
|
1344
1374
|
"DD_LLMOBS_SAMPLE_RATE": [
|
|
1345
1375
|
{
|
|
1346
1376
|
"implementation": "A",
|
|
@@ -1909,6 +1939,14 @@
|
|
|
1909
1939
|
"namespace": "testOptimization"
|
|
1910
1940
|
}
|
|
1911
1941
|
],
|
|
1942
|
+
"DD_TEST_FAILURE_VIDEOS_ENABLED": [
|
|
1943
|
+
{
|
|
1944
|
+
"implementation": "A",
|
|
1945
|
+
"type": "boolean",
|
|
1946
|
+
"default": null,
|
|
1947
|
+
"namespace": "testOptimization"
|
|
1948
|
+
}
|
|
1949
|
+
],
|
|
1912
1950
|
"DD_TEST_FLEET_CONFIG_PATH": [
|
|
1913
1951
|
{
|
|
1914
1952
|
"implementation": "A",
|
|
@@ -2999,6 +3037,13 @@
|
|
|
2999
3037
|
"default": "true"
|
|
3000
3038
|
}
|
|
3001
3039
|
],
|
|
3040
|
+
"DD_TRACE_HTTP_CLIENT_ERROR_STATUSES": [
|
|
3041
|
+
{
|
|
3042
|
+
"implementation": "A",
|
|
3043
|
+
"type": "string",
|
|
3044
|
+
"default": "400-499"
|
|
3045
|
+
}
|
|
3046
|
+
],
|
|
3002
3047
|
"DD_TRACE_HTTP_ENABLED": [
|
|
3003
3048
|
{
|
|
3004
3049
|
"implementation": "A",
|
|
@@ -3,12 +3,61 @@
|
|
|
3
3
|
const { EOL, platform } = require('node:os')
|
|
4
4
|
|
|
5
5
|
// Load binding first to not import other modules if it throws
|
|
6
|
-
const
|
|
7
|
-
const binding =
|
|
6
|
+
const libdatadogExtras = require('@datadog/libdatadog-extras')
|
|
7
|
+
const binding = libdatadogExtras.load('crashtracker')
|
|
8
8
|
|
|
9
|
+
const { channel } = require('dc-polyfill')
|
|
10
|
+
const { getEnvironmentVariable } = require('../config/helper')
|
|
9
11
|
const log = require('../log')
|
|
10
12
|
const pkg = require('../../../../package.json')
|
|
11
13
|
const processTags = require('../process-tags')
|
|
14
|
+
const getAgentlessTelemetryUrl = require('../telemetry/agentless-url')
|
|
15
|
+
|
|
16
|
+
const identityRefreshChannel = channel('datadog:identity:refresh')
|
|
17
|
+
const INHERITED_RECEIVER_ENVIRONMENT_VARIABLES = [
|
|
18
|
+
'HTTP_PROXY',
|
|
19
|
+
'HTTPS_PROXY',
|
|
20
|
+
'NO_PROXY',
|
|
21
|
+
'http_proxy',
|
|
22
|
+
'https_proxy',
|
|
23
|
+
'no_proxy',
|
|
24
|
+
'SSL_CERT_FILE',
|
|
25
|
+
'SSL_CERT_DIR',
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Builds the minimal receiver environment libdatadog needs to select its two direct crash
|
|
30
|
+
* destinations independently: instrumentation telemetry and Errors Tracking intake.
|
|
31
|
+
*
|
|
32
|
+
* @param {import('../config/config-base')} config - Tracer configuration
|
|
33
|
+
* @returns {Array<[string, string]>}
|
|
34
|
+
*/
|
|
35
|
+
function getAgentlessReceiverEnvironment (config) {
|
|
36
|
+
if (!config.DD_API_KEY) {
|
|
37
|
+
throw new Error('DD_API_KEY is required for agentless crash tracking')
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const site = config.site.toLowerCase()
|
|
41
|
+
const telemetryUrl = getAgentlessTelemetryUrl(site).origin
|
|
42
|
+
|
|
43
|
+
const environment = /** @type {Array<[string, string]>} */ ([
|
|
44
|
+
['_DD_DIRECT_SUBMISSION_ENABLED', 'true'],
|
|
45
|
+
['DD_API_KEY', config.DD_API_KEY],
|
|
46
|
+
['DD_SITE', site],
|
|
47
|
+
['DD_APM_TELEMETRY_DD_URL', telemetryUrl],
|
|
48
|
+
// libdatadog v43 parses the dedicated URL above but does not use it when constructing the
|
|
49
|
+
// endpoint. Keep this compatibility fallback until its telemetry config honors that setting.
|
|
50
|
+
['DD_TRACE_AGENT_URL', telemetryUrl],
|
|
51
|
+
])
|
|
52
|
+
|
|
53
|
+
// The receiver environment does not inherit from this process.
|
|
54
|
+
for (const name of INHERITED_RECEIVER_ENVIRONMENT_VARIABLES) {
|
|
55
|
+
const value = getEnvironmentVariable(name)
|
|
56
|
+
if (value) environment.push([name, value])
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return environment
|
|
60
|
+
}
|
|
12
61
|
|
|
13
62
|
class Crashtracker {
|
|
14
63
|
#started = false
|
|
@@ -33,11 +82,12 @@ class Crashtracker {
|
|
|
33
82
|
try {
|
|
34
83
|
binding.init(
|
|
35
84
|
this.#getConfig(config),
|
|
36
|
-
this.#getReceiverConfig(),
|
|
85
|
+
this.#getReceiverConfig(config),
|
|
37
86
|
this.#getMetadata(config)
|
|
38
87
|
)
|
|
39
88
|
this.#started = true
|
|
40
89
|
this.#trackUnhandledExceptions()
|
|
90
|
+
identityRefreshChannel.subscribe((config) => this.configure(config))
|
|
41
91
|
} catch (e) {
|
|
42
92
|
log.error('Error initializing crashtracker', e)
|
|
43
93
|
}
|
|
@@ -67,7 +117,21 @@ class Crashtracker {
|
|
|
67
117
|
* @param {import('../config/config-base')} config - Tracer configuration
|
|
68
118
|
*/
|
|
69
119
|
#getConfig (config) {
|
|
70
|
-
|
|
120
|
+
let endpoint = null
|
|
121
|
+
if (!config.DD_AGENTLESS_ENABLED) {
|
|
122
|
+
const url = config.url
|
|
123
|
+
endpoint = {
|
|
124
|
+
// TODO: Use the string directly when deserialization is fixed.
|
|
125
|
+
url: {
|
|
126
|
+
scheme: url.protocol.slice(0, -1),
|
|
127
|
+
authority: url.protocol === 'unix:'
|
|
128
|
+
? Buffer.from(url.pathname).toString('hex')
|
|
129
|
+
: url.host,
|
|
130
|
+
path_and_query: '',
|
|
131
|
+
},
|
|
132
|
+
timeout_ms: 3000,
|
|
133
|
+
}
|
|
134
|
+
}
|
|
71
135
|
|
|
72
136
|
// Out-of-process symbolication currently works on
|
|
73
137
|
// Linux only, does not work on Mac.
|
|
@@ -80,17 +144,7 @@ class Crashtracker {
|
|
|
80
144
|
collect_all_threads: true,
|
|
81
145
|
create_alt_stack: true,
|
|
82
146
|
use_alt_stack: true,
|
|
83
|
-
endpoint
|
|
84
|
-
// TODO: Use the string directly when deserialization is fixed.
|
|
85
|
-
url: {
|
|
86
|
-
scheme: url.protocol.slice(0, -1),
|
|
87
|
-
authority: url.protocol === 'unix:'
|
|
88
|
-
? Buffer.from(url.pathname).toString('hex')
|
|
89
|
-
: url.host,
|
|
90
|
-
path_and_query: '',
|
|
91
|
-
},
|
|
92
|
-
timeout_ms: 3000,
|
|
93
|
-
},
|
|
147
|
+
endpoint,
|
|
94
148
|
timeout: { secs: 5, nanos: 0 },
|
|
95
149
|
demangle_names: true,
|
|
96
150
|
signals: [],
|
|
@@ -124,11 +178,21 @@ class Crashtracker {
|
|
|
124
178
|
}
|
|
125
179
|
}
|
|
126
180
|
|
|
127
|
-
|
|
181
|
+
/**
|
|
182
|
+
* @param {import('../config/config-base')} config - Tracer configuration
|
|
183
|
+
* @returns {{
|
|
184
|
+
* args: string[],
|
|
185
|
+
* env: Array<[string, string]>,
|
|
186
|
+
* path_to_receiver_binary: string,
|
|
187
|
+
* stderr_filename: null,
|
|
188
|
+
* stdout_filename: null
|
|
189
|
+
* }}
|
|
190
|
+
*/
|
|
191
|
+
#getReceiverConfig (config) {
|
|
128
192
|
return {
|
|
129
193
|
args: [],
|
|
130
|
-
env: [],
|
|
131
|
-
path_to_receiver_binary:
|
|
194
|
+
env: config.DD_AGENTLESS_ENABLED ? getAgentlessReceiverEnvironment(config) : [],
|
|
195
|
+
path_to_receiver_binary: libdatadogExtras.find('crashtracker-receiver', true),
|
|
132
196
|
stderr_filename: null,
|
|
133
197
|
stdout_filename: null,
|
|
134
198
|
}
|
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const { createSiteUrl } = require('../exporters/common/url')
|
|
3
4
|
const getGitMetadata = require('../git_metadata')
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* @param {ReturnType<import('../config')>} config
|
|
8
|
+
* @param {string} [inputPath]
|
|
9
|
+
*/
|
|
5
10
|
module.exports = function getDebuggerConfig (config, inputPath) {
|
|
6
11
|
const { commitSHA, repositoryUrl } = getGitMetadata(config)
|
|
12
|
+
const agentless = config.DD_AGENTLESS_ENABLED
|
|
13
|
+
const agentlessUrl = agentless ? createSiteUrl(config.site, 'debugger-intake') : undefined
|
|
14
|
+
if (agentless && agentlessUrl === undefined) return
|
|
15
|
+
|
|
7
16
|
return {
|
|
17
|
+
agentless,
|
|
18
|
+
apiKey: agentless ? config.DD_API_KEY : undefined,
|
|
8
19
|
commitSHA,
|
|
9
20
|
debug: config.debug,
|
|
10
21
|
dynamicInstrumentation: config.dynamicInstrumentation,
|
|
@@ -16,7 +27,7 @@ module.exports = function getDebuggerConfig (config, inputPath) {
|
|
|
16
27
|
repositoryUrl,
|
|
17
28
|
runtimeId: config.tags['runtime-id'],
|
|
18
29
|
service: config.service,
|
|
19
|
-
url: config.url.toString(),
|
|
30
|
+
url: agentless ? agentlessUrl.origin : config.url.toString(),
|
|
20
31
|
version: config.version,
|
|
21
32
|
inputPath,
|
|
22
33
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const createMutex = require('../../../../../vendor/dist/mutexify/promise')
|
|
4
|
+
const mutex = createMutex()
|
|
4
5
|
const { getGeneratedPosition } = require('./source-maps')
|
|
5
6
|
const session = require('./session')
|
|
6
7
|
const { compile, compileSegments, templateRequiresEvaluation } = require('./condition')
|