dd-trace 5.80.0 → 5.82.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE-3rdparty.csv +79 -88
- package/ext/tags.d.ts +1 -0
- package/ext/tags.js +1 -0
- package/index.d.ts +42 -35
- package/loader-hook.mjs +16 -4
- package/package.json +33 -56
- package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
- package/packages/datadog-esbuild/index.js +44 -26
- package/packages/datadog-esbuild/src/utils.js +14 -2
- package/packages/datadog-instrumentations/index.js +1 -0
- package/packages/datadog-instrumentations/src/aerospike.js +3 -2
- package/packages/datadog-instrumentations/src/ai.js +2 -2
- package/packages/datadog-instrumentations/src/amqp10.js +1 -1
- package/packages/datadog-instrumentations/src/amqplib.js +4 -4
- package/packages/datadog-instrumentations/src/anthropic.js +14 -2
- package/packages/datadog-instrumentations/src/apollo-server-core.js +2 -2
- package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
- package/packages/datadog-instrumentations/src/apollo.js +3 -2
- package/packages/datadog-instrumentations/src/avsc.js +1 -1
- package/packages/datadog-instrumentations/src/aws-sdk.js +6 -2
- package/packages/datadog-instrumentations/src/azure-event-hubs.js +4 -3
- package/packages/datadog-instrumentations/src/azure-functions.js +2 -2
- package/packages/datadog-instrumentations/src/azure-service-bus.js +3 -4
- package/packages/datadog-instrumentations/src/bluebird.js +1 -1
- package/packages/datadog-instrumentations/src/bullmq.js +11 -0
- package/packages/datadog-instrumentations/src/bunyan.js +1 -1
- package/packages/datadog-instrumentations/src/cassandra-driver.js +1 -1
- package/packages/datadog-instrumentations/src/child_process.js +2 -2
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +3 -3
- package/packages/datadog-instrumentations/src/couchbase.js +1 -1
- package/packages/datadog-instrumentations/src/crypto.js +1 -1
- package/packages/datadog-instrumentations/src/cucumber.js +12 -13
- package/packages/datadog-instrumentations/src/cypress.js +1 -1
- package/packages/datadog-instrumentations/src/dns.js +1 -1
- package/packages/datadog-instrumentations/src/elasticsearch.js +1 -1
- package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +1 -1
- package/packages/datadog-instrumentations/src/express.js +1 -1
- package/packages/datadog-instrumentations/src/find-my-way.js +6 -5
- package/packages/datadog-instrumentations/src/fs.js +1 -1
- package/packages/datadog-instrumentations/src/generic-pool.js +1 -1
- package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +137 -15
- package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -3
- package/packages/datadog-instrumentations/src/google-genai.js +120 -0
- package/packages/datadog-instrumentations/src/graphql.js +21 -1
- package/packages/datadog-instrumentations/src/grpc/client.js +1 -1
- package/packages/datadog-instrumentations/src/grpc/server.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/hooks.js +5 -1
- package/packages/datadog-instrumentations/src/helpers/instrument.js +11 -1
- package/packages/datadog-instrumentations/src/helpers/register.js +12 -5
- package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +27 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +152 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +106 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +6 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/langchain.js +237 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/loader.js +9 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +11 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +139 -0
- package/packages/datadog-instrumentations/src/helpers/router-helper.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/shared-utils.js +9 -0
- package/packages/datadog-instrumentations/src/hono.js +55 -10
- package/packages/datadog-instrumentations/src/ioredis.js +1 -1
- package/packages/datadog-instrumentations/src/iovalkey.js +1 -1
- package/packages/datadog-instrumentations/src/jest.js +2 -2
- package/packages/datadog-instrumentations/src/kafkajs.js +3 -3
- package/packages/datadog-instrumentations/src/knex.js +1 -1
- package/packages/datadog-instrumentations/src/langchain.js +3 -109
- package/packages/datadog-instrumentations/src/ldapjs.js +1 -1
- package/packages/datadog-instrumentations/src/light-my-request.js +93 -0
- package/packages/datadog-instrumentations/src/limitd-client.js +1 -1
- package/packages/datadog-instrumentations/src/lodash.js +1 -2
- package/packages/datadog-instrumentations/src/mariadb.js +1 -2
- package/packages/datadog-instrumentations/src/memcached.js +1 -1
- package/packages/datadog-instrumentations/src/mocha/main.js +1 -1
- package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
- package/packages/datadog-instrumentations/src/mongodb.js +1 -1
- package/packages/datadog-instrumentations/src/mongoose.js +1 -1
- package/packages/datadog-instrumentations/src/mquery.js +1 -1
- package/packages/datadog-instrumentations/src/mysql.js +1 -1
- package/packages/datadog-instrumentations/src/mysql2.js +2 -2
- package/packages/datadog-instrumentations/src/net.js +1 -1
- package/packages/datadog-instrumentations/src/next.js +1 -1
- package/packages/datadog-instrumentations/src/nyc.js +1 -1
- package/packages/datadog-instrumentations/src/openai.js +2 -2
- package/packages/datadog-instrumentations/src/opensearch.js +1 -1
- package/packages/datadog-instrumentations/src/oracledb.js +1 -1
- package/packages/datadog-instrumentations/src/otel-sdk-trace.js +1 -1
- package/packages/datadog-instrumentations/src/pg.js +3 -3
- package/packages/datadog-instrumentations/src/pino.js +1 -1
- package/packages/datadog-instrumentations/src/playwright.js +46 -17
- package/packages/datadog-instrumentations/src/prisma.js +52 -37
- package/packages/datadog-instrumentations/src/process.js +1 -1
- package/packages/datadog-instrumentations/src/promise-js.js +1 -1
- package/packages/datadog-instrumentations/src/promise.js +1 -1
- package/packages/datadog-instrumentations/src/protobufjs.js +1 -1
- package/packages/datadog-instrumentations/src/q.js +1 -1
- package/packages/datadog-instrumentations/src/redis.js +1 -1
- package/packages/datadog-instrumentations/src/rhea.js +1 -1
- package/packages/datadog-instrumentations/src/router.js +1 -1
- package/packages/datadog-instrumentations/src/selenium.js +4 -2
- package/packages/datadog-instrumentations/src/sequelize.js +1 -2
- package/packages/datadog-instrumentations/src/sharedb.js +1 -1
- package/packages/datadog-instrumentations/src/tedious.js +1 -1
- package/packages/datadog-instrumentations/src/undici.js +4 -4
- package/packages/datadog-instrumentations/src/url.js +1 -1
- package/packages/datadog-instrumentations/src/vitest.js +1 -1
- package/packages/datadog-instrumentations/src/vm.js +1 -1
- package/packages/datadog-instrumentations/src/when.js +1 -1
- package/packages/datadog-instrumentations/src/winston.js +1 -1
- package/packages/datadog-instrumentations/src/ws.js +38 -19
- package/packages/datadog-plugin-amqp10/src/index.js +1 -1
- package/packages/datadog-plugin-amqplib/src/index.js +1 -1
- package/packages/datadog-plugin-anthropic/src/index.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/index.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +4 -4
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
- package/packages/datadog-plugin-aws-sdk/src/util.js +3 -3
- package/packages/datadog-plugin-azure-event-hubs/src/index.js +1 -1
- package/packages/datadog-plugin-azure-event-hubs/src/producer.js +19 -5
- package/packages/datadog-plugin-azure-service-bus/src/index.js +1 -1
- package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -0
- package/packages/datadog-plugin-bullmq/src/consumer.js +60 -0
- package/packages/datadog-plugin-bullmq/src/index.js +18 -0
- package/packages/datadog-plugin-bullmq/src/producer.js +178 -0
- package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -1
- package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +23 -2
- package/packages/datadog-plugin-cypress/src/plugin.js +2 -2
- package/packages/datadog-plugin-cypress/src/support.js +73 -31
- package/packages/datadog-plugin-express/src/index.js +1 -1
- package/packages/datadog-plugin-fastify/src/index.js +1 -1
- package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +13 -3
- package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +171 -12
- package/packages/datadog-plugin-google-cloud-pubsub/src/index.js +1 -2
- package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +160 -13
- package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +217 -0
- package/packages/datadog-plugin-google-cloud-vertexai/src/index.js +1 -1
- package/packages/datadog-plugin-google-genai/src/index.js +17 -0
- package/packages/datadog-plugin-google-genai/src/tracing.js +41 -0
- package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
- package/packages/datadog-plugin-graphql/src/tools/transforms.js +5 -4
- package/packages/datadog-plugin-grpc/src/index.js +1 -1
- package/packages/datadog-plugin-http/src/client.js +2 -1
- package/packages/datadog-plugin-http/src/index.js +25 -5
- package/packages/datadog-plugin-http2/src/client.js +2 -2
- package/packages/datadog-plugin-http2/src/index.js +1 -1
- package/packages/datadog-plugin-jest/src/util.js +1 -1
- package/packages/datadog-plugin-kafkajs/src/index.js +1 -1
- package/packages/datadog-plugin-langchain/src/index.js +1 -1
- package/packages/datadog-plugin-langchain/src/tracing.js +7 -3
- package/packages/datadog-plugin-moleculer/src/index.js +1 -1
- package/packages/datadog-plugin-mongodb-core/src/index.js +6 -2
- package/packages/datadog-plugin-next/src/index.js +11 -3
- package/packages/datadog-plugin-openai/src/index.js +1 -1
- package/packages/datadog-plugin-openai/src/stream-helpers.js +30 -10
- package/packages/datadog-plugin-openai/src/tracing.js +2 -2
- package/packages/datadog-plugin-rhea/src/index.js +1 -1
- package/packages/datadog-plugin-ws/src/close.js +56 -3
- package/packages/datadog-plugin-ws/src/index.js +4 -0
- package/packages/datadog-plugin-ws/src/producer.js +39 -4
- package/packages/datadog-plugin-ws/src/receiver.js +39 -3
- package/packages/datadog-plugin-ws/src/server.js +13 -1
- package/packages/datadog-plugin-ws/src/util.js +107 -0
- package/packages/datadog-shimmer/src/shimmer.js +2 -2
- package/packages/dd-trace/src/aiguard/sdk.js +21 -13
- package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
- package/packages/dd-trace/src/appsec/graphql.js +2 -2
- package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-base-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +3 -3
- package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/untrusted-deserialization-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/weak-cipher-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +3 -2
- package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
- package/packages/dd-trace/src/appsec/iast/index.js +5 -5
- package/packages/dd-trace/src/appsec/iast/overhead-controller.js +1 -1
- package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.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-esm.mjs +1 -1
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +11 -16
- package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
- package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +4 -4
- package/packages/dd-trace/src/appsec/index.js +8 -8
- package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
- package/packages/dd-trace/src/appsec/rasp/index.js +1 -1
- package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
- package/packages/dd-trace/src/appsec/rc-products.js +10 -0
- package/packages/dd-trace/src/appsec/recommended.json +230 -3
- package/packages/dd-trace/src/appsec/remote_config.js +177 -0
- package/packages/dd-trace/src/appsec/reporter.js +3 -7
- package/packages/dd-trace/src/appsec/rule_manager.js +37 -20
- package/packages/dd-trace/src/appsec/sdk/index.js +1 -1
- package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
- package/packages/dd-trace/src/appsec/sdk/track_event.js +2 -2
- package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
- package/packages/dd-trace/src/appsec/user_tracking.js +2 -2
- package/packages/dd-trace/src/appsec/waf/index.js +17 -3
- package/packages/dd-trace/src/appsec/waf/waf_manager.js +11 -0
- package/packages/dd-trace/src/azure_metadata.js +8 -2
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +8 -6
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +1 -1
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +4 -2
- package/packages/dd-trace/src/config/remote_config.js +34 -0
- package/packages/dd-trace/src/config.js +109 -34
- package/packages/dd-trace/src/config_defaults.js +16 -3
- package/packages/dd-trace/src/constants.js +5 -0
- package/packages/dd-trace/src/crashtracking/crashtracker.js +10 -1
- package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
- package/packages/dd-trace/src/datastreams/encoding.js +23 -6
- package/packages/dd-trace/src/datastreams/index.js +1 -1
- package/packages/dd-trace/src/datastreams/pathway.js +41 -2
- package/packages/dd-trace/src/datastreams/processor.js +3 -3
- package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
- package/packages/dd-trace/src/datastreams/writer.js +2 -2
- package/packages/dd-trace/src/debugger/config.js +1 -0
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +15 -5
- package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/config.js +3 -1
- package/packages/dd-trace/src/debugger/devtools_client/index.js +37 -17
- package/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js +2 -0
- package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +24 -18
- package/packages/dd-trace/src/debugger/devtools_client/send.js +21 -11
- package/packages/dd-trace/src/debugger/devtools_client/session.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +103 -15
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/constants.js +25 -0
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +56 -25
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +64 -23
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/symbols.js +3 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +404 -0
- package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/state.js +8 -3
- package/packages/dd-trace/src/debugger/devtools_client/status.js +3 -3
- package/packages/dd-trace/src/debugger/index.js +2 -2
- package/packages/dd-trace/src/dogstatsd.js +3 -2
- package/packages/dd-trace/src/encode/0.4.js +1 -1
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +2 -2
- package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
- package/packages/dd-trace/src/encode/span-stats.js +13 -2
- package/packages/dd-trace/src/exporter.js +2 -2
- package/packages/dd-trace/src/exporters/agent/index.js +1 -1
- package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +1 -1
- package/packages/dd-trace/src/exporters/common/request.js +2 -2
- package/packages/dd-trace/src/exporters/common/writer.js +1 -1
- package/packages/dd-trace/src/exporters/span-stats/index.js +1 -1
- package/packages/dd-trace/src/external-logger/src/index.js +1 -2
- package/packages/dd-trace/src/flare/index.js +1 -1
- package/packages/dd-trace/src/guardrails/index.js +6 -3
- package/packages/dd-trace/src/histogram.js +1 -1
- package/packages/dd-trace/src/id.js +60 -0
- package/packages/dd-trace/src/index.js +1 -1
- package/packages/dd-trace/src/lambda/handler.js +4 -4
- package/packages/dd-trace/src/lambda/index.js +1 -1
- package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
- package/packages/dd-trace/src/lambda/runtime/ritm.js +2 -2
- package/packages/dd-trace/src/llmobs/constants/tags.js +8 -1
- package/packages/dd-trace/src/llmobs/index.js +8 -9
- package/packages/dd-trace/src/llmobs/plugins/ai/index.js +38 -7
- package/packages/dd-trace/src/llmobs/plugins/ai/util.js +30 -9
- package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +3 -3
- package/packages/dd-trace/src/llmobs/plugins/genai/index.js +104 -0
- package/packages/dd-trace/src/llmobs/plugins/genai/util.js +486 -0
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/llm.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +2 -2
- package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +16 -0
- package/packages/dd-trace/src/llmobs/plugins/{openai.js → openai/index.js} +63 -6
- package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +126 -0
- package/packages/dd-trace/src/llmobs/plugins/vertexai.js +1 -1
- package/packages/dd-trace/src/llmobs/sdk.js +20 -22
- package/packages/dd-trace/src/llmobs/span_processor.js +15 -14
- package/packages/dd-trace/src/llmobs/tagger.js +4 -0
- package/packages/dd-trace/src/llmobs/telemetry.js +3 -4
- package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
- package/packages/dd-trace/src/llmobs/writers/spans.js +1 -2
- package/packages/dd-trace/src/log/index.js +1 -1
- package/packages/dd-trace/src/noop/proxy.js +2 -2
- package/packages/dd-trace/src/noop/span.js +1 -1
- package/packages/dd-trace/src/openfeature/index.js +2 -2
- package/packages/dd-trace/src/openfeature/noop.js +14 -14
- package/packages/dd-trace/src/openfeature/remote_config.js +31 -0
- package/packages/dd-trace/src/openfeature/writers/base.js +5 -5
- package/packages/dd-trace/src/openfeature/writers/exposures.js +9 -9
- package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
- package/packages/dd-trace/src/opentelemetry/logs/index.js +2 -2
- package/packages/dd-trace/src/opentelemetry/logs/logger.js +3 -2
- package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +4 -4
- package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +5 -3
- package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +17 -16
- package/packages/dd-trace/src/opentelemetry/metrics/constants.js +34 -0
- package/packages/dd-trace/src/opentelemetry/metrics/index.js +81 -0
- package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +225 -0
- package/packages/dd-trace/src/opentelemetry/metrics/meter.js +171 -0
- package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +54 -0
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +62 -0
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +251 -0
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +557 -0
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +10 -18
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +47 -32
- package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +1 -1
- package/packages/dd-trace/src/opentelemetry/span.js +3 -3
- package/packages/dd-trace/src/opentelemetry/tracer.js +4 -4
- package/packages/dd-trace/src/opentelemetry/tracer_provider.js +1 -1
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +24 -8
- package/packages/dd-trace/src/opentracing/span.js +3 -3
- package/packages/dd-trace/src/opentracing/tracer.js +5 -5
- package/packages/dd-trace/src/payload-tagging/index.js +8 -4
- package/packages/dd-trace/src/plugin_manager.js +5 -3
- package/packages/dd-trace/src/plugins/apollo.js +1 -1
- package/packages/dd-trace/src/plugins/ci_plugin.js +27 -27
- package/packages/dd-trace/src/plugins/database.js +1 -1
- package/packages/dd-trace/src/plugins/index.js +6 -1
- package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
- package/packages/dd-trace/src/plugins/outbound.js +1 -1
- package/packages/dd-trace/src/plugins/tracing.js +1 -1
- package/packages/dd-trace/src/plugins/util/ci.js +1 -1
- package/packages/dd-trace/src/plugins/util/git.js +8 -8
- package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
- package/packages/dd-trace/src/plugins/util/test.js +27 -27
- package/packages/dd-trace/src/plugins/util/url.js +119 -1
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +1 -1
- package/packages/dd-trace/src/plugins/util/web.js +18 -46
- package/packages/dd-trace/src/priority_sampler.js +15 -16
- package/packages/dd-trace/src/process-tags/index.js +83 -0
- package/packages/dd-trace/src/profiling/config.js +33 -22
- package/packages/dd-trace/src/profiling/exporter_cli.js +4 -4
- package/packages/dd-trace/src/profiling/exporters/agent.js +5 -5
- package/packages/dd-trace/src/profiling/index.js +1 -1
- package/packages/dd-trace/src/profiling/libuv-size.js +1 -1
- package/packages/dd-trace/src/profiling/profiler.js +4 -5
- package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/events.js +11 -2
- package/packages/dd-trace/src/profiling/profilers/wall.js +4 -4
- package/packages/dd-trace/src/proxy.js +17 -18
- package/packages/dd-trace/src/rate_limiter.js +1 -1
- package/packages/dd-trace/src/remote_config/index.js +541 -137
- package/packages/dd-trace/src/require-package-json.js +1 -1
- package/packages/dd-trace/src/ritm.js +50 -27
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
- package/packages/dd-trace/src/serverless.js +16 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
- package/packages/dd-trace/src/span_format.js +10 -5
- package/packages/dd-trace/src/span_processor.js +8 -3
- package/packages/dd-trace/src/span_stats.js +21 -8
- package/packages/dd-trace/src/spanleak.js +1 -1
- package/packages/dd-trace/src/standalone/index.js +1 -1
- package/packages/dd-trace/src/startup-log.js +3 -3
- package/packages/dd-trace/src/supported-configurations.json +16 -0
- package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
- package/packages/dd-trace/src/telemetry/endpoints.js +8 -8
- package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
- package/packages/dd-trace/src/telemetry/telemetry.js +22 -8
- package/packages/dd-trace/src/tracer.js +3 -3
- package/packages/dd-trace/src/tracer_metadata.js +19 -15
- package/vendor/dist/@datadog/sketches-js/LICENSE +39 -0
- package/vendor/dist/@datadog/sketches-js/index.js +1 -0
- package/vendor/dist/@datadog/source-map/LICENSE +28 -0
- package/vendor/dist/@datadog/source-map/index.js +1 -0
- package/vendor/dist/@isaacs/ttlcache/LICENSE +55 -0
- package/vendor/dist/@isaacs/ttlcache/index.js +1 -0
- package/vendor/dist/@opentelemetry/core/LICENSE +201 -0
- package/vendor/dist/@opentelemetry/core/index.js +1 -0
- package/vendor/dist/@opentelemetry/resources/LICENSE +201 -0
- package/vendor/dist/@opentelemetry/resources/index.js +1 -0
- package/vendor/dist/astring/LICENSE +19 -0
- package/vendor/dist/astring/index.js +1 -0
- package/vendor/dist/crypto-randomuuid/index.js +1 -0
- package/vendor/dist/escape-string-regexp/LICENSE +9 -0
- package/vendor/dist/escape-string-regexp/index.js +1 -0
- package/vendor/dist/esquery/LICENSE +24 -0
- package/vendor/dist/esquery/index.js +1 -0
- package/vendor/dist/ignore/LICENSE +21 -0
- package/vendor/dist/ignore/index.js +1 -0
- package/vendor/dist/istanbul-lib-coverage/LICENSE +24 -0
- package/vendor/dist/istanbul-lib-coverage/index.js +1 -0
- package/vendor/dist/jest-docblock/LICENSE +21 -0
- package/vendor/dist/jest-docblock/index.js +1 -0
- package/vendor/dist/jsonpath-plus/LICENSE +22 -0
- package/vendor/dist/jsonpath-plus/index.js +1 -0
- package/vendor/dist/limiter/LICENSE +19 -0
- package/vendor/dist/limiter/index.js +1 -0
- package/vendor/dist/lodash.sortby/LICENSE +47 -0
- package/vendor/dist/lodash.sortby/index.js +1 -0
- package/vendor/dist/lru-cache/LICENSE +15 -0
- package/vendor/dist/lru-cache/index.js +1 -0
- package/vendor/dist/meriyah/LICENSE +7 -0
- package/vendor/dist/meriyah/index.js +1 -0
- package/vendor/dist/module-details-from-path/LICENSE +21 -0
- package/vendor/dist/module-details-from-path/index.js +1 -0
- package/vendor/dist/mutexify/promise/LICENSE +21 -0
- package/vendor/dist/mutexify/promise/index.js +1 -0
- package/vendor/dist/opentracing/LICENSE +201 -0
- package/vendor/dist/opentracing/binary_carrier.d.ts +11 -0
- package/vendor/dist/opentracing/constants.d.ts +61 -0
- package/vendor/dist/opentracing/examples/demo/demo.d.ts +2 -0
- package/vendor/dist/opentracing/ext/tags.d.ts +90 -0
- package/vendor/dist/opentracing/functions.d.ts +20 -0
- package/vendor/dist/opentracing/global_tracer.d.ts +14 -0
- package/vendor/dist/opentracing/index.d.ts +12 -0
- package/vendor/dist/opentracing/index.js +1 -0
- package/vendor/dist/opentracing/mock_tracer/index.d.ts +5 -0
- package/vendor/dist/opentracing/mock_tracer/mock_context.d.ts +13 -0
- package/vendor/dist/opentracing/mock_tracer/mock_report.d.ts +16 -0
- package/vendor/dist/opentracing/mock_tracer/mock_span.d.ts +50 -0
- package/vendor/dist/opentracing/mock_tracer/mock_tracer.d.ts +26 -0
- package/vendor/dist/opentracing/noop.d.ts +8 -0
- package/vendor/dist/opentracing/reference.d.ts +33 -0
- package/vendor/dist/opentracing/span.d.ts +147 -0
- package/vendor/dist/opentracing/span_context.d.ts +26 -0
- package/vendor/dist/opentracing/test/api_compatibility.d.ts +16 -0
- package/vendor/dist/opentracing/test/mocktracer_implemenation.d.ts +3 -0
- package/vendor/dist/opentracing/test/noop_implementation.d.ts +4 -0
- package/vendor/dist/opentracing/test/opentracing_api.d.ts +3 -0
- package/vendor/dist/opentracing/test/unittest.d.ts +2 -0
- package/vendor/dist/opentracing/tracer.d.ts +127 -0
- package/vendor/dist/path-to-regexp/LICENSE +21 -0
- package/vendor/dist/path-to-regexp/index.js +1 -0
- package/vendor/dist/pprof-format/LICENSE +8 -0
- package/vendor/dist/pprof-format/index.js +1 -0
- package/vendor/dist/protobufjs/LICENSE +39 -0
- package/vendor/dist/protobufjs/index.js +1 -0
- package/vendor/dist/protobufjs/minimal/LICENSE +39 -0
- package/vendor/dist/protobufjs/minimal/index.js +1 -0
- package/vendor/dist/retry/LICENSE +21 -0
- package/vendor/dist/retry/index.js +1 -0
- package/vendor/dist/rfdc/LICENSE +15 -0
- package/vendor/dist/rfdc/index.js +1 -0
- package/vendor/dist/semifies/LICENSE +201 -0
- package/vendor/dist/semifies/index.js +1 -0
- package/vendor/dist/shell-quote/LICENSE +24 -0
- package/vendor/dist/shell-quote/index.js +1 -0
- package/vendor/dist/source-map/LICENSE +28 -0
- package/vendor/dist/source-map/index.js +1 -0
- package/vendor/dist/source-map/lib/util/LICENSE +28 -0
- package/vendor/dist/source-map/lib/util/index.js +1 -0
- package/vendor/dist/source-map/mappings.wasm +0 -0
- package/vendor/dist/tlhunter-sorted-set/LICENSE +21 -0
- package/vendor/dist/tlhunter-sorted-set/index.js +1 -0
- package/vendor/dist/ttl-set/LICENSE +21 -0
- package/vendor/dist/ttl-set/index.js +1 -0
- package/packages/dd-trace/src/remote_config/manager.js +0 -368
|
@@ -5,25 +5,22 @@ const fs = require('fs')
|
|
|
5
5
|
const { URL } = require('url')
|
|
6
6
|
const log = require('../../log')
|
|
7
7
|
const { getEnvironmentVariable } = require('../../config-helper')
|
|
8
|
-
const satisfies = require('semifies')
|
|
8
|
+
const satisfies = require('../../../../../vendor/dist/semifies')
|
|
9
9
|
|
|
10
|
-
const istanbul = require('istanbul-lib-coverage')
|
|
11
|
-
const ignore = require('ignore')
|
|
10
|
+
const istanbul = require('../../../../../vendor/dist/istanbul-lib-coverage')
|
|
11
|
+
const ignore = require('../../../../../vendor/dist/ignore')
|
|
12
12
|
|
|
13
|
+
const id = require('../../id')
|
|
13
14
|
const {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
} = require('./git')
|
|
24
|
-
const { getUserProviderGitMetadata, validateGitRepositoryUrl, validateGitCommitSha } = require('./user-provided-git')
|
|
25
|
-
const { getCIMetadata } = require('./ci')
|
|
26
|
-
const { getRuntimeAndOSMetadata } = require('./env')
|
|
15
|
+
incrementCountMetric,
|
|
16
|
+
TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY,
|
|
17
|
+
TELEMETRY_GIT_SHA_MATCH
|
|
18
|
+
} = require('../../ci-visibility/telemetry')
|
|
19
|
+
|
|
20
|
+
const { SPAN_TYPE, RESOURCE_NAME, SAMPLING_PRIORITY } = require('../../../../../ext/tags')
|
|
21
|
+
const { SAMPLING_RULE_DECISION } = require('../../constants')
|
|
22
|
+
const { AUTO_KEEP } = require('../../../../../ext/priority')
|
|
23
|
+
const { version: ddTraceVersion } = require('../../../../../package.json')
|
|
27
24
|
const {
|
|
28
25
|
GIT_BRANCH,
|
|
29
26
|
GIT_COMMIT_SHA,
|
|
@@ -37,17 +34,20 @@ const {
|
|
|
37
34
|
CI_JOB_NAME,
|
|
38
35
|
GIT_COMMIT_HEAD_SHA
|
|
39
36
|
} = require('./tags')
|
|
40
|
-
const
|
|
37
|
+
const { getRuntimeAndOSMetadata } = require('./env')
|
|
38
|
+
const { getCIMetadata } = require('./ci')
|
|
39
|
+
const { getUserProviderGitMetadata, validateGitRepositoryUrl, validateGitCommitSha } = require('./user-provided-git')
|
|
41
40
|
const {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
41
|
+
getGitMetadata,
|
|
42
|
+
getGitInformationDiscrepancy,
|
|
43
|
+
getGitDiff,
|
|
44
|
+
getGitRemoteName,
|
|
45
|
+
getSourceBranch,
|
|
46
|
+
checkAndFetchBranch,
|
|
47
|
+
getLocalBranches,
|
|
48
|
+
getMergeBase,
|
|
49
|
+
getCounts
|
|
50
|
+
} = require('./git')
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
53
|
* JSDoc types for test environment metadata helpers.
|
|
@@ -813,7 +813,7 @@ function getTestEndLine (testFn, startLine = 0) {
|
|
|
813
813
|
|
|
814
814
|
/**
|
|
815
815
|
* Gets an object of test tags from an Playwright annotations array.
|
|
816
|
-
* @param {
|
|
816
|
+
* @param {object[]} annotations - Annotations from a Playwright test.
|
|
817
817
|
* @param {string} annotations[].type - Type of annotation. A string of the shape DD_TAGS[$tag_name].
|
|
818
818
|
* @param {string} annotations[].description - Value of the tag.
|
|
819
819
|
*/
|
|
@@ -2,6 +2,118 @@
|
|
|
2
2
|
|
|
3
3
|
const { URL } = require('url')
|
|
4
4
|
|
|
5
|
+
const HTTP2_HEADER_AUTHORITY = ':authority'
|
|
6
|
+
const HTTP2_HEADER_SCHEME = ':scheme'
|
|
7
|
+
const HTTP2_HEADER_PATH = ':path'
|
|
8
|
+
|
|
9
|
+
const PATH_REGEX = /^(?:[a-z]+:\/\/(?:[^?/]+))?(?<path>\/[^?]*)(?:(\?).*)?$/
|
|
10
|
+
|
|
11
|
+
const INT_SEGMENT = /^[1-9][0-9]+$/ // Integer of size at least 2 (>=10)
|
|
12
|
+
const INT_ID_SEGMENT = /^(?=.*[0-9].*)[0-9._-]{3,}$/ // Mixed string with digits and delimiters
|
|
13
|
+
const HEX_SEGMENT = /^(?=.*[0-9].*)[A-Fa-f0-9]{6,}$/ // Hexadecimal digits of size at least 6 with at least one decimal digit
|
|
14
|
+
const HEX_ID_SEGMENT = /^(?=.*[0-9].*)[A-Fa-f0-9._-]{6,}$/ // Mixed string with hex digits and delimiters
|
|
15
|
+
const STRING_SEGMENT = /^.{20,}|.*[%&'()*+,:=@].*$/ // Long string or a string containing special characters
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Extract full URL from HTTP request
|
|
19
|
+
* @param {import('http').IncomingMessage} req
|
|
20
|
+
* @returns {string} Full URL
|
|
21
|
+
*/
|
|
22
|
+
function extractURL (req) {
|
|
23
|
+
const headers = req.headers
|
|
24
|
+
|
|
25
|
+
if (req.stream) {
|
|
26
|
+
return `${headers[HTTP2_HEADER_SCHEME]}://${headers[HTTP2_HEADER_AUTHORITY]}${headers[HTTP2_HEADER_PATH]}`
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const protocol = getProtocol(req)
|
|
30
|
+
return `${protocol}://${req.headers.host}${req.originalUrl || req.url}`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function getProtocol (req) {
|
|
34
|
+
return (req.socket?.encrypted || req.connection?.encrypted) ? 'https' : 'http'
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Obfuscate query string
|
|
39
|
+
*
|
|
40
|
+
* @param {object} config
|
|
41
|
+
* @param {string} url
|
|
42
|
+
* @returns {string} obfuscated URL
|
|
43
|
+
*/
|
|
44
|
+
function obfuscateQs (config, url) {
|
|
45
|
+
const { queryStringObfuscation } = config
|
|
46
|
+
|
|
47
|
+
if (queryStringObfuscation === false) return url
|
|
48
|
+
|
|
49
|
+
const i = url.indexOf('?')
|
|
50
|
+
if (i === -1) return url
|
|
51
|
+
|
|
52
|
+
const path = url.slice(0, i)
|
|
53
|
+
if (queryStringObfuscation === true) return path
|
|
54
|
+
|
|
55
|
+
let qs = url.slice(i + 1)
|
|
56
|
+
|
|
57
|
+
qs = qs.replace(queryStringObfuscation, '<redacted>')
|
|
58
|
+
|
|
59
|
+
return `${path}?${qs}`
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Extract URL path from URL using regex pattern instead of Node.js URL API because:
|
|
64
|
+
*
|
|
65
|
+
* - Handles edge cases like malformed URLs
|
|
66
|
+
* - Works with relative paths
|
|
67
|
+
* - Cross tracers compatibility
|
|
68
|
+
*
|
|
69
|
+
* @param {string} url
|
|
70
|
+
* @returns {string} Url path
|
|
71
|
+
*/
|
|
72
|
+
function extractPathFromUrl (url) {
|
|
73
|
+
if (!url) return '/'
|
|
74
|
+
const match = url.match(PATH_REGEX)
|
|
75
|
+
|
|
76
|
+
return match?.groups?.path || '/'
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Calculate http.endpoint from URL path
|
|
81
|
+
*
|
|
82
|
+
* @param {string} url
|
|
83
|
+
* @returns {string} The normalized endpoint
|
|
84
|
+
*/
|
|
85
|
+
function calculateHttpEndpoint (url) {
|
|
86
|
+
const path = extractPathFromUrl(url)
|
|
87
|
+
|
|
88
|
+
// Split path by '/' and filter empty elements
|
|
89
|
+
const elements = path.split('/').filter(Boolean)
|
|
90
|
+
|
|
91
|
+
// Keep only first 8 non-empty elements
|
|
92
|
+
const limitedElements = elements.slice(0, 8)
|
|
93
|
+
|
|
94
|
+
// Apply regex replacements to each element respecting this order
|
|
95
|
+
const normalizedElements = limitedElements.map(element => {
|
|
96
|
+
if (INT_SEGMENT.test(element)) return '{param:int}'
|
|
97
|
+
|
|
98
|
+
if (INT_ID_SEGMENT.test(element)) return '{param:int_id}'
|
|
99
|
+
|
|
100
|
+
if (HEX_SEGMENT.test(element)) return '{param:hex}'
|
|
101
|
+
|
|
102
|
+
if (HEX_ID_SEGMENT.test(element)) return '{param:hex_id}'
|
|
103
|
+
|
|
104
|
+
if (STRING_SEGMENT.test(element)) return '{param:str}'
|
|
105
|
+
|
|
106
|
+
// No match
|
|
107
|
+
return element
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
const endpoint = normalizedElements.length > 0
|
|
111
|
+
? '/' + normalizedElements.join('/')
|
|
112
|
+
: '/'
|
|
113
|
+
|
|
114
|
+
return endpoint
|
|
115
|
+
}
|
|
116
|
+
|
|
5
117
|
function filterSensitiveInfoFromRepository (repositoryUrl) {
|
|
6
118
|
if (!repositoryUrl) {
|
|
7
119
|
return ''
|
|
@@ -25,4 +137,10 @@ function filterSensitiveInfoFromRepository (repositoryUrl) {
|
|
|
25
137
|
}
|
|
26
138
|
}
|
|
27
139
|
|
|
28
|
-
module.exports = {
|
|
140
|
+
module.exports = {
|
|
141
|
+
extractURL,
|
|
142
|
+
obfuscateQs,
|
|
143
|
+
calculateHttpEndpoint,
|
|
144
|
+
filterSensitiveInfoFromRepository,
|
|
145
|
+
extractPathFromUrl // test only
|
|
146
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const { getEnvironmentVariables } = require('../../config-helper')
|
|
3
4
|
const {
|
|
4
5
|
GIT_COMMIT_SHA,
|
|
5
6
|
GIT_BRANCH,
|
|
@@ -19,7 +20,6 @@ const {
|
|
|
19
20
|
|
|
20
21
|
const { normalizeRef } = require('./ci')
|
|
21
22
|
const { filterSensitiveInfoFromRepository } = require('./url')
|
|
22
|
-
const { getEnvironmentVariables } = require('../../config-helper')
|
|
23
23
|
|
|
24
24
|
function removeEmptyValues (tags) {
|
|
25
25
|
return Object.keys(tags).reduce((filteredTags, tag) => {
|
|
@@ -7,10 +7,11 @@ const log = require('../../log')
|
|
|
7
7
|
const tags = require('../../../../../ext/tags')
|
|
8
8
|
const types = require('../../../../../ext/types')
|
|
9
9
|
const kinds = require('../../../../../ext/kinds')
|
|
10
|
-
const urlFilter = require('./urlfilter')
|
|
11
10
|
const { ERROR_MESSAGE, ERROR_TYPE, ERROR_STACK } = require('../../constants')
|
|
12
|
-
const { createInferredProxySpan, finishInferredProxySpan } = require('./inferred_proxy')
|
|
13
11
|
const TracingPlugin = require('../tracing')
|
|
12
|
+
const urlFilter = require('./urlfilter')
|
|
13
|
+
const { createInferredProxySpan, finishInferredProxySpan } = require('./inferred_proxy')
|
|
14
|
+
const { extractURL, obfuscateQs, calculateHttpEndpoint } = require('./url')
|
|
14
15
|
|
|
15
16
|
let extractIp
|
|
16
17
|
|
|
@@ -25,16 +26,13 @@ const HTTP_METHOD = tags.HTTP_METHOD
|
|
|
25
26
|
const HTTP_URL = tags.HTTP_URL
|
|
26
27
|
const HTTP_STATUS_CODE = tags.HTTP_STATUS_CODE
|
|
27
28
|
const HTTP_ROUTE = tags.HTTP_ROUTE
|
|
29
|
+
const HTTP_ENDPOINT = tags.HTTP_ENDPOINT
|
|
28
30
|
const HTTP_REQUEST_HEADERS = tags.HTTP_REQUEST_HEADERS
|
|
29
31
|
const HTTP_RESPONSE_HEADERS = tags.HTTP_RESPONSE_HEADERS
|
|
30
32
|
const HTTP_USERAGENT = tags.HTTP_USERAGENT
|
|
31
33
|
const HTTP_CLIENT_IP = tags.HTTP_CLIENT_IP
|
|
32
34
|
const MANUAL_DROP = tags.MANUAL_DROP
|
|
33
35
|
|
|
34
|
-
const HTTP2_HEADER_AUTHORITY = ':authority'
|
|
35
|
-
const HTTP2_HEADER_SCHEME = ':scheme'
|
|
36
|
-
const HTTP2_HEADER_PATH = ':path'
|
|
37
|
-
|
|
38
36
|
const contexts = new WeakMap()
|
|
39
37
|
const ends = new WeakMap()
|
|
40
38
|
|
|
@@ -276,11 +274,14 @@ const web = {
|
|
|
276
274
|
return context.middleware.at(-1)
|
|
277
275
|
},
|
|
278
276
|
|
|
279
|
-
// Extract the parent span from the headers and start a new span as its child
|
|
280
277
|
startChildSpan (tracer, config, name, req, traceCtx) {
|
|
281
278
|
const headers = req.headers
|
|
282
279
|
const reqCtx = contexts.get(req)
|
|
283
|
-
|
|
280
|
+
const { storage } = require('../../../../datadog-core')
|
|
281
|
+
const store = storage('legacy').getStore()
|
|
282
|
+
const pubsubSpan = store?.span?._name === 'pubsub.push.receive' ? store.span : null
|
|
283
|
+
|
|
284
|
+
let childOf = pubsubSpan || tracer.extract(FORMAT_HTTP_HEADERS, headers)
|
|
284
285
|
|
|
285
286
|
// we may have headers signaling a router proxy span should be created (such as for AWS API Gateway)
|
|
286
287
|
if (tracer._config?.inferredProxyServicesEnabled) {
|
|
@@ -363,24 +364,6 @@ const web = {
|
|
|
363
364
|
finishInferredProxySpan(context)
|
|
364
365
|
},
|
|
365
366
|
|
|
366
|
-
obfuscateQs (config, url) {
|
|
367
|
-
const { queryStringObfuscation } = config
|
|
368
|
-
|
|
369
|
-
if (queryStringObfuscation === false) return url
|
|
370
|
-
|
|
371
|
-
const i = url.indexOf('?')
|
|
372
|
-
if (i === -1) return url
|
|
373
|
-
|
|
374
|
-
const path = url.slice(0, i)
|
|
375
|
-
if (queryStringObfuscation === true) return path
|
|
376
|
-
|
|
377
|
-
let qs = url.slice(i + 1)
|
|
378
|
-
|
|
379
|
-
qs = qs.replace(queryStringObfuscation, '<redacted>')
|
|
380
|
-
|
|
381
|
-
return `${path}?${qs}`
|
|
382
|
-
},
|
|
383
|
-
|
|
384
367
|
wrapWriteHead (context) {
|
|
385
368
|
const { req, res } = context
|
|
386
369
|
const writeHead = res.writeHead
|
|
@@ -475,7 +458,7 @@ function addRequestTags (context, spanType) {
|
|
|
475
458
|
const url = extractURL(req)
|
|
476
459
|
|
|
477
460
|
span.addTags({
|
|
478
|
-
[HTTP_URL]:
|
|
461
|
+
[HTTP_URL]: obfuscateQs(config, url),
|
|
479
462
|
[HTTP_METHOD]: req.method,
|
|
480
463
|
[SPAN_KIND]: SERVER,
|
|
481
464
|
[SPAN_TYPE]: spanType,
|
|
@@ -496,11 +479,17 @@ function addRequestTags (context, spanType) {
|
|
|
496
479
|
}
|
|
497
480
|
|
|
498
481
|
function addResponseTags (context) {
|
|
499
|
-
const { req, res, paths, span, inferredProxySpan } = context
|
|
482
|
+
const { req, res, paths, span, inferredProxySpan, config } = context
|
|
500
483
|
|
|
501
484
|
const route = paths.join('')
|
|
502
485
|
if (route) {
|
|
486
|
+
// Use http.route from trusted framework instrumentation
|
|
503
487
|
span.setTag(HTTP_ROUTE, route)
|
|
488
|
+
} else if (config.resourceRenamingEnabled) {
|
|
489
|
+
// Route is unavailable, compute http.endpoint instead
|
|
490
|
+
const url = span.context()._tags[HTTP_URL]
|
|
491
|
+
const endpoint = url ? calculateHttpEndpoint(url) : '/'
|
|
492
|
+
span.setTag(HTTP_ENDPOINT, endpoint)
|
|
504
493
|
}
|
|
505
494
|
|
|
506
495
|
span.addTags({
|
|
@@ -517,7 +506,7 @@ function addResourceTag (context) {
|
|
|
517
506
|
const { req, span } = context
|
|
518
507
|
const tags = span.context()._tags
|
|
519
508
|
|
|
520
|
-
if (tags[
|
|
509
|
+
if (tags[RESOURCE_NAME]) return
|
|
521
510
|
|
|
522
511
|
const resource = [req.method, tags[HTTP_ROUTE]]
|
|
523
512
|
.filter(Boolean)
|
|
@@ -545,23 +534,6 @@ function addHeaders (context) {
|
|
|
545
534
|
})
|
|
546
535
|
}
|
|
547
536
|
|
|
548
|
-
function extractURL (req) {
|
|
549
|
-
const headers = req.headers
|
|
550
|
-
|
|
551
|
-
if (req.stream) {
|
|
552
|
-
return `${headers[HTTP2_HEADER_SCHEME]}://${headers[HTTP2_HEADER_AUTHORITY]}${headers[HTTP2_HEADER_PATH]}`
|
|
553
|
-
}
|
|
554
|
-
const protocol = getProtocol(req)
|
|
555
|
-
return `${protocol}://${req.headers.host}${req.originalUrl || req.url}`
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
function getProtocol (req) {
|
|
559
|
-
if (req.socket && req.socket.encrypted) return 'https'
|
|
560
|
-
if (req.connection && req.connection.encrypted) return 'https'
|
|
561
|
-
|
|
562
|
-
return 'http'
|
|
563
|
-
}
|
|
564
|
-
|
|
565
537
|
function getHeadersToRecord (config) {
|
|
566
538
|
if (Array.isArray(config.headers)) {
|
|
567
539
|
try {
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const {
|
|
4
|
+
tags: {
|
|
5
|
+
MANUAL_KEEP,
|
|
6
|
+
MANUAL_DROP,
|
|
7
|
+
SAMPLING_PRIORITY,
|
|
8
|
+
SERVICE_NAME
|
|
9
|
+
},
|
|
10
|
+
priority: {
|
|
11
|
+
AUTO_REJECT,
|
|
12
|
+
AUTO_KEEP,
|
|
13
|
+
USER_REJECT,
|
|
14
|
+
USER_KEEP
|
|
15
|
+
}
|
|
16
|
+
} = require('../../../ext')
|
|
3
17
|
const log = require('./log')
|
|
4
18
|
const RateLimiter = require('./rate_limiter')
|
|
5
19
|
const Sampler = require('./sampler')
|
|
@@ -19,21 +33,6 @@ const {
|
|
|
19
33
|
DECISION_MAKER_KEY
|
|
20
34
|
} = require('./constants')
|
|
21
35
|
|
|
22
|
-
const {
|
|
23
|
-
tags: {
|
|
24
|
-
MANUAL_KEEP,
|
|
25
|
-
MANUAL_DROP,
|
|
26
|
-
SAMPLING_PRIORITY,
|
|
27
|
-
SERVICE_NAME
|
|
28
|
-
},
|
|
29
|
-
priority: {
|
|
30
|
-
AUTO_REJECT,
|
|
31
|
-
AUTO_KEEP,
|
|
32
|
-
USER_REJECT,
|
|
33
|
-
USER_KEEP
|
|
34
|
-
}
|
|
35
|
-
} = require('../../../ext')
|
|
36
|
-
|
|
37
36
|
const DEFAULT_KEY = 'service:,env:'
|
|
38
37
|
|
|
39
38
|
const defaultSampler = new Sampler(AUTO_KEEP)
|
|
@@ -54,7 +53,7 @@ class PrioritySampler {
|
|
|
54
53
|
/**
|
|
55
54
|
* Creates an instance of PrioritySampler.
|
|
56
55
|
*
|
|
57
|
-
* @typedef {
|
|
56
|
+
* @typedef {object} SamplingConfig
|
|
58
57
|
* @property {number} [sampleRate] - The default sample rate for traces.
|
|
59
58
|
* @property {string} [provenance] - Optional rule provenance ("customer" or "dynamic").
|
|
60
59
|
* @property {number} [rateLimit=100] - The maximum number of traces to sample per second.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const path = require('node:path')
|
|
4
|
+
|
|
5
|
+
const CURRENT_WORKING_DIRECTORY = process.cwd()
|
|
6
|
+
const ENTRYPOINT_PATH = require.main?.filename || ''
|
|
7
|
+
|
|
8
|
+
// $ cd /foo/bar && node baz/banana.js
|
|
9
|
+
// entrypoint.workdir = bar
|
|
10
|
+
// entrypoint.name = banana
|
|
11
|
+
// entrypoint.type = script
|
|
12
|
+
// entrypoint.basedir = baz
|
|
13
|
+
// package.json.name = <from package.json>
|
|
14
|
+
|
|
15
|
+
// process tags are constant throughout the lifetime of a process
|
|
16
|
+
function getProcessTags () {
|
|
17
|
+
// Lazy load pkg to avoid issues with require.main during test initialization
|
|
18
|
+
const pkg = require('../pkg')
|
|
19
|
+
|
|
20
|
+
// this list is sorted alphabetically for consistent serialization
|
|
21
|
+
const tags = [
|
|
22
|
+
// the parent directory name of the entrypoint script, e.g. /foo/bar/baz/banana.js -> baz
|
|
23
|
+
['entrypoint.basedir', ENTRYPOINT_PATH === '' ? undefined : path.basename(path.dirname(ENTRYPOINT_PATH))],
|
|
24
|
+
|
|
25
|
+
// the entrypoint script filename without the extension, e.g. /foo/bar/baz/banana.js -> banana
|
|
26
|
+
['entrypoint.name', path.basename(ENTRYPOINT_PATH, path.extname(ENTRYPOINT_PATH)) || undefined],
|
|
27
|
+
|
|
28
|
+
// always script for JavaScript applications
|
|
29
|
+
['entrypoint.type', 'script'],
|
|
30
|
+
|
|
31
|
+
// last segment of the current working directory, e.g. /foo/bar/baz/ -> baz
|
|
32
|
+
['entrypoint.workdir', path.basename(CURRENT_WORKING_DIRECTORY) || undefined],
|
|
33
|
+
|
|
34
|
+
// the .name field from the application's package.json
|
|
35
|
+
['package.json.name', pkg.name || undefined]
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
const tagsArray = []
|
|
39
|
+
const tagsObject = {}
|
|
40
|
+
|
|
41
|
+
for (const [key, value] of tags) {
|
|
42
|
+
if (value !== undefined) {
|
|
43
|
+
const sanitizedValue = sanitize(value)
|
|
44
|
+
tagsArray.push(`${key}:${sanitizedValue}`)
|
|
45
|
+
tagsObject[key] = sanitizedValue
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const serialized = tagsArray.join(',')
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
tags,
|
|
53
|
+
serialized,
|
|
54
|
+
tagsObject,
|
|
55
|
+
tagsArray
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Export the singleton
|
|
60
|
+
module.exports = getProcessTags()
|
|
61
|
+
|
|
62
|
+
module.exports.TRACING_FIELD_NAME = '_dd.tags.process'
|
|
63
|
+
module.exports.DSM_FIELD_NAME = 'ProcessTags'
|
|
64
|
+
module.exports.PROFILING_FIELD_NAME = 'process_tags'
|
|
65
|
+
module.exports.DYNAMIC_INSTRUMENTATION_FIELD_NAME = 'process_tags'
|
|
66
|
+
module.exports.TELEMETRY_FIELD_NAME = 'process_tags'
|
|
67
|
+
module.exports.REMOTE_CONFIG_FIELD_NAME = 'process_tags'
|
|
68
|
+
module.exports.CRASH_TRACKING_FIELD_NAME = 'process_tags'
|
|
69
|
+
module.exports.CLIENT_TRACE_STATISTICS_FIELD_NAME = 'ProcessTags'
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Sanitize a process tag value
|
|
73
|
+
*
|
|
74
|
+
* @param {string} value
|
|
75
|
+
* @returns {string}
|
|
76
|
+
*/
|
|
77
|
+
function sanitize (value) {
|
|
78
|
+
return String(value)
|
|
79
|
+
.toLowerCase()
|
|
80
|
+
.replaceAll(/[^a-zA-Z0-9/_.-]+/g, '_')
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
module.exports.sanitize = sanitize
|
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
const os = require('os')
|
|
4
4
|
const path = require('path')
|
|
5
5
|
const { URL, format, pathToFileURL } = require('url')
|
|
6
|
-
const satisfies = require('semifies')
|
|
6
|
+
const satisfies = require('../../../../vendor/dist/semifies')
|
|
7
|
+
const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('../plugins/util/tags')
|
|
8
|
+
const { getIsAzureFunction } = require('../serverless')
|
|
9
|
+
const { isFalse, isTrue } = require('../util')
|
|
10
|
+
const { getAzureTagsFromMetadata, getAzureAppMetadata, getAzureFunctionMetadata } = require('../azure_metadata')
|
|
11
|
+
const { getEnvironmentVariables } = require('../config-helper')
|
|
12
|
+
const defaults = require('../config_defaults')
|
|
7
13
|
const { AgentExporter } = require('./exporters/agent')
|
|
8
14
|
const { FileExporter } = require('./exporters/file')
|
|
9
15
|
const { ConsoleLogger } = require('./loggers/console')
|
|
@@ -11,12 +17,7 @@ const WallProfiler = require('./profilers/wall')
|
|
|
11
17
|
const SpaceProfiler = require('./profilers/space')
|
|
12
18
|
const EventsProfiler = require('./profilers/events')
|
|
13
19
|
const { oomExportStrategies, snapshotKinds } = require('./constants')
|
|
14
|
-
const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('../plugins/util/tags')
|
|
15
20
|
const { tagger } = require('./tagger')
|
|
16
|
-
const { isFalse, isTrue } = require('../util')
|
|
17
|
-
const { getAzureTagsFromMetadata, getAzureAppMetadata } = require('../azure_metadata')
|
|
18
|
-
const { getEnvironmentVariables } = require('../config-helper')
|
|
19
|
-
const defaults = require('../config_defaults')
|
|
20
21
|
|
|
21
22
|
class Config {
|
|
22
23
|
constructor (options = {}) {
|
|
@@ -73,7 +74,7 @@ class Config {
|
|
|
73
74
|
tagger.parse(DD_TAGS),
|
|
74
75
|
tagger.parse(options.tags),
|
|
75
76
|
tagger.parse({ env, host, service, version, functionname }),
|
|
76
|
-
getAzureTagsFromMetadata(getAzureAppMetadata())
|
|
77
|
+
getAzureTagsFromMetadata(getIsAzureFunction() ? getAzureFunctionMetadata() : getAzureAppMetadata())
|
|
77
78
|
)
|
|
78
79
|
|
|
79
80
|
// Add source code integration tags if available
|
|
@@ -178,6 +179,9 @@ class Config {
|
|
|
178
179
|
|
|
179
180
|
this.heapSamplingInterval = options.heapSamplingInterval ??
|
|
180
181
|
(Number(DD_PROFILING_HEAP_SAMPLING_INTERVAL) || 512 * 1024)
|
|
182
|
+
|
|
183
|
+
const isAtLeast24 = satisfies(process.versions.node, '>=24.0.0')
|
|
184
|
+
|
|
181
185
|
const uploadCompression0 = options.uploadCompression ?? DD_PROFILING_DEBUG_UPLOAD_COMPRESSION ?? 'on'
|
|
182
186
|
let [uploadCompression, level0] = uploadCompression0.split('-')
|
|
183
187
|
if (!['on', 'off', 'gzip', 'zstd'].includes(uploadCompression)) {
|
|
@@ -205,9 +209,12 @@ class Config {
|
|
|
205
209
|
}
|
|
206
210
|
}
|
|
207
211
|
|
|
208
|
-
// Default to gzip
|
|
212
|
+
// Default to either zstd (on Node.js 24+) or gzip (earlier Node.js). We could default to ztsd
|
|
213
|
+
// everywhere as we ship a Rust zstd compressor for older Node.js versions, but on 24+ we use
|
|
214
|
+
// the built-in one that runs asynchronously on libuv worker threads, just as gzip does. This is
|
|
215
|
+
// the least disruptive choice.
|
|
209
216
|
if (uploadCompression === 'on') {
|
|
210
|
-
uploadCompression = 'gzip'
|
|
217
|
+
uploadCompression = isAtLeast24 ? 'zstd' : 'gzip'
|
|
211
218
|
}
|
|
212
219
|
|
|
213
220
|
this.uploadCompression = { method: uploadCompression, level }
|
|
@@ -221,20 +228,24 @@ class Config {
|
|
|
221
228
|
|
|
222
229
|
const hasExecArg = (arg) => process.execArgv.includes(arg) || String(NODE_OPTIONS).includes(arg)
|
|
223
230
|
|
|
224
|
-
|
|
225
|
-
if (
|
|
226
|
-
if (
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
231
|
+
let canUseAsyncContextFrame = false
|
|
232
|
+
if (samplingContextsAvailable) {
|
|
233
|
+
if (isAtLeast24) {
|
|
234
|
+
canUseAsyncContextFrame = !hasExecArg('--no-async-context-frame')
|
|
235
|
+
} else if (satisfies(process.versions.node, '>=22.9.0')) {
|
|
236
|
+
canUseAsyncContextFrame = hasExecArg('--experimental-async-context-frame')
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
this.asyncContextFrameEnabled = isTrue(DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED ?? canUseAsyncContextFrame)
|
|
240
|
+
if (this.asyncContextFrameEnabled && !canUseAsyncContextFrame) {
|
|
241
|
+
if (!samplingContextsAvailable) {
|
|
242
|
+
turnOffAsyncContextFrame(`on ${process.platform}`)
|
|
243
|
+
} else if (isAtLeast24) {
|
|
244
|
+
turnOffAsyncContextFrame('with --no-async-context-frame')
|
|
245
|
+
} else if (satisfies(process.versions.node, '>=22.9.0')) {
|
|
246
|
+
turnOffAsyncContextFrame('without --experimental-async-context-frame')
|
|
234
247
|
} else {
|
|
235
|
-
|
|
236
|
-
// AsyncContextFrame debuted, but it would require a change in pprof-nodejs too.
|
|
237
|
-
turnOffAsyncContextFrame('but it requires at least Node.js 23')
|
|
248
|
+
turnOffAsyncContextFrame('but it requires at least Node.js 22.9.0')
|
|
238
249
|
}
|
|
239
250
|
}
|
|
240
251
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const fs = require('fs')
|
|
4
|
+
const { fileURLToPath } = require('url')
|
|
5
|
+
const { SourceMapper, heap, encode } = require('@datadog/pprof')
|
|
6
|
+
const { getEnvironmentVariable } = require('../config-helper')
|
|
3
7
|
const { AgentExporter } = require('./exporters/agent')
|
|
4
8
|
const { FileExporter } = require('./exporters/file')
|
|
5
9
|
|
|
6
|
-
const { SourceMapper, heap, encode } = require('@datadog/pprof')
|
|
7
10
|
const { ConsoleLogger } = require('./loggers/console')
|
|
8
11
|
const { tagger } = require('./tagger')
|
|
9
|
-
const fs = require('fs')
|
|
10
|
-
const { fileURLToPath } = require('url')
|
|
11
|
-
const { getEnvironmentVariable } = require('../config-helper')
|
|
12
12
|
|
|
13
13
|
const logger = new ConsoleLogger()
|
|
14
14
|
const timeoutMs = 15 * 1000
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const retry = require('retry')
|
|
4
3
|
const { request: httpRequest } = require('http')
|
|
5
4
|
const { request: httpsRequest } = require('https')
|
|
6
|
-
const
|
|
5
|
+
const perf = require('perf_hooks').performance
|
|
6
|
+
const { urlToHttpOptions } = require('url')
|
|
7
7
|
|
|
8
|
+
const retry = require('../../../../../vendor/dist/retry')
|
|
8
9
|
// TODO: avoid using dd-trace internals. Make this a separate module?
|
|
9
10
|
const docker = require('../../exporters/common/docker')
|
|
10
11
|
const FormData = require('../../exporters/common/form-data')
|
|
11
12
|
const { storage } = require('../../../../datadog-core')
|
|
12
13
|
const version = require('../../../../../package.json').version
|
|
13
|
-
const { urlToHttpOptions } = require('url')
|
|
14
|
-
const perf = require('perf_hooks').performance
|
|
15
|
-
|
|
16
14
|
const telemetryMetrics = require('../../telemetry/metrics')
|
|
15
|
+
const { EventSerializer } = require('./event_serializer')
|
|
16
|
+
|
|
17
17
|
const profilersNamespace = telemetryMetrics.manager.namespace('profilers')
|
|
18
18
|
|
|
19
19
|
const statusCodeCounters = []
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
const { getEnvironmentVariable } = require('../config-helper')
|
|
3
4
|
const { Profiler, ServerlessProfiler } = require('./profiler')
|
|
4
5
|
const WallProfiler = require('./profilers/wall')
|
|
5
6
|
const SpaceProfiler = require('./profilers/space')
|
|
6
7
|
const { AgentExporter } = require('./exporters/agent')
|
|
7
8
|
const { FileExporter } = require('./exporters/file')
|
|
8
9
|
const { ConsoleLogger } = require('./loggers/console')
|
|
9
|
-
const { getEnvironmentVariable } = require('../config-helper')
|
|
10
10
|
|
|
11
11
|
const profiler = getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME') ? new ServerlessProfiler() : new Profiler()
|
|
12
12
|
|