dd-trace 6.16.0 → 6.18.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/ci/diagnose.js +0 -23
- package/ci/test-optimization-validation/approval-artifacts.js +0 -3
- package/ci/test-optimization-validation/approval.js +0 -6
- package/ci/test-optimization-validation/artifact-id.js +0 -1
- package/ci/test-optimization-validation/bounded-json.js +0 -1
- package/ci/test-optimization-validation/cli.js +0 -12
- package/ci/test-optimization-validation/command-output-policy.js +0 -1
- package/ci/test-optimization-validation/command-runner.js +0 -3
- package/ci/test-optimization-validation/environment.js +0 -4
- package/ci/test-optimization-validation/executable-approval.js +0 -1
- package/ci/test-optimization-validation/executable.js +0 -5
- package/ci/test-optimization-validation/framework-adapters/cucumber.js +0 -6
- package/ci/test-optimization-validation/framework-adapters/cypress.js +0 -3
- package/ci/test-optimization-validation/framework-adapters/playwright.js +0 -6
- package/ci/test-optimization-validation/framework-adapters/vitest.js +0 -4
- package/ci/test-optimization-validation/generated-test-contract.js +0 -5
- package/ci/test-optimization-validation/generated-verifier.js +0 -1
- package/ci/test-optimization-validation/literal-environment.js +0 -1
- package/ci/test-optimization-validation/manifest-scaffold.js +0 -17
- package/ci/test-optimization-validation/manifest-schema.js +0 -21
- package/ci/test-optimization-validation/offline-fixtures.js +0 -4
- package/ci/test-optimization-validation/plan-writer.js +0 -11
- package/ci/test-optimization-validation/preflight-runner.js +0 -1
- package/ci/test-optimization-validation/redaction.js +0 -4
- package/ci/test-optimization-validation/report-writer.js +0 -16
- package/ci/test-optimization-validation/runner-command.js +0 -3
- package/ci/test-optimization-validation/runner-contract.js +0 -4
- package/ci/test-optimization-validation/safe-files.js +0 -1
- package/ci/test-optimization-validation/scenarios/basic-reporting.js +0 -1
- package/ci/test-optimization-validation/scenarios/ci-wiring.js +0 -1
- package/ci/test-optimization-validation/source-text.js +0 -3
- package/ci/vitest-no-worker-init-setup.mjs +41 -16
- package/index.d.ts +208 -0
- package/package.json +17 -16
- package/packages/datadog-esbuild/src/utils.js +0 -2
- package/packages/datadog-instrumentations/src/aerospike.js +28 -6
- package/packages/datadog-instrumentations/src/aws-durable-execution-sdk-js.js +0 -2
- package/packages/datadog-instrumentations/src/aws-sdk.js +0 -2
- package/packages/datadog-instrumentations/src/claude-agent-sdk.js +0 -2
- package/packages/datadog-instrumentations/src/console.js +97 -0
- package/packages/datadog-instrumentations/src/cucumber.js +77 -12
- package/packages/datadog-instrumentations/src/cypress-config.js +27 -38
- package/packages/datadog-instrumentations/src/helpers/bundler-register.js +6 -0
- package/packages/datadog-instrumentations/src/helpers/channel.js +0 -2
- package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +2 -1
- package/packages/datadog-instrumentations/src/helpers/graphql-jit-runtime.js +0 -5
- package/packages/datadog-instrumentations/src/helpers/hooks.js +8 -6
- package/packages/datadog-instrumentations/src/helpers/instrumentation-utils.js +0 -3
- package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +0 -6
- package/packages/datadog-instrumentations/src/helpers/register.js +24 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +111 -26
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentation-registry.js +41 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +3 -17
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +55 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/postgres.js +36 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/supabase.js +128 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +13 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/targets.js +28 -3
- package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +20 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms/postgres.js +388 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +0 -5
- package/packages/datadog-instrumentations/src/helpers/router-helper.js +0 -1
- package/packages/datadog-instrumentations/src/jest.js +165 -51
- package/packages/datadog-instrumentations/src/knex.js +0 -1
- package/packages/datadog-instrumentations/src/mariadb-bundle.js +0 -24
- package/packages/datadog-instrumentations/src/mariadb.js +0 -2
- package/packages/datadog-instrumentations/src/mocha/common.js +0 -1
- package/packages/datadog-instrumentations/src/mocha/main.js +25 -26
- package/packages/datadog-instrumentations/src/mocha/utils.js +119 -49
- package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +0 -6
- package/packages/datadog-instrumentations/src/mocha/worker.js +14 -17
- package/packages/datadog-instrumentations/src/mysql2.js +0 -2
- package/packages/datadog-instrumentations/src/openai-realtime/audio-accumulator.js +241 -0
- package/packages/datadog-instrumentations/src/openai-realtime/events.js +76 -0
- package/packages/datadog-instrumentations/src/openai-realtime/index.js +301 -0
- package/packages/datadog-instrumentations/src/openai-realtime/session.js +998 -0
- package/packages/datadog-instrumentations/src/openai-realtime/turns.js +211 -0
- package/packages/datadog-instrumentations/src/openai.js +51 -12
- package/packages/datadog-instrumentations/src/oracledb.js +9 -3
- package/packages/datadog-instrumentations/src/playwright-reporter.js +6 -20
- package/packages/datadog-instrumentations/src/playwright.js +280 -56
- package/packages/datadog-instrumentations/src/{azure-cosmos.js → postgres.js} +1 -1
- package/packages/datadog-instrumentations/src/router.js +0 -2
- package/packages/datadog-instrumentations/src/rum-browser-scripts.js +0 -2
- package/packages/datadog-instrumentations/src/sequelize.js +0 -1
- package/packages/datadog-instrumentations/src/supabase.js +15 -0
- package/packages/datadog-instrumentations/src/undici.js +7 -3
- package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +18 -18
- package/packages/datadog-instrumentations/src/vitest-main.js +121 -30
- package/packages/datadog-instrumentations/src/vitest-util.js +7 -1
- package/packages/datadog-instrumentations/src/vitest-worker.js +49 -13
- package/packages/datadog-instrumentations/src/webdriverio.js +44 -47
- package/packages/datadog-instrumentations/src/ws.js +41 -2
- package/packages/datadog-plugin-ai/src/utils.js +0 -2
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/trace-checkpoint.js +0 -1
- package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/util.js +0 -2
- package/packages/datadog-plugin-aws-sdk/src/base.js +0 -1
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +0 -1
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +0 -1
- package/packages/datadog-plugin-aws-sdk/src/util.js +0 -1
- package/packages/datadog-plugin-azure-durable-functions/src/index.js +0 -1
- package/packages/datadog-plugin-cucumber/src/index.js +9 -0
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +211 -85
- package/packages/datadog-plugin-cypress/src/finalization.js +0 -3
- package/packages/datadog-plugin-cypress/src/index.js +3 -1
- package/packages/datadog-plugin-cypress/src/source-map-utils.js +0 -4
- package/packages/datadog-plugin-cypress/src/support.js +52 -7
- package/packages/datadog-plugin-graphql/src/resolve-error.js +1 -2
- package/packages/datadog-plugin-graphql/src/utils.js +0 -5
- package/packages/datadog-plugin-jest/src/index.js +12 -0
- package/packages/datadog-plugin-kafkajs/src/producer.js +0 -1
- package/packages/datadog-plugin-mocha/src/index.js +38 -11
- package/packages/datadog-plugin-mongodb-core/src/query.js +0 -1
- package/packages/datadog-plugin-openai/src/index.js +16 -1
- package/packages/datadog-plugin-openai/src/realtime.js +144 -0
- package/packages/datadog-plugin-openai-agents/src/integration.js +0 -4
- package/packages/datadog-plugin-openai-agents/src/util.js +0 -1
- package/packages/datadog-plugin-playwright/src/index.js +81 -9
- package/packages/datadog-plugin-postgres/src/index.js +167 -0
- package/packages/datadog-plugin-prisma/src/datadog-tracing-helper.js +0 -1
- package/packages/datadog-plugin-redis/src/index.js +15 -1
- package/packages/datadog-plugin-supabase/src/error.js +18 -0
- package/packages/datadog-plugin-supabase/src/index.js +21 -0
- package/packages/datadog-plugin-supabase/src/supabase-auth-js-gotrueclient-getuser.js +69 -0
- package/packages/datadog-plugin-supabase/src/supabase-functions-js-functionsclient-invoke.js +70 -0
- package/packages/datadog-plugin-supabase/src/supabase-postgrest-js-postgrestbuilder-then.js +122 -0
- package/packages/datadog-plugin-supabase/src/supabase-realtime-js-realtimechannel-send.js +66 -0
- package/packages/datadog-plugin-supabase/src/supabase-storage-js-handle-request.js +93 -0
- package/packages/datadog-plugin-supabase/src/url.js +17 -0
- package/packages/datadog-plugin-vitest/src/index.js +9 -0
- package/packages/datadog-plugin-ws/src/producer.js +1 -1
- package/packages/datadog-plugin-ws/src/util.js +0 -4
- package/packages/datadog-shimmer/src/shimmer.js +14 -10
- package/packages/datadog-turbopack/index.js +4 -7
- package/packages/datadog-turbopack/src/loader.js +6 -18
- package/packages/datadog-webpack/src/loader.js +0 -1
- package/packages/dd-trace/src/agent/info.js +5 -4
- package/packages/dd-trace/src/aiguard/client.js +2 -3
- package/packages/dd-trace/src/aiguard/evaluation.js +6 -12
- package/packages/dd-trace/src/aiguard/index.js +2 -2
- package/packages/dd-trace/src/aiguard/integrations/index.js +1 -1
- package/packages/dd-trace/src/aiguard/integrations/openai.js +81 -7
- package/packages/dd-trace/src/aiguard/messages/anthropic.js +0 -2
- package/packages/dd-trace/src/aiguard/messages/openai.js +64 -1
- package/packages/dd-trace/src/aiguard/messages/utils.js +0 -1
- package/packages/dd-trace/src/aiguard/redaction.js +0 -1
- package/packages/dd-trace/src/aiguard/sdk.js +1 -1
- package/packages/dd-trace/src/appsec/activation.js +1 -1
- package/packages/dd-trace/src/appsec/api_security/normalized-route.js +0 -5
- package/packages/dd-trace/src/appsec/api_security/sampler.js +0 -4
- package/packages/dd-trace/src/appsec/blocking/index.js +3 -3
- package/packages/dd-trace/src/appsec/downstream_requests.js +1 -4
- package/packages/dd-trace/src/appsec/iast/index.js +1 -1
- package/packages/dd-trace/src/appsec/iast/overhead-controller.js +5 -5
- package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +3 -3
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +8 -10
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +4 -1
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +7 -7
- package/packages/dd-trace/src/appsec/index.js +2 -2
- package/packages/dd-trace/src/appsec/lambda.js +71 -2
- package/packages/dd-trace/src/appsec/rasp/utils.js +5 -1
- package/packages/dd-trace/src/appsec/remote_config.js +8 -6
- package/packages/dd-trace/src/appsec/reporter.js +10 -6
- package/packages/dd-trace/src/appsec/rule_manager.js +3 -3
- package/packages/dd-trace/src/appsec/sdk/track_event.js +0 -2
- package/packages/dd-trace/src/appsec/waf/index.js +2 -2
- package/packages/dd-trace/src/appsec/waf/waf_manager.js +8 -5
- package/packages/dd-trace/src/carrier.js +0 -5
- package/packages/dd-trace/src/ci-visibility/dynamic-atr-retries.js +104 -0
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +0 -2
- package/packages/dd-trace/src/ci-visibility/efd-retry-policy.js +34 -3
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +0 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +0 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +0 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/index.js +0 -4
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/msgpack-to-json.js +0 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/sink.js +0 -2
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +37 -15
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +0 -3
- package/packages/dd-trace/src/ci-visibility/exporters/request.js +0 -11
- package/packages/dd-trace/src/ci-visibility/exporters/settings-cache-key.js +0 -1
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +0 -1
- package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +0 -6
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +2 -2
- package/packages/dd-trace/src/ci-visibility/requests/rate-limit.js +0 -1
- package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +0 -5
- package/packages/dd-trace/src/ci-visibility/requests/video-request.js +0 -1
- package/packages/dd-trace/src/ci-visibility/telemetry.js +13 -0
- package/packages/dd-trace/src/ci-visibility/test-optimization-cache.js +0 -1
- package/packages/dd-trace/src/ci-visibility/test-screenshot.js +0 -2
- package/packages/dd-trace/src/ci-visibility/test-video.js +0 -1
- package/packages/dd-trace/src/config/defaults.js +3 -2
- package/packages/dd-trace/src/config/generated-config-types.d.ts +88 -82
- package/packages/dd-trace/src/config/helper.js +0 -1
- package/packages/dd-trace/src/config/index.js +31 -30
- package/packages/dd-trace/src/config/parsers.js +34 -6
- package/packages/dd-trace/src/config/remote_config.js +25 -109
- package/packages/dd-trace/src/config/supported-configurations.json +150 -10
- package/packages/dd-trace/src/datastreams/encoding.js +0 -1
- package/packages/dd-trace/src/datastreams/pathway.js +0 -1
- package/packages/dd-trace/src/debugger/constants.js +10 -0
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +62 -10
- package/packages/dd-trace/src/debugger/devtools_client/config.js +4 -1
- package/packages/dd-trace/src/debugger/devtools_client/guardrail-metrics.js +15 -0
- package/packages/dd-trace/src/debugger/devtools_client/index.js +103 -27
- package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +50 -7
- package/packages/dd-trace/src/debugger/devtools_client/log.js +3 -1
- package/packages/dd-trace/src/debugger/devtools_client/probe_sampler.js +21 -8
- package/packages/dd-trace/src/debugger/devtools_client/send.js +41 -15
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +53 -13
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +118 -71
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +5 -3
- package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +0 -3
- package/packages/dd-trace/src/debugger/devtools_client/status.js +21 -7
- package/packages/dd-trace/src/debugger/guardrail-metrics.js +167 -0
- package/packages/dd-trace/src/debugger/index.js +51 -3
- package/packages/dd-trace/src/debugger/inspect-segment.js +0 -3
- package/packages/dd-trace/src/debugger/probe_sampler.js +133 -9
- package/packages/dd-trace/src/debugger/probe_sampler_constants.js +31 -1
- package/packages/dd-trace/src/dogstatsd.js +0 -23
- package/packages/dd-trace/src/encode/0.4-cross-payload.js +0 -3
- package/packages/dd-trace/src/encode/0.4.js +0 -7
- package/packages/dd-trace/src/encode/0.5.js +0 -2
- package/packages/dd-trace/src/encode/tags-processors.js +0 -1
- package/packages/dd-trace/src/evp_proxy/constants.js +2 -0
- package/packages/dd-trace/src/evp_proxy/direct.js +17 -13
- package/packages/dd-trace/src/evp_proxy/discovery.js +14 -11
- package/packages/dd-trace/src/evp_proxy/path.js +21 -9
- package/packages/dd-trace/src/exporters/agent/writer.js +0 -1
- package/packages/dd-trace/src/exporters/agentless/index.js +0 -1
- package/packages/dd-trace/src/exporters/agentless/intake.js +0 -1
- package/packages/dd-trace/src/exporters/agentless/writer.js +0 -3
- package/packages/dd-trace/src/exporters/common/final-flush-request-tracker.js +0 -6
- package/packages/dd-trace/src/exporters/common/request.js +1 -0
- package/packages/dd-trace/src/exporters/common/url.js +33 -4
- package/packages/dd-trace/src/exporters/common/writer.js +0 -2
- package/packages/dd-trace/src/id.js +0 -11
- package/packages/dd-trace/src/llmobs/audio-codec.js +192 -0
- package/packages/dd-trace/src/llmobs/audio-utils.js +121 -0
- package/packages/dd-trace/src/llmobs/constants/audio.js +35 -0
- package/packages/dd-trace/src/llmobs/constants/prompts.js +14 -0
- package/packages/dd-trace/src/llmobs/constants/tags.js +17 -0
- package/packages/dd-trace/src/llmobs/eval-metric.js +0 -6
- package/packages/dd-trace/src/llmobs/experiments/dataset.js +0 -4
- package/packages/dd-trace/src/llmobs/experiments/experiment.js +0 -3
- package/packages/dd-trace/src/llmobs/experiments/index.js +7 -6
- package/packages/dd-trace/src/llmobs/experiments/util.js +1 -11
- package/packages/dd-trace/src/llmobs/index.js +1 -3
- package/packages/dd-trace/src/llmobs/noop.js +10 -0
- package/packages/dd-trace/src/llmobs/plugins/ai/util.js +0 -4
- package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +0 -1
- package/packages/dd-trace/src/llmobs/plugins/genai/util.js +0 -4
- package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/utils.js +0 -2
- package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +0 -2
- package/packages/dd-trace/src/llmobs/plugins/openai/index.js +4 -6
- package/packages/dd-trace/src/llmobs/plugins/openai/realtime.js +285 -0
- package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +16 -3
- package/packages/dd-trace/src/llmobs/prompts/cache.js +272 -0
- package/packages/dd-trace/src/llmobs/prompts/manager.js +647 -0
- package/packages/dd-trace/src/llmobs/prompts/noop.js +29 -0
- package/packages/dd-trace/src/llmobs/prompts/prompt.js +158 -0
- package/packages/dd-trace/src/llmobs/sdk.js +21 -6
- package/packages/dd-trace/src/llmobs/span_processor.js +81 -2
- package/packages/dd-trace/src/llmobs/tagger.js +39 -11
- package/packages/dd-trace/src/llmobs/telemetry.js +36 -4
- package/packages/dd-trace/src/llmobs/util.js +0 -34
- package/packages/dd-trace/src/llmobs/writers/base.js +0 -1
- package/packages/dd-trace/src/llmobs/writers/util.js +1 -2
- package/packages/dd-trace/src/log/channels.js +3 -0
- package/packages/dd-trace/src/log/index.js +23 -5
- package/packages/dd-trace/src/log-submission/log-submission-plugin.js +74 -6
- package/packages/dd-trace/src/msgpack/chunk.js +0 -1
- package/packages/dd-trace/src/openfeature/agentless_configuration_source.js +0 -12
- package/packages/dd-trace/src/openfeature/configuration_source.js +4 -1
- package/packages/dd-trace/src/openfeature/encoding.js +0 -2
- package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +0 -1
- package/packages/dd-trace/src/openfeature/flagging_provider.js +3 -3
- package/packages/dd-trace/src/openfeature/index.js +6 -6
- package/packages/dd-trace/src/openfeature/span-enrichment-hook.js +0 -1
- package/packages/dd-trace/src/openfeature/span-enrichment.js +0 -4
- package/packages/dd-trace/src/openfeature/writers/base.js +90 -23
- package/packages/dd-trace/src/openfeature/writers/exposures.js +4 -5
- package/packages/dd-trace/src/openfeature/writers/util.js +104 -37
- package/packages/dd-trace/src/opentelemetry/logs/logger.js +0 -1
- package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +0 -1
- package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +0 -1
- package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +0 -2
- package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +0 -1
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +0 -1
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +0 -1
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +1 -14
- package/packages/dd-trace/src/opentelemetry/metrics/time.js +0 -1
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +30 -13
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +0 -1
- package/packages/dd-trace/src/opentelemetry/span-helpers.js +0 -1
- package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +0 -1
- package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +0 -3
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +0 -6
- package/packages/dd-trace/src/opentracing/span_context.js +0 -1
- package/packages/dd-trace/src/opentracing/tracer.js +3 -3
- package/packages/dd-trace/src/otel-thread-ctx.js +38 -11
- package/packages/dd-trace/src/payload-tagging/tagging.js +15 -3
- package/packages/dd-trace/src/plugin_manager.js +27 -8
- package/packages/dd-trace/src/plugins/ci_plugin.js +1 -2
- package/packages/dd-trace/src/plugins/database.js +2 -6
- package/packages/dd-trace/src/plugins/index.js +7 -0
- package/packages/dd-trace/src/plugins/plugin.js +0 -4
- package/packages/dd-trace/src/plugins/tracing.js +1 -1
- package/packages/dd-trace/src/plugins/util/git.js +1 -3
- package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +0 -1
- package/packages/dd-trace/src/plugins/util/llm.js +0 -2
- package/packages/dd-trace/src/plugins/util/status-validator.js +0 -1
- package/packages/dd-trace/src/plugins/util/test.js +26 -20
- package/packages/dd-trace/src/plugins/util/url.js +0 -5
- package/packages/dd-trace/src/priority_sampler.js +0 -6
- package/packages/dd-trace/src/process-tags/index.js +0 -1
- package/packages/dd-trace/src/profiler.js +132 -35
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +0 -1
- package/packages/dd-trace/src/profiling/profiler.js +101 -41
- package/packages/dd-trace/src/profiling/ssi-heuristics.js +29 -15
- package/packages/dd-trace/src/propagation-hash/index.js +0 -1
- package/packages/dd-trace/src/proxy.js +23 -47
- package/packages/dd-trace/src/random_sampler.js +0 -4
- package/packages/dd-trace/src/rate_limiter.js +0 -4
- package/packages/dd-trace/src/remote_config/capabilities.js +1 -9
- package/packages/dd-trace/src/remote_config/index.js +0 -1
- package/packages/dd-trace/src/runtime_metrics/otlp_runtime_metrics.js +0 -3
- package/packages/dd-trace/src/sampler.js +0 -4
- package/packages/dd-trace/src/sampling_rule.js +0 -7
- package/packages/dd-trace/src/serverless/vercel.js +0 -1
- package/packages/dd-trace/src/serverless.js +0 -1
- package/packages/dd-trace/src/service-naming/index.js +0 -1
- package/packages/dd-trace/src/service-naming/schemas/util.js +0 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +7 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +5 -0
- package/packages/dd-trace/src/span_processor.js +2 -2
- package/packages/dd-trace/src/span_sampler.js +0 -1
- package/packages/dd-trace/src/standalone/product.js +2 -2
- package/packages/dd-trace/src/standalone/tracesource.js +0 -1
- package/packages/dd-trace/src/startup-log.js +1 -1
- package/packages/dd-trace/src/telemetry/endpoints.js +0 -8
- package/packages/dd-trace/src/telemetry/logs/index.js +16 -5
- package/packages/dd-trace/src/telemetry/logs/log-collector.js +16 -6
- package/packages/dd-trace/src/telemetry/metrics.js +0 -2
- package/packages/dd-trace/src/telemetry/send-data.js +2 -1
- package/packages/dd-trace/src/telemetry/telemetry.js +4 -1
- package/packages/dd-trace/src/tracer.js +5 -4
- package/packages/dd-trace/src/util.js +13 -1
- package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -1
- package/packages/datadog-instrumentations/src/bullmq.js +0 -11
- package/packages/datadog-instrumentations/src/langchain.js +0 -7
- package/packages/datadog-instrumentations/src/langgraph.js +0 -7
- package/packages/datadog-instrumentations/src/mercurius.js +0 -11
|
@@ -207,7 +207,6 @@ class DogStatsDClient {
|
|
|
207
207
|
/**
|
|
208
208
|
* @param {boolean|(() => void)} [forceTelemetry] - Whether to ignore the telemetry interval, or completion callback
|
|
209
209
|
* @param {() => void} [done] - Called after serverless deliveries complete
|
|
210
|
-
* @returns {void}
|
|
211
210
|
*/
|
|
212
211
|
flush (forceTelemetry = false, done) {
|
|
213
212
|
if (typeof forceTelemetry === 'function') {
|
|
@@ -238,7 +237,6 @@ class DogStatsDClient {
|
|
|
238
237
|
/**
|
|
239
238
|
* @param {boolean} force - Whether to ignore the telemetry interval
|
|
240
239
|
* @param {((send: (done?: () => void) => void) => void)} [track] - Tracks a non-serverless delivery
|
|
241
|
-
* @returns {void}
|
|
242
240
|
*/
|
|
243
241
|
#flushTelemetry (force, track) {
|
|
244
242
|
const telemetry = this.telemetry
|
|
@@ -291,7 +289,6 @@ class DogStatsDClient {
|
|
|
291
289
|
* @param {DogStatsDBufferState} state - Payload state to flush
|
|
292
290
|
* @param {boolean} recordTelemetry - Whether to record the transport outcome
|
|
293
291
|
* @param {((send: (done?: () => void) => void) => void)} [track] - Tracks a non-serverless delivery
|
|
294
|
-
* @returns {void}
|
|
295
292
|
*/
|
|
296
293
|
#flush (state, recordTelemetry, track) {
|
|
297
294
|
const queue = this._enqueue(state)
|
|
@@ -314,7 +311,6 @@ class DogStatsDClient {
|
|
|
314
311
|
|
|
315
312
|
/**
|
|
316
313
|
* @param {number} bytes - Number of bytes sent
|
|
317
|
-
* @returns {void}
|
|
318
314
|
*/
|
|
319
315
|
#recordSent (bytes) {
|
|
320
316
|
const telemetry = this.telemetry
|
|
@@ -326,7 +322,6 @@ class DogStatsDClient {
|
|
|
326
322
|
/**
|
|
327
323
|
* @param {number} bytes - Number of bytes dropped
|
|
328
324
|
* @param {number} [packets] - Number of packets dropped
|
|
329
|
-
* @returns {void}
|
|
330
325
|
*/
|
|
331
326
|
#recordDropped (bytes, packets = 1) {
|
|
332
327
|
const telemetry = this.telemetry
|
|
@@ -341,7 +336,6 @@ class DogStatsDClient {
|
|
|
341
336
|
* @param {Buffer[]} queue - The metrics to send
|
|
342
337
|
* @param {boolean} recordTelemetry - Whether to record the transport outcome
|
|
343
338
|
* @param {() => void} [done] - Called after delivery completes
|
|
344
|
-
* @returns {void}
|
|
345
339
|
* @memberof DogStatsDClient
|
|
346
340
|
*/
|
|
347
341
|
_sendHttp (queue, recordTelemetry, done) {
|
|
@@ -375,7 +369,6 @@ class DogStatsDClient {
|
|
|
375
369
|
* @param {Buffer[]} queue - The metrics to send
|
|
376
370
|
* @param {boolean} recordTelemetry - Whether to record the transport outcome
|
|
377
371
|
* @param {() => void} [done] - Called after delivery completes
|
|
378
|
-
* @returns {void}
|
|
379
372
|
* @memberof DogStatsDClient
|
|
380
373
|
*/
|
|
381
374
|
_sendUdp (queue, recordTelemetry, done) {
|
|
@@ -411,7 +404,6 @@ class DogStatsDClient {
|
|
|
411
404
|
* @param {number} family - The family of the address
|
|
412
405
|
* @param {boolean} recordTelemetry - Whether to record the transport outcome
|
|
413
406
|
* @param {() => void} [done] - Called after every packet completes
|
|
414
|
-
* @returns {void}
|
|
415
407
|
* @memberof DogStatsDClient
|
|
416
408
|
*/
|
|
417
409
|
_sendUdpFromQueue (queue, address, family, recordTelemetry, done) {
|
|
@@ -457,7 +449,6 @@ class DogStatsDClient {
|
|
|
457
449
|
* @param {string[]} tags - The metric tags
|
|
458
450
|
* @param {string} [tagsPrefix] - Serialized global tags
|
|
459
451
|
* @param {DogStatsDBufferState} [state] - Payload state receiving the metric
|
|
460
|
-
* @returns {void}
|
|
461
452
|
* @memberof DogStatsDClient
|
|
462
453
|
*/
|
|
463
454
|
_add (stat, value, type, tags, tagsPrefix = this.#tagsPrefix, state = this.#metrics) {
|
|
@@ -482,7 +473,6 @@ class DogStatsDClient {
|
|
|
482
473
|
* @param {string} stat - Telemetry metric name
|
|
483
474
|
* @param {number} value - Telemetry metric value
|
|
484
475
|
* @param {string} [typeLabel] - Submitted or aggregated metric type
|
|
485
|
-
* @returns {void}
|
|
486
476
|
*/
|
|
487
477
|
#addTelemetry (stat, value, typeLabel) {
|
|
488
478
|
const tags = typeLabel === undefined ? undefined : [`metrics_type:${typeLabel}`]
|
|
@@ -496,7 +486,6 @@ class DogStatsDClient {
|
|
|
496
486
|
*
|
|
497
487
|
* @param {string} message - The message to write
|
|
498
488
|
* @param {DogStatsDBufferState} [state] - Payload state receiving the message
|
|
499
|
-
* @returns {void}
|
|
500
489
|
* @memberof DogStatsDClient
|
|
501
490
|
*/
|
|
502
491
|
_write (message, state = this.#metrics) {
|
|
@@ -605,7 +594,6 @@ class MetricsAggregationClient {
|
|
|
605
594
|
/**
|
|
606
595
|
* @param {boolean|(() => void)} [forceTelemetry] - Whether to ignore the telemetry interval, or completion callback
|
|
607
596
|
* @param {() => void} [done] - Called after serverless deliveries complete
|
|
608
|
-
* @returns {void}
|
|
609
597
|
*/
|
|
610
598
|
flush (forceTelemetry = false, done) {
|
|
611
599
|
if (typeof forceTelemetry === 'function') {
|
|
@@ -680,9 +668,6 @@ class MetricsAggregationClient {
|
|
|
680
668
|
this.count(name, -count, tags)
|
|
681
669
|
}
|
|
682
670
|
|
|
683
|
-
/**
|
|
684
|
-
* @returns {number} Number of gauge contexts flushed
|
|
685
|
-
*/
|
|
686
671
|
_captureGauges () {
|
|
687
672
|
let metrics = 0
|
|
688
673
|
const contexts = this._captureTree(this._gauges, (node, name, tags) => {
|
|
@@ -696,9 +681,6 @@ class MetricsAggregationClient {
|
|
|
696
681
|
return contexts
|
|
697
682
|
}
|
|
698
683
|
|
|
699
|
-
/**
|
|
700
|
-
* @returns {number} Number of counter contexts flushed
|
|
701
|
-
*/
|
|
702
684
|
_captureCounters () {
|
|
703
685
|
let metrics = 0
|
|
704
686
|
const contexts = this._captureTree(this._counters, (node, name, tags) => {
|
|
@@ -712,9 +694,6 @@ class MetricsAggregationClient {
|
|
|
712
694
|
return contexts
|
|
713
695
|
}
|
|
714
696
|
|
|
715
|
-
/**
|
|
716
|
-
* @returns {number} Number of histogram contexts flushed
|
|
717
|
-
*/
|
|
718
697
|
_captureHistograms () {
|
|
719
698
|
let metrics = 0
|
|
720
699
|
const contexts = this._captureTree(this._histograms, (node, name, tags) => {
|
|
@@ -740,7 +719,6 @@ class MetricsAggregationClient {
|
|
|
740
719
|
/**
|
|
741
720
|
* @param {Map<string, MetricNode>} tree - Metric context tree
|
|
742
721
|
* @param {CaptureMetric} fn - Called for every context with submissions
|
|
743
|
-
* @returns {number} Number of contexts with submissions
|
|
744
722
|
*/
|
|
745
723
|
_captureTree (tree, fn) {
|
|
746
724
|
let contexts = 0
|
|
@@ -757,7 +735,6 @@ class MetricsAggregationClient {
|
|
|
757
735
|
* @param {string} name - Metric name
|
|
758
736
|
* @param {string[]} tags - Current metric tags
|
|
759
737
|
* @param {CaptureMetric} fn - Called for every context with submissions
|
|
760
|
-
* @returns {number} Number of contexts with submissions
|
|
761
738
|
*/
|
|
762
739
|
_captureNode (node, name, tags, fn) {
|
|
763
740
|
let contexts = 0
|
|
@@ -74,13 +74,11 @@ class CrossPayloadAgentEncoder extends AgentEncoder {
|
|
|
74
74
|
return super.makePayload()
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
/** @returns {void} */
|
|
78
77
|
reset () {
|
|
79
78
|
this.#prepareReset()
|
|
80
79
|
super.reset()
|
|
81
80
|
}
|
|
82
81
|
|
|
83
|
-
/** @returns {void} */
|
|
84
82
|
#prepareReset () {
|
|
85
83
|
const crossPayloadState = this.#crossPayloadState
|
|
86
84
|
if (crossPayloadState !== undefined && !prepareCrossPayloadReset(crossPayloadState)) {
|
|
@@ -129,7 +127,6 @@ function markPayloadString (crossPayloadState, value) {
|
|
|
129
127
|
|
|
130
128
|
/**
|
|
131
129
|
* @param {ReturnType<typeof createCrossPayloadState>} crossPayloadState
|
|
132
|
-
* @returns {boolean}
|
|
133
130
|
*/
|
|
134
131
|
function prepareCrossPayloadReset (crossPayloadState) {
|
|
135
132
|
const learning = crossPayloadState.learningPayloadCount < CROSS_PAYLOAD_LEARNING_PAYLOAD_LIMIT
|
|
@@ -136,7 +136,6 @@ function formatSpanWithLegacyEvents (span) {
|
|
|
136
136
|
* replacer hooks).
|
|
137
137
|
*
|
|
138
138
|
* @param {Array<{ name: unknown, startTime: number, attributes?: object }>} spanEvents
|
|
139
|
-
* @returns {string}
|
|
140
139
|
*/
|
|
141
140
|
function stringifySpanEvents (spanEvents) {
|
|
142
141
|
let result = '['
|
|
@@ -200,7 +199,6 @@ function stringifyAttributeValue (value) {
|
|
|
200
199
|
* conversion (which is what `JSON.stringify` calls internally).
|
|
201
200
|
*
|
|
202
201
|
* @param {number} value
|
|
203
|
-
* @returns {string}
|
|
204
202
|
*/
|
|
205
203
|
function jsonNumber (value) {
|
|
206
204
|
if (Number.isFinite(value)) return String(value)
|
|
@@ -215,7 +213,6 @@ function jsonNumber (value) {
|
|
|
215
213
|
* lone surrogates, etc.).
|
|
216
214
|
*
|
|
217
215
|
* @param {string} value
|
|
218
|
-
* @returns {string}
|
|
219
216
|
*/
|
|
220
217
|
function escapeJsonString (value) {
|
|
221
218
|
for (let index = 0; index < value.length; index++) {
|
|
@@ -649,7 +646,6 @@ class AgentEncoder {
|
|
|
649
646
|
* @param {number} offset
|
|
650
647
|
* @param {Buffer} keyPrefix Precomputed `[key, 0xCF]`.
|
|
651
648
|
* @param {{ toBuffer: () => Uint8Array | number[] }} identifier
|
|
652
|
-
* @returns {number}
|
|
653
649
|
*/
|
|
654
650
|
#writeIdAt (target, offset, keyPrefix, identifier) {
|
|
655
651
|
target.set(keyPrefix, offset)
|
|
@@ -871,7 +867,6 @@ class AgentEncoder {
|
|
|
871
867
|
* @param {MsgpackChunk} bytes
|
|
872
868
|
* @param {string} key
|
|
873
869
|
* @param {unknown} value
|
|
874
|
-
* @returns {boolean}
|
|
875
870
|
*/
|
|
876
871
|
#emitAttribute (bytes, key, value) {
|
|
877
872
|
if (typeof value === 'string') {
|
|
@@ -911,7 +906,6 @@ class AgentEncoder {
|
|
|
911
906
|
* @param {MsgpackChunk} bytes
|
|
912
907
|
* @param {string} key
|
|
913
908
|
* @param {Array<unknown>} array
|
|
914
|
-
* @returns {boolean}
|
|
915
909
|
*/
|
|
916
910
|
#emitArrayAttribute (bytes, key, array) {
|
|
917
911
|
const sectionStart = bytes.length
|
|
@@ -946,7 +940,6 @@ class AgentEncoder {
|
|
|
946
940
|
* @param {MsgpackChunk} bytes
|
|
947
941
|
* @param {string} key
|
|
948
942
|
* @param {unknown} value
|
|
949
|
-
* @returns {boolean}
|
|
950
943
|
*/
|
|
951
944
|
#emitArrayItem (bytes, key, value) {
|
|
952
945
|
if (typeof value === 'string') {
|
|
@@ -173,7 +173,6 @@ class AgentEncoder extends BaseEncoder {
|
|
|
173
173
|
* @param {Uint8Array} target
|
|
174
174
|
* @param {number} offset
|
|
175
175
|
* @param {number} index
|
|
176
|
-
* @returns {number}
|
|
177
176
|
*/
|
|
178
177
|
#writeIndexAt (target, offset, index) {
|
|
179
178
|
target[offset] = 0xCE
|
|
@@ -192,7 +191,6 @@ class AgentEncoder extends BaseEncoder {
|
|
|
192
191
|
* @param {Uint8Array} target
|
|
193
192
|
* @param {number} offset
|
|
194
193
|
* @param {{ toBuffer: () => Uint8Array | number[] }} identifier
|
|
195
|
-
* @returns {number}
|
|
196
194
|
*/
|
|
197
195
|
#writeIdAt (target, offset, identifier) {
|
|
198
196
|
target[offset] = 0xCF
|
|
@@ -53,7 +53,6 @@ function truncateSpanTestOpt (span) {
|
|
|
53
53
|
* the formatter no longer reshapes events, it hands the raw array through.
|
|
54
54
|
*
|
|
55
55
|
* @param {{ startTime: number }} event
|
|
56
|
-
* @returns {number}
|
|
57
56
|
*/
|
|
58
57
|
function eventTimeNano (event) {
|
|
59
58
|
return Math.round(event.startTime * 1e6)
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
module.exports = {
|
|
4
|
+
EVP_ORIGIN_HEADER_NAME: 'DD-EVP-ORIGIN',
|
|
5
|
+
EVP_ORIGIN_VERSION_HEADER_NAME: 'DD-EVP-ORIGIN-VERSION',
|
|
4
6
|
EVP_PROXY_PATH_V2: '/evp_proxy/v2',
|
|
5
7
|
EVP_PROXY_PATH_V4: '/evp_proxy/v4',
|
|
6
8
|
EVP_SUBDOMAIN_HEADER_NAME: 'X-Datadog-EVP-Subdomain',
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
const { createSiteUrl } = require('../exporters/common/url')
|
|
4
4
|
const log = require('../log')
|
|
5
5
|
|
|
6
|
+
let invalidSiteWarningLogged = false
|
|
7
|
+
|
|
6
8
|
/**
|
|
7
9
|
* @typedef {object} DirectEVPRoute
|
|
8
10
|
* @property {URL} url - Direct intake URL
|
|
@@ -21,21 +23,23 @@ const log = require('../log')
|
|
|
21
23
|
*/
|
|
22
24
|
function createDirectEVPRoute (config, intake) {
|
|
23
25
|
const apiKey = config.DD_API_KEY
|
|
24
|
-
if (!apiKey
|
|
25
|
-
|
|
26
|
-
try {
|
|
27
|
-
const url = createSiteUrl(config.site, intake)
|
|
28
|
-
if (url === undefined) throw new Error('Invalid direct EVP intake URL')
|
|
26
|
+
if (!apiKey) return
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
},
|
|
28
|
+
const url = createSiteUrl(config.site, intake)
|
|
29
|
+
if (url === undefined) {
|
|
30
|
+
if (!invalidSiteWarningLogged) {
|
|
31
|
+
invalidSiteWarningLogged = true
|
|
32
|
+
log.warn('Feature Flags direct event delivery is disabled because DD_SITE is invalid.')
|
|
36
33
|
}
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
return
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return {
|
|
38
|
+
url,
|
|
39
|
+
basePath: '',
|
|
40
|
+
headers: {
|
|
41
|
+
'DD-API-KEY': apiKey,
|
|
42
|
+
},
|
|
39
43
|
}
|
|
40
44
|
}
|
|
41
45
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
const { fetchAgentInfo } = require('../agent/info')
|
|
4
4
|
const log = require('../log')
|
|
5
|
-
const { stripTrailingSlashes } = require('./path')
|
|
5
|
+
const { joinAgentURLPath, stripTrailingSlashes } = require('./path')
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Receiver discovery contract
|
|
@@ -25,13 +25,13 @@ const { stripTrailingSlashes } = require('./path')
|
|
|
25
25
|
* serverless-init image or deployment type.
|
|
26
26
|
*
|
|
27
27
|
* This module only discovers a candidate route. A missing or unresponsive
|
|
28
|
-
* `/info` endpoint returns an error
|
|
29
|
-
*
|
|
28
|
+
* `/info` endpoint returns an error after the request's bounded retry policy.
|
|
29
|
+
* Callers can disable retries to make discovery a single attempt. A valid
|
|
30
|
+
* response without a compatible path returns no route.
|
|
30
31
|
* Discovery sends no events, so the caller can safely select direct intake
|
|
31
32
|
* after either result. The caller also owns later delivery failures. Exposure
|
|
32
|
-
* delivery
|
|
33
|
-
*
|
|
34
|
-
* for future batches.
|
|
33
|
+
* delivery decides whether a failed batch can be replayed and which route
|
|
34
|
+
* future batches use.
|
|
35
35
|
*
|
|
36
36
|
* Reference implementations:
|
|
37
37
|
*
|
|
@@ -62,17 +62,17 @@ function selectEVPProxyPath (agentInfo, { supportedPaths, requiredHeaders = [] }
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
const allowedHeaders = agentInfo.evp_proxy_allowed_headers
|
|
65
|
-
if (allowedHeaders !== undefined) {
|
|
65
|
+
if (requiredHeaders.length > 0 || allowedHeaders !== undefined) {
|
|
66
66
|
if (!Array.isArray(allowedHeaders)) return
|
|
67
67
|
|
|
68
68
|
const normalizedHeaders = new Set()
|
|
69
69
|
for (const header of allowedHeaders) {
|
|
70
70
|
if (typeof header === 'string') {
|
|
71
|
-
normalizedHeaders.add(header.toLowerCase())
|
|
71
|
+
normalizedHeaders.add(header.trim().toLowerCase())
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
if (requiredHeaders.some(header => !normalizedHeaders.has(header.toLowerCase()))) {
|
|
75
|
+
if (requiredHeaders.some(header => !normalizedHeaders.has(header.trim().toLowerCase()))) {
|
|
76
76
|
return
|
|
77
77
|
}
|
|
78
78
|
}
|
|
@@ -105,8 +105,8 @@ function selectEVPProxyPath (agentInfo, { supportedPaths, requiredHeaders = [] }
|
|
|
105
105
|
* @param {string[]} options.supportedPaths - Supported paths in preference order
|
|
106
106
|
* @param {string[]} [options.requiredHeaders] - Headers that the proxy must forward unchanged to intake. Each
|
|
107
107
|
* header must appear in `evp_proxy_allowed_headers`. Do not include routing headers that the Agent consumes.
|
|
108
|
+
* @param {boolean} [options.retry] - Set false to disable the request's default bounded retries
|
|
108
109
|
* @param {(error: Error|null, route?: {url: URL, basePath: string}) => void} callback - Result callback
|
|
109
|
-
* @returns {void}
|
|
110
110
|
*/
|
|
111
111
|
function discoverEVPProxy (url, options, callback) {
|
|
112
112
|
fetchAgentInfo(url, (error, agentInfo) => {
|
|
@@ -122,7 +122,10 @@ function discoverEVPProxy (url, options, callback) {
|
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
log.debug('EVP proxy route %s discovered through the configured local receiver', basePath)
|
|
125
|
-
callback(null, { url, basePath })
|
|
125
|
+
callback(null, { url, basePath: joinAgentURLPath(url, basePath) })
|
|
126
|
+
}, {
|
|
127
|
+
path: joinAgentURLPath(url, '/info'),
|
|
128
|
+
retry: options.retry,
|
|
126
129
|
})
|
|
127
130
|
}
|
|
128
131
|
|
|
@@ -4,7 +4,6 @@ const LEADING_SLASHES = /^\/+/
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @param {string} value
|
|
7
|
-
* @returns {string}
|
|
8
7
|
*/
|
|
9
8
|
function stripTrailingSlashes (value) {
|
|
10
9
|
let end = value.length
|
|
@@ -17,15 +16,28 @@ function stripTrailingSlashes (value) {
|
|
|
17
16
|
*
|
|
18
17
|
* This utility does not perform EVP proxy discovery.
|
|
19
18
|
*
|
|
20
|
-
* @param {string}
|
|
21
|
-
* @param {string} endpoint - Product intake endpoint
|
|
22
|
-
* @returns {string} Joined request path
|
|
19
|
+
* @param {...string} paths - URL path components
|
|
23
20
|
*/
|
|
24
|
-
function joinEVPProxyPath (
|
|
25
|
-
|
|
26
|
-
const
|
|
21
|
+
function joinEVPProxyPath (...paths) {
|
|
22
|
+
let joined = ''
|
|
23
|
+
for (const path of paths) {
|
|
24
|
+
const normalized = stripTrailingSlashes(path).replace(LEADING_SLASHES, '')
|
|
25
|
+
if (normalized) joined += `/${normalized}`
|
|
26
|
+
}
|
|
27
27
|
|
|
28
|
-
return
|
|
28
|
+
return joined || '/'
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Joins an HTTP Agent URL path prefix with an EVP proxy path.
|
|
33
|
+
* Unix URL pathnames identify the socket itself and are not HTTP path prefixes.
|
|
34
|
+
*
|
|
35
|
+
* @param {URL} url - Configured Agent URL
|
|
36
|
+
* @param {...string} paths - EVP path components
|
|
37
|
+
*/
|
|
38
|
+
function joinAgentURLPath (url, ...paths) {
|
|
39
|
+
const prefix = url.protocol === 'http:' || url.protocol === 'https:' ? url.pathname : ''
|
|
40
|
+
return joinEVPProxyPath(prefix, ...paths)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
module.exports = { joinAgentURLPath, joinEVPProxyPath, stripTrailingSlashes }
|
|
@@ -44,7 +44,6 @@ class AgentWriter extends BaseWriter {
|
|
|
44
44
|
* Test Optimization owns its own request lifecycle tracking.
|
|
45
45
|
* @param {(error?: Error) => void} [done]
|
|
46
46
|
* @param {{ deadline?: number }} [options]
|
|
47
|
-
* @returns {void}
|
|
48
47
|
*/
|
|
49
48
|
flushDirect (done, options) {
|
|
50
49
|
if (this.#requestTracker) {
|
|
@@ -25,7 +25,6 @@ const INTAKE_PATH = '/api/v2/spans'
|
|
|
25
25
|
* reattach the TLD, e.g. 'us2.ddog-gov.com' -> 'https://browser-intake-us2-ddog-gov.com'.
|
|
26
26
|
*
|
|
27
27
|
* @param {string} [site] - The Datadog site, e.g. 'us3.datadoghq.com'. Defaults to 'datadoghq.com'.
|
|
28
|
-
* @returns {string} The intake origin, without a path.
|
|
29
28
|
*/
|
|
30
29
|
function computeIntakeUrl (site = 'datadoghq.com') {
|
|
31
30
|
const normalized = site.toLowerCase()
|
|
@@ -45,7 +45,6 @@ class FinalFlushRequestTracker {
|
|
|
45
45
|
*
|
|
46
46
|
* @param {(error?: Error) => void} [done]
|
|
47
47
|
* @param {{ deadline?: number }} [options]
|
|
48
|
-
* @returns {void}
|
|
49
48
|
*/
|
|
50
49
|
flush (done, options) {
|
|
51
50
|
if (options?.deadline === undefined) {
|
|
@@ -112,7 +111,6 @@ class FinalFlushRequestTracker {
|
|
|
112
111
|
* @param {RequestOptions} options
|
|
113
112
|
* @param {(error: Error|null, result?: string|null, statusCode?: number,
|
|
114
113
|
* headers?: import('node:http').IncomingHttpHeaders) => void} callback
|
|
115
|
-
* @returns {void}
|
|
116
114
|
*/
|
|
117
115
|
send (request, data, options, callback) {
|
|
118
116
|
const controller = new AbortController()
|
|
@@ -141,7 +139,6 @@ class FinalFlushRequestTracker {
|
|
|
141
139
|
|
|
142
140
|
/**
|
|
143
141
|
* @param {PendingRequest} pendingRequest
|
|
144
|
-
* @returns {void}
|
|
145
142
|
*/
|
|
146
143
|
#dropRequest (pendingRequest) {
|
|
147
144
|
this.#pendingRequests.delete(pendingRequest)
|
|
@@ -155,7 +152,6 @@ class FinalFlushRequestTracker {
|
|
|
155
152
|
/**
|
|
156
153
|
* @param {FinalFlush} finalFlush
|
|
157
154
|
* @param {PendingRequest} pendingRequest
|
|
158
|
-
* @returns {void}
|
|
159
155
|
*/
|
|
160
156
|
#attachRequest (finalFlush, pendingRequest) {
|
|
161
157
|
finalFlush.requests.add(pendingRequest)
|
|
@@ -165,7 +161,6 @@ class FinalFlushRequestTracker {
|
|
|
165
161
|
|
|
166
162
|
/**
|
|
167
163
|
* @param {PendingRequest} pendingRequest
|
|
168
|
-
* @returns {void}
|
|
169
164
|
*/
|
|
170
165
|
#updateRequestDeadline (pendingRequest) {
|
|
171
166
|
let deadline = 0
|
|
@@ -177,7 +172,6 @@ class FinalFlushRequestTracker {
|
|
|
177
172
|
|
|
178
173
|
/**
|
|
179
174
|
* @param {FinalFlush} finalFlush
|
|
180
|
-
* @returns {void}
|
|
181
175
|
*/
|
|
182
176
|
#finishFinalFlush (finalFlush) {
|
|
183
177
|
if (!this.#finalFlushes.has(finalFlush) || !finalFlush.writerDone || finalFlush.requests.size !== 0) return
|
|
@@ -170,6 +170,7 @@ function request (data, options, callback) {
|
|
|
170
170
|
}
|
|
171
171
|
const error = new log.NoTransmitError(errorMessage)
|
|
172
172
|
error.status = res.statusCode
|
|
173
|
+
if (options.includeErrorResponseBody) error.responseBody = responseData
|
|
173
174
|
|
|
174
175
|
complete(error, null, res.statusCode, res.headers)
|
|
175
176
|
}
|
|
@@ -5,9 +5,11 @@ const { format } = require('node:url')
|
|
|
5
5
|
|
|
6
6
|
const { urlToHttpOptions } = require('./url-to-http-options-polyfill')
|
|
7
7
|
|
|
8
|
+
const DEFAULT_SITE = 'datadoghq.com'
|
|
9
|
+
const DNS_LABEL = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/
|
|
10
|
+
|
|
8
11
|
/**
|
|
9
12
|
* @param {string} hostname
|
|
10
|
-
* @returns {boolean}
|
|
11
13
|
*/
|
|
12
14
|
function isLoopbackHost (hostname) {
|
|
13
15
|
// Gate the 127/8 prefix on an IPv4 literal so names such as 127.example.com cannot pass.
|
|
@@ -20,7 +22,6 @@ function isLoopbackHost (hostname) {
|
|
|
20
22
|
/**
|
|
21
23
|
* @param {string|undefined} protocol
|
|
22
24
|
* @param {string|undefined} hostname
|
|
23
|
-
* @returns {boolean}
|
|
24
25
|
*/
|
|
25
26
|
function canSendApiKey (protocol, hostname) {
|
|
26
27
|
return protocol === 'https:' || protocol === 'unix:' ||
|
|
@@ -33,7 +34,11 @@ function canSendApiKey (protocol, hostname) {
|
|
|
33
34
|
* @returns {URL | undefined}
|
|
34
35
|
*/
|
|
35
36
|
function createSiteUrl (site, intake) {
|
|
36
|
-
const
|
|
37
|
+
const normalizedSite = normalizeSite(site)
|
|
38
|
+
if (normalizedSite === undefined) return
|
|
39
|
+
|
|
40
|
+
const hostname = `${intake === undefined ? '' : `${intake}.`}${normalizedSite}`
|
|
41
|
+
if (hostname.length > 253) return
|
|
37
42
|
|
|
38
43
|
try {
|
|
39
44
|
const url = new URL(format({
|
|
@@ -55,6 +60,30 @@ function createSiteUrl (site, intake) {
|
|
|
55
60
|
} catch {}
|
|
56
61
|
}
|
|
57
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Normalizes a Datadog site as a DNS suffix.
|
|
65
|
+
*
|
|
66
|
+
* @param {string | undefined} site
|
|
67
|
+
* @returns {string | undefined}
|
|
68
|
+
*/
|
|
69
|
+
function normalizeSite (site) {
|
|
70
|
+
if (site === undefined) return DEFAULT_SITE
|
|
71
|
+
if (typeof site !== 'string') return
|
|
72
|
+
for (let index = 0; index < site.length; index++) {
|
|
73
|
+
if (site.charCodeAt(index) > 127) return
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const normalized = site.trim().toLowerCase() || DEFAULT_SITE
|
|
77
|
+
if (normalized.length > 253) return
|
|
78
|
+
|
|
79
|
+
const labels = normalized.split('.')
|
|
80
|
+
for (const label of labels) {
|
|
81
|
+
if (!DNS_LABEL.test(label)) return
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return normalized
|
|
85
|
+
}
|
|
86
|
+
|
|
58
87
|
/**
|
|
59
88
|
* Convert an agent/intake URL into Node http(s) request options.
|
|
60
89
|
*
|
|
@@ -82,4 +111,4 @@ function parseUrl (urlObjOrString) {
|
|
|
82
111
|
return url
|
|
83
112
|
}
|
|
84
113
|
|
|
85
|
-
module.exports = { canSendApiKey, createSiteUrl, isLoopbackHost, parseUrl }
|
|
114
|
+
module.exports = { canSendApiKey, createSiteUrl, isLoopbackHost, normalizeSite, parseUrl }
|
|
@@ -27,7 +27,6 @@ class Writer {
|
|
|
27
27
|
* Flushes queued telemetry, retaining delivery on supported serverless platforms.
|
|
28
28
|
* @param {(error?: Error) => void} [done]
|
|
29
29
|
* @param {{ deadline?: number }} [options]
|
|
30
|
-
* @returns {void}
|
|
31
30
|
*/
|
|
32
31
|
flush (done, options) {
|
|
33
32
|
if (this.#deliveryTracker) {
|
|
@@ -40,7 +39,6 @@ class Writer {
|
|
|
40
39
|
* Flushes queued telemetry without registering serverless delivery retention.
|
|
41
40
|
* @param {(error?: Error) => void} [done]
|
|
42
41
|
* @param {{ deadline?: number }} [options]
|
|
43
|
-
* @returns {void}
|
|
44
42
|
*/
|
|
45
43
|
flushDirect (done = noop, options) {
|
|
46
44
|
const count = this._encoder.count()
|
|
@@ -36,7 +36,6 @@ class Identifier {
|
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
38
|
* @param {number} [radix]
|
|
39
|
-
* @returns {string}
|
|
40
39
|
*/
|
|
41
40
|
toString (radix = 16) {
|
|
42
41
|
if (radix === 16) {
|
|
@@ -50,9 +49,6 @@ class Identifier {
|
|
|
50
49
|
return toNumberString(this.#buffer, radix)
|
|
51
50
|
}
|
|
52
51
|
|
|
53
|
-
/**
|
|
54
|
-
* @returns {bigint}
|
|
55
|
-
*/
|
|
56
52
|
toBigInt () {
|
|
57
53
|
this.#bigInt ??= Buffer.from(this.#buffer).readBigUInt64BE(0)
|
|
58
54
|
return this.#bigInt
|
|
@@ -75,9 +71,6 @@ class Identifier {
|
|
|
75
71
|
return this.#buffer.slice(-8)
|
|
76
72
|
}
|
|
77
73
|
|
|
78
|
-
/**
|
|
79
|
-
* @returns {string}
|
|
80
|
-
*/
|
|
81
74
|
toJSON () {
|
|
82
75
|
return this.toString()
|
|
83
76
|
}
|
|
@@ -88,7 +81,6 @@ class Identifier {
|
|
|
88
81
|
* only this identifier's hex representation.
|
|
89
82
|
*
|
|
90
83
|
* @param {string | undefined} traceIdHigh - 16-char hex of the upper 64 bits, or undefined
|
|
91
|
-
* @returns {string}
|
|
92
84
|
*/
|
|
93
85
|
toTraceIdHex (traceIdHigh) {
|
|
94
86
|
if (traceIdHigh && this.#buffer.length <= 8) {
|
|
@@ -99,7 +91,6 @@ class Identifier {
|
|
|
99
91
|
|
|
100
92
|
/**
|
|
101
93
|
* @param {Identifier} other
|
|
102
|
-
* @returns {boolean}
|
|
103
94
|
*/
|
|
104
95
|
equals (other) {
|
|
105
96
|
// Big-endian suffix compare: when buffers differ in length, only the
|
|
@@ -182,7 +173,6 @@ function fromString (str, raddix) {
|
|
|
182
173
|
/**
|
|
183
174
|
* @param {number[] | Uint8Array} buffer
|
|
184
175
|
* @param {number} [radix]
|
|
185
|
-
* @returns {string}
|
|
186
176
|
*/
|
|
187
177
|
function toNumberString (buffer, radix) {
|
|
188
178
|
let high = readInt32(buffer, buffer.length - 8)
|
|
@@ -233,7 +223,6 @@ function pseudoRandom () {
|
|
|
233
223
|
/**
|
|
234
224
|
* @param {number[] | Uint8Array} buffer
|
|
235
225
|
* @param {number} offset
|
|
236
|
-
* @returns {number}
|
|
237
226
|
*/
|
|
238
227
|
function readInt32 (buffer, offset) {
|
|
239
228
|
return (buffer[offset + 0] * 16_777_216) +
|