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
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const request = require('../../exporters/common/request')
|
|
4
|
-
const { safeJSONStringify } = require('../../exporters/common/util')
|
|
5
4
|
|
|
6
5
|
const log = require('../../log')
|
|
6
|
+
const tracerVersion = require('../../../../../package.json').version
|
|
7
|
+
|
|
8
|
+
const EVP_ORIGIN_HEADERS = {
|
|
9
|
+
'DD-EVP-ORIGIN': 'dd-trace-js',
|
|
10
|
+
'DD-EVP-ORIGIN-VERSION': tracerVersion,
|
|
11
|
+
}
|
|
7
12
|
|
|
8
13
|
/**
|
|
9
14
|
* @typedef {object} BaseFFEWriterOptions
|
|
@@ -23,6 +28,8 @@ const log = require('../../log')
|
|
|
23
28
|
* @property {string} endpoint - Route endpoint
|
|
24
29
|
* @property {object} headers - Route-specific headers
|
|
25
30
|
* @property {import('node:https').Agent} [agent] - Optional HTTPS proxy agent
|
|
31
|
+
* @property {Function} [onFallback] - Called after direct fallback becomes active
|
|
32
|
+
* @property {Function} [onUnavailable] - Called after the local route becomes unavailable
|
|
26
33
|
*/
|
|
27
34
|
|
|
28
35
|
/**
|
|
@@ -30,6 +37,8 @@ const log = require('../../log')
|
|
|
30
37
|
* @property {URL} url - Route base URL
|
|
31
38
|
* @property {string} endpoint - Route endpoint
|
|
32
39
|
* @property {object} requestOptions - HTTP request options
|
|
40
|
+
* @property {Function} [onFallback] - Called after direct fallback becomes active
|
|
41
|
+
* @property {Function} [onUnavailable] - Called after the local route becomes unavailable
|
|
33
42
|
*/
|
|
34
43
|
|
|
35
44
|
/**
|
|
@@ -37,22 +46,32 @@ const log = require('../../log')
|
|
|
37
46
|
*
|
|
38
47
|
* @param {Error | null} error - Request error
|
|
39
48
|
* @param {number | undefined} statusCode - HTTP response status
|
|
40
|
-
* @returns {boolean} Whether direct retry is safe
|
|
41
49
|
*/
|
|
42
|
-
function
|
|
50
|
+
function isSafeToReplay (error, statusCode) {
|
|
43
51
|
return error?.code === 'EAI_AGAIN' || error?.code === 'ECONNREFUSED' ||
|
|
44
52
|
error?.code === 'ENOENT' || error?.code === 'ENOTFOUND' ||
|
|
45
|
-
statusCode ===
|
|
53
|
+
statusCode === 404 || statusCode === 405
|
|
46
54
|
}
|
|
47
55
|
|
|
48
56
|
/**
|
|
49
|
-
* Tests whether a local route
|
|
57
|
+
* Tests whether a local route failed without an authoritative HTTP response.
|
|
50
58
|
*
|
|
51
59
|
* @param {Error | null} error - Request error
|
|
52
|
-
* @
|
|
60
|
+
* @param {number | undefined} statusCode - HTTP response status
|
|
61
|
+
*/
|
|
62
|
+
function isTransportFailure (error, statusCode) {
|
|
63
|
+
// SDK backpressure says nothing about the local receiver's health.
|
|
64
|
+
return error !== null && error !== undefined && statusCode === undefined &&
|
|
65
|
+
error.code !== 'ERR_DD_REQUEST_BUFFER_FULL'
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Tests whether an HTTP response should move only future Agentless batches.
|
|
70
|
+
*
|
|
71
|
+
* @param {number | undefined} statusCode - HTTP response status
|
|
53
72
|
*/
|
|
54
|
-
function
|
|
55
|
-
return
|
|
73
|
+
function shouldSwitchFutureRoute (statusCode) {
|
|
74
|
+
return statusCode === 403 || statusCode === 429 || statusCode >= 500 && statusCode < 600
|
|
56
75
|
}
|
|
57
76
|
|
|
58
77
|
/**
|
|
@@ -83,10 +102,11 @@ class BaseFFEWriter {
|
|
|
83
102
|
this._requestOptions = {
|
|
84
103
|
headers: {
|
|
85
104
|
...this._headers,
|
|
105
|
+
...EVP_ORIGIN_HEADERS,
|
|
86
106
|
'Content-Type': 'application/json',
|
|
87
107
|
},
|
|
88
108
|
method: 'POST',
|
|
89
|
-
retry:
|
|
109
|
+
retry: false,
|
|
90
110
|
timeout: this._timeout,
|
|
91
111
|
url: this._baseUrl,
|
|
92
112
|
path: this._endpoint,
|
|
@@ -152,11 +172,10 @@ class BaseFFEWriter {
|
|
|
152
172
|
|
|
153
173
|
const payload = this._encode(this.makePayload(events))
|
|
154
174
|
|
|
175
|
+
// Keep byte counting behind the debug callback because payloads can be several megabytes.
|
|
155
176
|
// eslint-disable-next-line eslint-rules/eslint-log-printf-style
|
|
156
|
-
log.debug(() => `${this.constructor.name} flushing
|
|
157
|
-
|
|
158
|
-
const route = this.#createActiveRoute()
|
|
159
|
-
this.#sendRequest(payload, events.length, route, this._fallbackRoute)
|
|
177
|
+
log.debug(() => `${this.constructor.name} flushing ${events.length} events (${Buffer.byteLength(payload)} bytes)`)
|
|
178
|
+
this._sendPayload(payload, events.length)
|
|
160
179
|
}
|
|
161
180
|
|
|
162
181
|
/**
|
|
@@ -189,18 +208,28 @@ class BaseFFEWriter {
|
|
|
189
208
|
/**
|
|
190
209
|
* @private
|
|
191
210
|
* @param {Array<object>} payload - Payload to encode
|
|
192
|
-
* @returns {string} JSON-stringified payload
|
|
193
211
|
*/
|
|
194
212
|
_encode (payload) {
|
|
195
213
|
return JSON.stringify(payload)
|
|
196
214
|
}
|
|
197
215
|
|
|
216
|
+
/**
|
|
217
|
+
* Sends one encoded event batch through a snapshot of the selected routes.
|
|
218
|
+
*
|
|
219
|
+
* @protected
|
|
220
|
+
* @param {string} payload - Encoded event batch
|
|
221
|
+
* @param {number} eventCount - Event count
|
|
222
|
+
*/
|
|
223
|
+
_sendPayload (payload, eventCount) {
|
|
224
|
+
const route = this.#createActiveRoute()
|
|
225
|
+
this.#sendRequest(payload, eventCount, route, this._fallbackRoute)
|
|
226
|
+
}
|
|
227
|
+
|
|
198
228
|
/**
|
|
199
229
|
* Applies the active route and an optional direct fallback route.
|
|
200
230
|
*
|
|
201
231
|
* @param {WriterRoute} route - Active route
|
|
202
232
|
* @param {WriterRoute} [fallbackRoute] - Direct fallback route
|
|
203
|
-
* @returns {void}
|
|
204
233
|
*/
|
|
205
234
|
_setRoutes (route, fallbackRoute) {
|
|
206
235
|
this.#activateRoute(this.#createRoute(route))
|
|
@@ -217,10 +246,11 @@ class BaseFFEWriter {
|
|
|
217
246
|
const requestOptions = {
|
|
218
247
|
headers: {
|
|
219
248
|
...route.headers,
|
|
249
|
+
...EVP_ORIGIN_HEADERS,
|
|
220
250
|
'Content-Type': 'application/json',
|
|
221
251
|
},
|
|
222
252
|
method: 'POST',
|
|
223
|
-
retry:
|
|
253
|
+
retry: false,
|
|
224
254
|
timeout: this._timeout,
|
|
225
255
|
url: route.url,
|
|
226
256
|
path: route.endpoint,
|
|
@@ -231,6 +261,8 @@ class BaseFFEWriter {
|
|
|
231
261
|
url: route.url,
|
|
232
262
|
endpoint: route.endpoint,
|
|
233
263
|
requestOptions,
|
|
264
|
+
onFallback: route.onFallback,
|
|
265
|
+
onUnavailable: route.onUnavailable,
|
|
234
266
|
}
|
|
235
267
|
}
|
|
236
268
|
|
|
@@ -244,6 +276,8 @@ class BaseFFEWriter {
|
|
|
244
276
|
url: this._baseUrl,
|
|
245
277
|
endpoint: this._endpoint,
|
|
246
278
|
requestOptions: this._requestOptions,
|
|
279
|
+
onFallback: this._onFallback,
|
|
280
|
+
onUnavailable: this._onUnavailable,
|
|
247
281
|
}
|
|
248
282
|
}
|
|
249
283
|
|
|
@@ -251,26 +285,26 @@ class BaseFFEWriter {
|
|
|
251
285
|
* Makes a route active for future event batches.
|
|
252
286
|
*
|
|
253
287
|
* @param {ActiveWriterRoute} route - Route state
|
|
254
|
-
* @returns {void}
|
|
255
288
|
*/
|
|
256
289
|
#activateRoute (route) {
|
|
257
290
|
this._baseUrl = route.url
|
|
258
291
|
this._endpoint = route.endpoint
|
|
259
292
|
this._requestOptions = route.requestOptions
|
|
293
|
+
this._onFallback = route.onFallback
|
|
294
|
+
this._onUnavailable = route.onUnavailable
|
|
260
295
|
}
|
|
261
296
|
|
|
262
297
|
/**
|
|
263
|
-
* Sends an encoded batch
|
|
298
|
+
* Sends an encoded batch once per route and applies safe local fallback semantics.
|
|
264
299
|
*
|
|
265
300
|
* @param {string} payload - Encoded event batch
|
|
266
301
|
* @param {number} eventCount - Event count
|
|
267
302
|
* @param {ActiveWriterRoute} route - Selected route
|
|
268
303
|
* @param {ActiveWriterRoute} [fallbackRoute] - Direct fallback route
|
|
269
|
-
* @returns {void}
|
|
270
304
|
*/
|
|
271
305
|
#sendRequest (payload, eventCount, route, fallbackRoute) {
|
|
272
306
|
request(payload, route.requestOptions, (error, response, statusCode) => {
|
|
273
|
-
if (fallbackRoute &&
|
|
307
|
+
if (fallbackRoute && isSafeToReplay(error, statusCode)) {
|
|
274
308
|
log.debug(
|
|
275
309
|
'%s switching from %s%s to direct intake after definitive rejection',
|
|
276
310
|
this.constructor.name,
|
|
@@ -279,20 +313,53 @@ class BaseFFEWriter {
|
|
|
279
313
|
)
|
|
280
314
|
this.#activateRoute(fallbackRoute)
|
|
281
315
|
this._fallbackRoute = undefined
|
|
316
|
+
route.onFallback?.()
|
|
282
317
|
this.#sendRequest(payload, eventCount, fallbackRoute)
|
|
283
318
|
return
|
|
284
319
|
}
|
|
285
320
|
|
|
286
|
-
if (fallbackRoute &&
|
|
321
|
+
if (fallbackRoute && isTransportFailure(error, statusCode)) {
|
|
287
322
|
log.debug(
|
|
288
|
-
'%s
|
|
323
|
+
'%s switching future batches from %s%s to direct intake after an ambiguous failure without replay',
|
|
289
324
|
this.constructor.name,
|
|
290
325
|
route.url.href,
|
|
291
326
|
route.endpoint
|
|
292
327
|
)
|
|
293
328
|
this.#activateRoute(fallbackRoute)
|
|
294
329
|
this._fallbackRoute = undefined
|
|
295
|
-
|
|
330
|
+
route.onFallback?.()
|
|
331
|
+
log.error('Failed to send events to %s%s: %s', route.url.href, route.endpoint, error.message)
|
|
332
|
+
return
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (fallbackRoute && shouldSwitchFutureRoute(statusCode)) {
|
|
336
|
+
log.debug(
|
|
337
|
+
'%s switching future batches from %s%s to direct intake after status %d without replay',
|
|
338
|
+
this.constructor.name,
|
|
339
|
+
route.url.href,
|
|
340
|
+
route.endpoint,
|
|
341
|
+
statusCode
|
|
342
|
+
)
|
|
343
|
+
this.#activateRoute(fallbackRoute)
|
|
344
|
+
this._fallbackRoute = undefined
|
|
345
|
+
route.onFallback?.()
|
|
346
|
+
log.warn('Events request returned status %d', statusCode)
|
|
347
|
+
return
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
if (
|
|
351
|
+
!fallbackRoute &&
|
|
352
|
+
route.onUnavailable &&
|
|
353
|
+
(isSafeToReplay(error, statusCode) ||
|
|
354
|
+
isTransportFailure(error, statusCode) ||
|
|
355
|
+
shouldSwitchFutureRoute(statusCode))
|
|
356
|
+
) {
|
|
357
|
+
route.onUnavailable()
|
|
358
|
+
if (error) {
|
|
359
|
+
log.error('Failed to send events to %s%s: %s', route.url.href, route.endpoint, error.message)
|
|
360
|
+
} else {
|
|
361
|
+
log.warn('Events request returned status %d', statusCode)
|
|
362
|
+
}
|
|
296
363
|
return
|
|
297
364
|
}
|
|
298
365
|
|
|
@@ -26,6 +26,8 @@ const PENDING_MAX_EVENTS = 1000
|
|
|
26
26
|
* @property {object} [headers] - Route-specific headers
|
|
27
27
|
* @property {import('node:https').Agent} [agent] - Optional HTTPS proxy agent
|
|
28
28
|
* @property {ExposureRoute} [fallback] - Optional direct fallback route
|
|
29
|
+
* @property {Function} [onFallback] - Called after direct fallback becomes active
|
|
30
|
+
* @property {Function} [onUnavailable] - Called after the local route becomes unavailable
|
|
29
31
|
*/
|
|
30
32
|
|
|
31
33
|
/**
|
|
@@ -114,7 +116,6 @@ class ExposuresWriter extends BaseFFEWriter {
|
|
|
114
116
|
/**
|
|
115
117
|
* @param {boolean} enabled - Whether to enable the writer
|
|
116
118
|
* @param {ExposureRoute} [route] - Selected EVP route
|
|
117
|
-
* @returns {void}
|
|
118
119
|
*/
|
|
119
120
|
setEnabled (enabled, route) {
|
|
120
121
|
if (route) {
|
|
@@ -134,7 +135,6 @@ class ExposuresWriter extends BaseFFEWriter {
|
|
|
134
135
|
* Applies caller-supplied route data without performing discovery.
|
|
135
136
|
*
|
|
136
137
|
* @param {ExposureRoute} route - Selected EVP route
|
|
137
|
-
* @returns {void}
|
|
138
138
|
*/
|
|
139
139
|
#setRoute (route) {
|
|
140
140
|
const fallbackRoute = route.fallback && {
|
|
@@ -152,6 +152,8 @@ class ExposuresWriter extends BaseFFEWriter {
|
|
|
152
152
|
endpoint: joinEVPProxyPath(route.basePath, EXPOSURES_ENDPOINT),
|
|
153
153
|
headers,
|
|
154
154
|
agent: route.agent,
|
|
155
|
+
onFallback: route.onFallback,
|
|
156
|
+
onUnavailable: route.onUnavailable,
|
|
155
157
|
}, fallbackRoute)
|
|
156
158
|
}
|
|
157
159
|
|
|
@@ -180,9 +182,6 @@ class ExposuresWriter extends BaseFFEWriter {
|
|
|
180
182
|
}
|
|
181
183
|
}
|
|
182
184
|
|
|
183
|
-
/**
|
|
184
|
-
* @returns {number} Cumulative number of exposure events dropped due to buffer overflow.
|
|
185
|
-
*/
|
|
186
185
|
get droppedEventCount () {
|
|
187
186
|
return this._droppedEvents
|
|
188
187
|
}
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
const {
|
|
4
4
|
EVP_EVENT_PLATFORM_SUBDOMAIN,
|
|
5
|
+
EVP_ORIGIN_HEADER_NAME,
|
|
6
|
+
EVP_ORIGIN_VERSION_HEADER_NAME,
|
|
5
7
|
EVP_PROXY_PATH_V2,
|
|
6
8
|
EVP_PROXY_PATH_V4,
|
|
7
9
|
EVP_SUBDOMAIN_HEADER_NAME,
|
|
@@ -10,12 +12,15 @@ const { createDirectEVPRoute } = require('../../evp_proxy/direct')
|
|
|
10
12
|
const { discoverEVPProxy } = require('../../evp_proxy/discovery')
|
|
11
13
|
const logger = require('../../log')
|
|
12
14
|
|
|
15
|
+
const ROUTE_DISCOVERY_COOLDOWN_MS = 60_000
|
|
16
|
+
const REQUIRED_LOCAL_HEADERS = [EVP_ORIGIN_HEADER_NAME, EVP_ORIGIN_VERSION_HEADER_NAME]
|
|
17
|
+
const STOP_NOOP = () => {}
|
|
18
|
+
|
|
13
19
|
let missingRouteWarningLogged = false
|
|
14
20
|
|
|
15
21
|
/**
|
|
16
22
|
* Logs the unavailable exposure-delivery warning once.
|
|
17
23
|
*
|
|
18
|
-
* @returns {void}
|
|
19
24
|
*/
|
|
20
25
|
function warnExposureDeliveryUnavailable () {
|
|
21
26
|
if (missingRouteWarningLogged) return
|
|
@@ -27,11 +32,10 @@ function warnExposureDeliveryUnavailable () {
|
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
/**
|
|
30
|
-
* Preserves
|
|
35
|
+
* Preserves the one-time EVP v2 capability check for the Remote Configuration source.
|
|
31
36
|
*
|
|
32
37
|
* @param {import('../../config')} config - Tracer configuration object
|
|
33
38
|
* @param {Function} setWriterEnabledValue - Callback to set the writer enabled state
|
|
34
|
-
* @returns {void}
|
|
35
39
|
*/
|
|
36
40
|
function setAgentStrategy (config, setWriterEnabledValue) {
|
|
37
41
|
discoverEVPProxy(config.url, {
|
|
@@ -51,6 +55,7 @@ function setAgentStrategy (config, setWriterEnabledValue) {
|
|
|
51
55
|
setWriterEnabledValue(false)
|
|
52
56
|
}
|
|
53
57
|
})
|
|
58
|
+
return STOP_NOOP
|
|
54
59
|
}
|
|
55
60
|
|
|
56
61
|
/**
|
|
@@ -61,59 +66,121 @@ function setAgentStrategy (config, setWriterEnabledValue) {
|
|
|
61
66
|
*
|
|
62
67
|
* @param {import('../../config')} config - Tracer configuration object
|
|
63
68
|
* @param {Function} setWriterEnabledValue - Callback to set the writer enabled state
|
|
64
|
-
* @returns {void}
|
|
65
69
|
*/
|
|
66
70
|
function setAgentlessStrategy (config, setWriterEnabledValue) {
|
|
67
71
|
const directRoute = createDirectEVPRoute(config, EVP_EVENT_PLATFORM_SUBDOMAIN)
|
|
72
|
+
let discovering = false
|
|
73
|
+
let recoveryTimer
|
|
74
|
+
let state = 'unknown'
|
|
75
|
+
let stopped = false
|
|
68
76
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
const stop = () => {
|
|
78
|
+
stopped = true
|
|
79
|
+
clearTimeout(recoveryTimer)
|
|
80
|
+
recoveryTimer = undefined
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const scheduleRecovery = () => {
|
|
84
|
+
if (stopped || state !== 'unavailable' || recoveryTimer !== undefined) return
|
|
85
|
+
|
|
86
|
+
recoveryTimer = setTimeout(discover, ROUTE_DISCOVERY_COOLDOWN_MS)
|
|
87
|
+
recoveryTimer.unref?.()
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const markUnavailable = () => {
|
|
91
|
+
if (stopped || state === 'direct') return
|
|
92
|
+
if (state !== 'unavailable') {
|
|
93
|
+
state = 'unavailable'
|
|
94
|
+
setWriterEnabledValue(false)
|
|
83
95
|
}
|
|
96
|
+
scheduleRecovery()
|
|
97
|
+
}
|
|
84
98
|
|
|
99
|
+
const activateDirect = () => {
|
|
100
|
+
if (stopped || state === 'direct' || directRoute === undefined) return
|
|
101
|
+
state = 'direct'
|
|
102
|
+
clearTimeout(recoveryTimer)
|
|
103
|
+
recoveryTimer = undefined
|
|
104
|
+
setWriterEnabledValue(true, directRoute)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @param {{url: URL, basePath: string}} localRoute - Discovered local route
|
|
109
|
+
*/
|
|
110
|
+
const activateLocal = localRoute => {
|
|
111
|
+
state = 'local'
|
|
112
|
+
const route = {
|
|
113
|
+
...localRoute,
|
|
114
|
+
headers: {
|
|
115
|
+
[EVP_SUBDOMAIN_HEADER_NAME]: EVP_EVENT_PLATFORM_SUBDOMAIN,
|
|
116
|
+
},
|
|
117
|
+
}
|
|
85
118
|
if (directRoute) {
|
|
119
|
+
route.fallback = directRoute
|
|
120
|
+
route.onFallback = activateDirect
|
|
121
|
+
} else {
|
|
122
|
+
route.onUnavailable = markUnavailable
|
|
123
|
+
}
|
|
124
|
+
logger.debug('FFE Writer enabled with local EVP route %s', route.basePath)
|
|
125
|
+
setWriterEnabledValue(true, route)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function discover () {
|
|
129
|
+
recoveryTimer = undefined
|
|
130
|
+
if (stopped || state === 'direct' || discovering) return
|
|
131
|
+
discovering = true
|
|
132
|
+
|
|
133
|
+
discoverEVPProxy(config.url, {
|
|
134
|
+
requiredHeaders: REQUIRED_LOCAL_HEADERS,
|
|
135
|
+
supportedPaths: [EVP_PROXY_PATH_V4, EVP_PROXY_PATH_V2],
|
|
136
|
+
// Agentless owns fallback and unavailable-state recovery; do not delay them with HTTP retries.
|
|
137
|
+
retry: false,
|
|
138
|
+
}, (error, localRoute) => {
|
|
139
|
+
discovering = false
|
|
140
|
+
if (stopped || state === 'direct') return
|
|
141
|
+
|
|
142
|
+
if (localRoute) {
|
|
143
|
+
activateLocal(localRoute)
|
|
144
|
+
return
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
if (directRoute) {
|
|
148
|
+
if (error) {
|
|
149
|
+
logger.debug('FFE Writer using direct EVP intake after local discovery failed: %s', error.message)
|
|
150
|
+
} else {
|
|
151
|
+
logger.debug('FFE Writer using direct EVP intake because no compatible local route was advertised')
|
|
152
|
+
}
|
|
153
|
+
activateDirect()
|
|
154
|
+
return
|
|
155
|
+
}
|
|
156
|
+
|
|
86
157
|
if (error) {
|
|
87
|
-
logger.debug('FFE Writer
|
|
88
|
-
} else {
|
|
89
|
-
logger.debug('FFE Writer using direct EVP intake because no compatible local route was advertised')
|
|
158
|
+
logger.debug('FFE Writer disabled - error getting local receiver info: %s', error.message)
|
|
90
159
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
160
|
+
warnExposureDeliveryUnavailable()
|
|
161
|
+
markUnavailable()
|
|
162
|
+
})
|
|
163
|
+
}
|
|
94
164
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
warnExposureDeliveryUnavailable()
|
|
99
|
-
setWriterEnabledValue(false)
|
|
100
|
-
})
|
|
165
|
+
discover()
|
|
166
|
+
return stop
|
|
101
167
|
}
|
|
102
168
|
|
|
103
169
|
/**
|
|
104
|
-
* Applies
|
|
170
|
+
* Applies one event-delivery strategy that can be shared by all Feature Flags writers.
|
|
105
171
|
*
|
|
106
172
|
* @param {import('../../config')} config - Tracer configuration object
|
|
107
173
|
* @param {Function} setWriterEnabledValue - Callback to set the writer enabled state
|
|
108
|
-
* @returns {void}
|
|
109
174
|
*/
|
|
110
|
-
function
|
|
175
|
+
function setEventDeliveryStrategy (config, setWriterEnabledValue) {
|
|
111
176
|
if (config.featureFlags?.DD_FEATURE_FLAGS_CONFIGURATION_SOURCE === 'agentless') {
|
|
112
|
-
setAgentlessStrategy(config, setWriterEnabledValue)
|
|
113
|
-
return
|
|
177
|
+
return setAgentlessStrategy(config, setWriterEnabledValue)
|
|
114
178
|
}
|
|
115
179
|
|
|
116
|
-
setAgentStrategy(config, setWriterEnabledValue)
|
|
180
|
+
return setAgentStrategy(config, setWriterEnabledValue)
|
|
117
181
|
}
|
|
118
182
|
|
|
119
|
-
module.exports = {
|
|
183
|
+
module.exports = {
|
|
184
|
+
setEventDeliveryStrategy,
|
|
185
|
+
setExposureDeliveryStrategy: setEventDeliveryStrategy,
|
|
186
|
+
}
|
|
@@ -49,7 +49,6 @@ class OtlpHttpLogExporter extends OtlpHttpExporterBase {
|
|
|
49
49
|
* @param {LogRecord[]} logRecords - Array of enriched log records to export
|
|
50
50
|
* @param {Function} resultCallback - Callback function for export result
|
|
51
51
|
*
|
|
52
|
-
* @returns {void}
|
|
53
52
|
*/
|
|
54
53
|
export (logRecords, resultCallback) {
|
|
55
54
|
if (logRecords.length === 0) {
|
|
@@ -43,7 +43,6 @@ const NANOSECONDS_PER_SECOND = 1_000_000_000n
|
|
|
43
43
|
/**
|
|
44
44
|
* Converts an OpenTelemetry HrTime to an exact OTLP uint64 decimal string.
|
|
45
45
|
* @param {import('@opentelemetry/api').HrTime} hrTime
|
|
46
|
-
* @returns {string}
|
|
47
46
|
*/
|
|
48
47
|
function encodeHrTime (hrTime) {
|
|
49
48
|
return (BigInt(hrTime[0]) * NANOSECONDS_PER_SECOND + BigInt(hrTime[1])).toString()
|
|
@@ -205,7 +204,6 @@ class OtlpTransformer extends OtlpTransformerBase {
|
|
|
205
204
|
/**
|
|
206
205
|
* Maps OpenTelemetry severity number to protobuf severity number.
|
|
207
206
|
* @param {number} severityNumber - OpenTelemetry severity number
|
|
208
|
-
* @returns {number} Protobuf severity number
|
|
209
207
|
*/
|
|
210
208
|
#mapSeverityNumber (severityNumber) {
|
|
211
209
|
const { protoSeverityNumber } = getProtobufTypes()
|
|
@@ -148,7 +148,6 @@ class OtlpStatsTransformer extends OtlpTransformerBase {
|
|
|
148
148
|
* @param {string} baseKey
|
|
149
149
|
* @param {boolean} topLevel
|
|
150
150
|
* @param {string} statusCode
|
|
151
|
-
* @returns {void}
|
|
152
151
|
*/
|
|
153
152
|
#addDistribution (distributions, sketch, startNano, endNano, baseAttributes, baseKey, topLevel, statusCode) {
|
|
154
153
|
if (!sketch || sketch.count === 0) return
|
|
@@ -237,7 +237,6 @@ class OtlpTransformer extends OtlpTransformerBase {
|
|
|
237
237
|
*
|
|
238
238
|
* @param {NumberDataPoint} dataPoint - The number data point to assign a value to
|
|
239
239
|
* @param {number} value - The value to assign
|
|
240
|
-
* @returns {void}
|
|
241
240
|
*/
|
|
242
241
|
#assignNumberValue (dataPoint, value) {
|
|
243
242
|
if (Number.isInteger(value)) {
|
|
@@ -178,9 +178,9 @@ class PeriodicMetricReader {
|
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
/**
|
|
181
|
+
* Returns the matching index, or `-1` when no batch callback matches.
|
|
181
182
|
* @param {Function} callback
|
|
182
183
|
* @param {Set} instruments
|
|
183
|
-
* @returns {number} index in #batchCallbacks, or -1
|
|
184
184
|
*/
|
|
185
185
|
#findBatchCallback (callback, instruments) {
|
|
186
186
|
return this.#batchCallbacks.findIndex(record =>
|
|
@@ -215,7 +215,6 @@ class PeriodicMetricReader {
|
|
|
215
215
|
/**
|
|
216
216
|
* Forces an immediate collection and export of all metrics.
|
|
217
217
|
* @param {(error: Error | null) => void} [done] Called after the metric export completes
|
|
218
|
-
* @returns {void}
|
|
219
218
|
*/
|
|
220
219
|
forceFlush (done) {
|
|
221
220
|
if (this.#isShutdown) {
|
|
@@ -230,7 +229,6 @@ class PeriodicMetricReader {
|
|
|
230
229
|
/**
|
|
231
230
|
* Shuts down the reader and stops periodic collection.
|
|
232
231
|
* @param {(error: Error | null) => void} [done] Called after the final export and exporter shutdown complete
|
|
233
|
-
* @returns {void}
|
|
234
232
|
*/
|
|
235
233
|
shutdown (done) {
|
|
236
234
|
if (this.#isShutdown) {
|
|
@@ -273,14 +271,12 @@ class PeriodicMetricReader {
|
|
|
273
271
|
/**
|
|
274
272
|
* @param {boolean} flushExporter Whether to flush the exporter after export
|
|
275
273
|
* @param {(error: Error | null) => void} [done] Called when the queued export completes
|
|
276
|
-
* @returns {void}
|
|
277
274
|
*/
|
|
278
275
|
#enqueueExport (flushExporter, done) {
|
|
279
276
|
this.#exportQueue.push({ flushExporter, done })
|
|
280
277
|
this.#drainExportQueue()
|
|
281
278
|
}
|
|
282
279
|
|
|
283
|
-
/** @returns {void} */
|
|
284
280
|
#drainExportQueue () {
|
|
285
281
|
if (this.#isExporting || this.#exportQueue.length === 0) return
|
|
286
282
|
|
|
@@ -318,7 +314,6 @@ class PeriodicMetricReader {
|
|
|
318
314
|
|
|
319
315
|
/**
|
|
320
316
|
* @param {Error} [exportError] Error from the final export
|
|
321
|
-
* @returns {void}
|
|
322
317
|
*/
|
|
323
318
|
#shutdownExporter (exportError) {
|
|
324
319
|
let completed = false
|
|
@@ -425,7 +420,6 @@ class MetricAggregator {
|
|
|
425
420
|
* Gets the temporality for a given metric type.
|
|
426
421
|
*
|
|
427
422
|
* @param {string} type - Metric type from METRIC_TYPES
|
|
428
|
-
* @returns {string} Temporality from TEMPORALITY
|
|
429
423
|
*/
|
|
430
424
|
#getTemporality (type) {
|
|
431
425
|
// UpDownCounter and Observable UpDownCounter always use CUMULATIVE
|
|
@@ -520,7 +514,6 @@ class MetricAggregator {
|
|
|
520
514
|
* Gets unique identifier for a given instrumentation scope.
|
|
521
515
|
*
|
|
522
516
|
* @param {InstrumentationScope} instrumentationScope - The instrumentation scope
|
|
523
|
-
* @returns {string} - The scope identifier
|
|
524
517
|
*/
|
|
525
518
|
#getScopeKey (instrumentationScope) {
|
|
526
519
|
return `${instrumentationScope.name}@${instrumentationScope.version}@${instrumentationScope.schemaUrl}`
|
|
@@ -533,7 +526,6 @@ class MetricAggregator {
|
|
|
533
526
|
* @param {string} name - The metric name
|
|
534
527
|
* @param {string} type - The metric type from METRIC_TYPES
|
|
535
528
|
* @param {string} attrKey - The attribute key
|
|
536
|
-
* @returns {string} - The metric identifier
|
|
537
529
|
*/
|
|
538
530
|
#getStateKey (scopeKey, name, type, attrKey) {
|
|
539
531
|
return `${scopeKey}:${name}:${type}:${attrKey}`
|
|
@@ -543,7 +535,6 @@ class MetricAggregator {
|
|
|
543
535
|
* Checks if a given metric type is a delta type.
|
|
544
536
|
*
|
|
545
537
|
* @param {string} type - The metric type from METRIC_TYPES
|
|
546
|
-
* @returns {boolean} - True if the metric type is a delta type
|
|
547
538
|
*/
|
|
548
539
|
#isDeltaType (type) {
|
|
549
540
|
return type === METRIC_TYPES.COUNTER ||
|
|
@@ -556,7 +547,6 @@ class MetricAggregator {
|
|
|
556
547
|
*
|
|
557
548
|
* @param {Iterable<AggregatedMetric>} metrics - The metrics to apply delta temporality to
|
|
558
549
|
* @param {Map<string, LastExportedStateValue>} lastExportedState - The last exported state of the metrics
|
|
559
|
-
* @returns {void}
|
|
560
550
|
*/
|
|
561
551
|
#applyDeltaTemporality (metrics, lastExportedState) {
|
|
562
552
|
for (const metric of metrics) {
|
|
@@ -681,7 +671,6 @@ class MetricAggregator {
|
|
|
681
671
|
* @param {number} timestamp - The timestamp of the measurement
|
|
682
672
|
* @param {string} stateKey - The state key
|
|
683
673
|
* @param {Map<string, CumulativeStateValue>} cumulativeState - The cumulative state of the metrics
|
|
684
|
-
* @returns {void}
|
|
685
674
|
*/
|
|
686
675
|
#aggregateHistogram (metric, value, attributes, attrKey, timestamp, stateKey, cumulativeState) {
|
|
687
676
|
if (!cumulativeState.has(stateKey)) {
|
|
@@ -733,7 +722,6 @@ class MetricAggregator {
|
|
|
733
722
|
|
|
734
723
|
/**
|
|
735
724
|
* @param {object} x
|
|
736
|
-
* @returns {boolean}
|
|
737
725
|
*/
|
|
738
726
|
function isObservableInstrument (x) {
|
|
739
727
|
return x instanceof ObservableInstrument
|
|
@@ -742,7 +730,6 @@ function isObservableInstrument (x) {
|
|
|
742
730
|
/**
|
|
743
731
|
* @param {Set} a
|
|
744
732
|
* @param {Set} b
|
|
745
|
-
* @returns {boolean}
|
|
746
733
|
*/
|
|
747
734
|
function setEquals (a, b) {
|
|
748
735
|
if (a.size !== b.size) return false
|
|
@@ -10,7 +10,6 @@ const { timeOrigin } = performance
|
|
|
10
10
|
* the value on the epoch while `performance.now()` keeps it monotonic, so a
|
|
11
11
|
* backward wall-clock jump can't make `timeUnixNano` precede `startTimeUnixNano`.
|
|
12
12
|
*
|
|
13
|
-
* @returns {number} Nanoseconds since the UNIX epoch
|
|
14
13
|
*/
|
|
15
14
|
function nowUnixNano () {
|
|
16
15
|
return Math.round((timeOrigin + performance.now()) * 1e6)
|