dd-trace 5.81.0 → 5.83.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 +78 -79
- package/ci/init.js +6 -6
- package/index.d.ts +159 -3
- package/loader-hook.mjs +8 -3
- package/package.json +64 -66
- package/packages/datadog-core/src/storage.js +7 -7
- package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
- package/packages/datadog-esbuild/index.js +14 -7
- package/packages/datadog-esbuild/src/utils.js +14 -2
- package/packages/datadog-instrumentations/src/aerospike.js +3 -2
- package/packages/datadog-instrumentations/src/ai.js +9 -5
- 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 +2 -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 +1 -1
- 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 +3 -3
- 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 +13 -14
- 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/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 +3 -3
- package/packages/datadog-instrumentations/src/graphql.js +2 -2
- 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 +4 -1
- package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/instrumentations.js +4 -3
- package/packages/datadog-instrumentations/src/helpers/register.js +9 -11
- package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +2 -2
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +106 -0
- package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +2 -1
- 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/http/client.js +2 -2
- 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 +37 -16
- package/packages/datadog-instrumentations/src/kafkajs.js +3 -3
- package/packages/datadog-instrumentations/src/knex.js +1 -1
- package/packages/datadog-instrumentations/src/koa.js +2 -1
- 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 +2 -2
- package/packages/datadog-instrumentations/src/mocha/worker.js +1 -1
- package/packages/datadog-instrumentations/src/mocha.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 +2 -2
- package/packages/datadog-instrumentations/src/mysql2.js +3 -3
- package/packages/datadog-instrumentations/src/net.js +14 -6
- package/packages/datadog-instrumentations/src/next.js +1 -1
- package/packages/datadog-instrumentations/src/nyc.js +2 -2
- 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 +5 -5
- package/packages/datadog-instrumentations/src/pg.js +7 -5
- package/packages/datadog-instrumentations/src/pino.js +1 -1
- package/packages/datadog-instrumentations/src/playwright.js +4 -4
- 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/selenium.js +3 -3
- 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 +15 -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 +3 -2
- 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/base.js +4 -4
- 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 +21 -7
- package/packages/datadog-plugin-azure-service-bus/src/index.js +1 -1
- package/packages/datadog-plugin-azure-service-bus/src/producer.js +6 -2
- 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-confluentinc-kafka-javascript/src/index.js +1 -1
- package/packages/datadog-plugin-cucumber/src/index.js +2 -2
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +2 -2
- package/packages/datadog-plugin-cypress/src/plugin.js +1 -1
- package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -2
- package/packages/datadog-plugin-express/src/code_origin.js +21 -15
- package/packages/datadog-plugin-express/src/index.js +1 -1
- package/packages/datadog-plugin-fastify/src/code_origin.js +17 -4
- 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 +1 -1
- package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
- 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/index.js +2 -2
- package/packages/datadog-plugin-kafkajs/src/index.js +1 -1
- package/packages/datadog-plugin-langchain/src/index.js +1 -1
- package/packages/datadog-plugin-mocha/src/index.js +2 -2
- package/packages/datadog-plugin-moleculer/src/index.js +1 -1
- package/packages/datadog-plugin-mongodb-core/src/index.js +8 -4
- 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-playwright/src/index.js +3 -3
- package/packages/datadog-plugin-rhea/src/index.js +1 -1
- package/packages/datadog-plugin-undici/src/index.js +305 -2
- package/packages/datadog-plugin-vitest/src/index.js +5 -5
- 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/index.js +19 -0
- package/packages/dd-trace/src/aiguard/sdk.js +3 -3
- 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/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.js +11 -15
- 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 +3 -3
- 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 +3 -5
- 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 -3
- 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 +15 -4
- package/packages/dd-trace/src/baggage.js +36 -11
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +5 -1
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +6 -0
- package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -3
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +3 -3
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +5 -5
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -2
- package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -4
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -4
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -2
- package/packages/dd-trace/src/{config_defaults.js → config/defaults.js} +5 -4
- package/packages/dd-trace/src/{config-helper.js → config/helper.js} +88 -15
- package/packages/dd-trace/src/{config.js → config/index.js} +115 -67
- package/packages/dd-trace/src/config/remote_config.js +202 -0
- package/packages/dd-trace/src/{config_stable.js → config/stable.js} +20 -32
- package/packages/dd-trace/src/{supported-configurations.json → config/supported-configurations.json} +5 -0
- package/packages/dd-trace/src/constants.js +5 -0
- package/packages/dd-trace/src/crashtracking/crashtracker.js +11 -2
- package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
- package/packages/dd-trace/src/datastreams/index.js +1 -1
- package/packages/dd-trace/src/datastreams/pathway.js +7 -7
- package/packages/dd-trace/src/datastreams/processor.js +3 -3
- package/packages/dd-trace/src/datastreams/writer.js +3 -3
- package/packages/dd-trace/src/debugger/config.js +1 -0
- package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/config.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -2
- package/packages/dd-trace/src/debugger/devtools_client/send.js +6 -6
- package/packages/dd-trace/src/debugger/devtools_client/session.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +5 -5
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/constants.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +2 -2
- package/packages/dd-trace/src/debugger/devtools_client/state.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/status.js +2 -2
- package/packages/dd-trace/src/debugger/index.js +84 -16
- package/packages/dd-trace/src/dogstatsd.js +5 -4
- package/packages/dd-trace/src/encode/0.4.js +3 -3
- 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 +6 -1
- package/packages/dd-trace/src/exporter.js +2 -2
- package/packages/dd-trace/src/exporters/agent/index.js +2 -4
- package/packages/dd-trace/src/exporters/agent/writer.js +9 -14
- package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +2 -2
- package/packages/dd-trace/src/exporters/common/docker.js +2 -2
- package/packages/dd-trace/src/exporters/common/request.js +3 -3
- package/packages/dd-trace/src/exporters/common/util.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 +2 -2
- package/packages/dd-trace/src/guardrails/index.js +6 -3
- package/packages/dd-trace/src/guardrails/telemetry.js +1 -1
- package/packages/dd-trace/src/id.js +1 -1
- package/packages/dd-trace/src/index.js +4 -4
- package/packages/dd-trace/src/lambda/handler.js +5 -5
- package/packages/dd-trace/src/lambda/index.js +2 -2
- package/packages/dd-trace/src/lambda/runtime/patch.js +6 -6
- package/packages/dd-trace/src/lambda/runtime/ritm.js +3 -3
- package/packages/dd-trace/src/llmobs/constants/tags.js +14 -1
- package/packages/dd-trace/src/llmobs/index.js +10 -11
- package/packages/dd-trace/src/llmobs/noop.js +2 -0
- 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/util.js +2 -2
- 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/openai/constants.js +16 -0
- package/packages/dd-trace/src/llmobs/plugins/openai/index.js +19 -5
- package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +22 -10
- package/packages/dd-trace/src/llmobs/plugins/vertexai.js +1 -1
- package/packages/dd-trace/src/llmobs/sdk.js +46 -26
- package/packages/dd-trace/src/llmobs/span_processor.js +26 -20
- package/packages/dd-trace/src/llmobs/tagger.js +175 -1
- package/packages/dd-trace/src/llmobs/telemetry.js +3 -4
- package/packages/dd-trace/src/llmobs/writers/base.js +117 -38
- package/packages/dd-trace/src/llmobs/writers/spans.js +5 -5
- package/packages/dd-trace/src/log/index.js +5 -5
- package/packages/dd-trace/src/noop/proxy.js +5 -5
- 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 +12 -13
- 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/logger.js +1 -1
- package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +4 -4
- package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +9 -8
- package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +3 -3
- package/packages/dd-trace/src/opentelemetry/metrics/meter.js +2 -2
- package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +4 -4
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +36 -11
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +2 -2
- package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +11 -10
- package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +1 -1
- package/packages/dd-trace/src/opentelemetry/span.js +2 -2
- package/packages/dd-trace/src/opentelemetry/tracer.js +51 -9
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +68 -28
- package/packages/dd-trace/src/opentracing/span.js +7 -7
- package/packages/dd-trace/src/opentracing/tracer.js +5 -5
- package/packages/dd-trace/src/payload-tagging/index.js +6 -2
- package/packages/dd-trace/src/plugin_manager.js +8 -6
- 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 +5 -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 +5 -8
- package/packages/dd-trace/src/plugins/util/git-cache.js +3 -3
- 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 +25 -25
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +41 -43
- package/packages/dd-trace/src/plugins/util/web.js +8 -5
- package/packages/dd-trace/src/priority_sampler.js +15 -16
- package/packages/dd-trace/src/process-tags/index.js +31 -29
- package/packages/dd-trace/src/profiler.js +4 -39
- package/packages/dd-trace/src/profiling/config.js +104 -50
- package/packages/dd-trace/src/profiling/exporter_cli.js +8 -8
- package/packages/dd-trace/src/profiling/exporters/agent.js +6 -6
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +9 -2
- 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 +61 -7
- package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/events.js +2 -2
- package/packages/dd-trace/src/profiling/profilers/wall.js +4 -4
- package/packages/dd-trace/src/proxy.js +43 -20
- package/packages/dd-trace/src/remote_config/capabilities.js +3 -0
- 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 +58 -31
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +3 -3
- package/packages/dd-trace/src/serverless.js +17 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
- package/packages/dd-trace/src/span_format.js +1 -1
- package/packages/dd-trace/src/span_processor.js +4 -4
- package/packages/dd-trace/src/span_stats.js +6 -4
- package/packages/dd-trace/src/standalone/index.js +1 -1
- package/packages/dd-trace/src/startup-log.js +7 -16
- package/packages/dd-trace/src/telemetry/dependencies.js +3 -3
- package/packages/dd-trace/src/telemetry/endpoints.js +75 -13
- package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
- package/packages/dd-trace/src/telemetry/send-data.js +103 -4
- package/packages/dd-trace/src/telemetry/telemetry.js +238 -114
- package/packages/dd-trace/src/tracer.js +3 -3
- package/packages/dd-trace/src/tracer_metadata.js +19 -15
- package/packages/dd-trace/src/remote_config/manager.js +0 -368
- /package/packages/dd-trace/src/{git_properties.js → config/git_properties.js} +0 -0
|
@@ -12,7 +12,7 @@ const fs = require('fs')
|
|
|
12
12
|
* @typedef { import('module').Module } Module
|
|
13
13
|
* @param {string} name
|
|
14
14
|
* @param {Module} module
|
|
15
|
-
* @returns {
|
|
15
|
+
* @returns {object} The parsed package.json
|
|
16
16
|
*/
|
|
17
17
|
function requirePackageJson (name, module) {
|
|
18
18
|
if (path.isAbsolute(name)) {
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const path = require('path')
|
|
4
|
+
const fs = require('fs')
|
|
4
5
|
const Module = require('module')
|
|
5
|
-
|
|
6
|
+
|
|
6
7
|
const dc = require('dc-polyfill')
|
|
7
|
-
const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
|
|
8
8
|
|
|
9
|
-
const
|
|
9
|
+
const parse = require('../../../vendor/dist/module-details-from-path')
|
|
10
|
+
const { isRelativeRequire } = require('../../datadog-instrumentations/src/helpers/shared-utils')
|
|
11
|
+
const { getEnvironmentVariable, getValueFromEnvSources } = require('./config/helper')
|
|
10
12
|
|
|
13
|
+
const origRequire = Module.prototype.require
|
|
11
14
|
// derived from require-in-the-middle@3 with tweaks
|
|
12
15
|
|
|
13
16
|
module.exports = Hook
|
|
@@ -60,18 +63,19 @@ function Hook (modules, options, onrequire) {
|
|
|
60
63
|
*/
|
|
61
64
|
let filename
|
|
62
65
|
try {
|
|
66
|
+
// @ts-expect-error Module._resolveFilename is not typed
|
|
63
67
|
filename = Module._resolveFilename(request, this)
|
|
64
68
|
} catch {
|
|
65
69
|
return _origRequire.apply(this, arguments)
|
|
66
70
|
}
|
|
67
|
-
|
|
68
71
|
const core = !filename.includes(path.sep)
|
|
69
72
|
let name, basedir, hooks
|
|
70
73
|
// return known patched modules immediately
|
|
71
74
|
if (cache[filename]) {
|
|
75
|
+
const externalCacheEntry = require.cache[filename]
|
|
72
76
|
// require.cache was potentially altered externally
|
|
73
|
-
if (
|
|
74
|
-
return
|
|
77
|
+
if (externalCacheEntry && externalCacheEntry.exports !== cache[filename].original) {
|
|
78
|
+
return externalCacheEntry.exports
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
return cache[filename].exports
|
|
@@ -111,38 +115,49 @@ function Hook (modules, options, onrequire) {
|
|
|
111
115
|
name = filename
|
|
112
116
|
} else {
|
|
113
117
|
const inAWSLambda = getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME') !== undefined
|
|
114
|
-
const hasLambdaHandler =
|
|
118
|
+
const hasLambdaHandler = getValueFromEnvSources('DD_LAMBDA_HANDLER') !== undefined
|
|
115
119
|
const segments = filename.split(path.sep)
|
|
116
120
|
const filenameFromNodeModule = segments.includes('node_modules')
|
|
117
121
|
// decide how to assign the stat
|
|
118
122
|
// first case will only happen when patching an AWS Lambda Handler
|
|
119
123
|
const stat = inAWSLambda && hasLambdaHandler && !filenameFromNodeModule ? { name: filename } : parse(filename)
|
|
120
|
-
if (!stat) return exports // abort if filename could not be parsed
|
|
121
|
-
name = stat.name
|
|
122
|
-
basedir = stat.basedir
|
|
123
|
-
|
|
124
|
-
hooks = moduleHooks[name]
|
|
125
|
-
if (!hooks) return exports // abort if module name isn't on whitelist
|
|
126
124
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
125
|
+
if (stat) {
|
|
126
|
+
name = stat.name
|
|
127
|
+
basedir = stat.basedir
|
|
128
|
+
|
|
129
|
+
hooks = moduleHooks[name]
|
|
130
|
+
if (!hooks) return exports // abort if module name isn't on whitelist
|
|
131
|
+
|
|
132
|
+
// @ts-expect-error Module._resolveLookupPaths is not typed
|
|
133
|
+
const paths = Module._resolveLookupPaths(name, this, true)
|
|
134
|
+
if (!paths) {
|
|
135
|
+
// abort if _resolveLookupPaths return null
|
|
136
|
+
return exports
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
let res
|
|
140
|
+
try {
|
|
141
|
+
// @ts-expect-error Module._findPath is not typed
|
|
142
|
+
res = Module._findPath(name, [basedir, ...paths])
|
|
143
|
+
} catch {
|
|
144
|
+
// case where the file specified in package.json "main" doesn't exist
|
|
145
|
+
// in this case, the file is treated as module-internal
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (!res || res !== filename) {
|
|
149
|
+
// this is a module-internal file
|
|
150
|
+
// use the module-relative path to the file, prefixed by original module name
|
|
151
|
+
name = name + path.sep + path.relative(basedir, filename)
|
|
152
|
+
}
|
|
153
|
+
} else {
|
|
154
|
+
if (isRelativeRequire(request) && moduleHooks[request]) {
|
|
155
|
+
hooks = moduleHooks[request]
|
|
156
|
+
name = request
|
|
157
|
+
basedir = findProjectRoot(filename)
|
|
158
|
+
}
|
|
141
159
|
|
|
142
|
-
|
|
143
|
-
// this is a module-internal file
|
|
144
|
-
// use the module-relative path to the file, prefixed by original module name
|
|
145
|
-
name = name + path.sep + path.relative(basedir, filename)
|
|
160
|
+
if (!hooks) return exports
|
|
146
161
|
}
|
|
147
162
|
}
|
|
148
163
|
|
|
@@ -167,6 +182,18 @@ Hook.reset = function () {
|
|
|
167
182
|
moduleHooks = Object.create(null)
|
|
168
183
|
}
|
|
169
184
|
|
|
185
|
+
function findProjectRoot (startDir) {
|
|
186
|
+
let dir = startDir
|
|
187
|
+
|
|
188
|
+
while (!fs.existsSync(path.join(dir, 'package.json'))) {
|
|
189
|
+
const parent = path.dirname(dir)
|
|
190
|
+
if (parent === dir) break
|
|
191
|
+
dir = parent
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return dir
|
|
195
|
+
}
|
|
196
|
+
|
|
170
197
|
Hook.prototype.unhook = function () {
|
|
171
198
|
for (const mod of this.modules) {
|
|
172
199
|
const hooks = (moduleHooks[mod] || []).filter(hook => hook !== this.onrequire)
|
|
@@ -5,15 +5,15 @@
|
|
|
5
5
|
const v8 = require('v8')
|
|
6
6
|
const os = require('os')
|
|
7
7
|
const process = require('process')
|
|
8
|
+
const { performance, PerformanceObserver, monitorEventLoopDelay } = require('perf_hooks')
|
|
8
9
|
const { DogStatsDClient, MetricsAggregationClient } = require('../dogstatsd')
|
|
9
10
|
const log = require('../log')
|
|
10
|
-
const {
|
|
11
|
-
const { getEnvironmentVariable } = require('../config-helper')
|
|
11
|
+
const { getValueFromEnvSources } = require('../config/helper')
|
|
12
12
|
|
|
13
13
|
const { NODE_MAJOR } = require('../../../../version')
|
|
14
14
|
// TODO: This environment variable may not be changed, since the agent expects a flush every ten seconds.
|
|
15
15
|
// It is only a variable for testing. Think about alternatives.
|
|
16
|
-
const DD_RUNTIME_METRICS_FLUSH_INTERVAL =
|
|
16
|
+
const DD_RUNTIME_METRICS_FLUSH_INTERVAL = getValueFromEnvSources('DD_RUNTIME_METRICS_FLUSH_INTERVAL') ?? '10000'
|
|
17
17
|
const INTERVAL = Number.parseInt(DD_RUNTIME_METRICS_FLUSH_INTERVAL, 10)
|
|
18
18
|
|
|
19
19
|
const eventLoopDelayResolution = 4
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { getEnvironmentVariable } = require('./config
|
|
3
|
+
const { getEnvironmentVariable, getValueFromEnvSources } = require('./config/helper')
|
|
4
|
+
const { isFalse } = require('./util')
|
|
4
5
|
|
|
5
6
|
function getIsGCPFunction () {
|
|
6
7
|
const isDeprecatedGCPFunction =
|
|
@@ -13,6 +14,15 @@ function getIsGCPFunction () {
|
|
|
13
14
|
return isDeprecatedGCPFunction || isNewerGCPFunction
|
|
14
15
|
}
|
|
15
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Enable GCP Pub/Sub PUSH subscription tracing for Cloud Run (K_SERVICE present).
|
|
19
|
+
* PUSH: GCP sends HTTP POST requests to the service with message data in headers.
|
|
20
|
+
*/
|
|
21
|
+
function enableGCPPubSubPushSubscription () {
|
|
22
|
+
const isGCPPubSubPushSubscriptionEnabled = getValueFromEnvSources('DD_TRACE_GCP_PUBSUB_PUSH_ENABLED')
|
|
23
|
+
return getEnvironmentVariable('K_SERVICE') !== undefined && !isFalse(isGCPPubSubPushSubscriptionEnabled)
|
|
24
|
+
}
|
|
25
|
+
|
|
16
26
|
function getIsAzureFunction () {
|
|
17
27
|
const isAzureFunction =
|
|
18
28
|
getEnvironmentVariable('FUNCTIONS_EXTENSION_VERSION') !== undefined &&
|
|
@@ -21,6 +31,10 @@ function getIsAzureFunction () {
|
|
|
21
31
|
return isAzureFunction
|
|
22
32
|
}
|
|
23
33
|
|
|
34
|
+
function getIsFlexConsumptionAzureFunction () {
|
|
35
|
+
return getIsAzureFunction() && getEnvironmentVariable('WEBSITE_SKU') === 'FlexConsumption'
|
|
36
|
+
}
|
|
37
|
+
|
|
24
38
|
function isInServerlessEnvironment () {
|
|
25
39
|
const inAWSLambda = getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME') !== undefined
|
|
26
40
|
const isGCPFunction = getIsGCPFunction()
|
|
@@ -32,5 +46,7 @@ function isInServerlessEnvironment () {
|
|
|
32
46
|
module.exports = {
|
|
33
47
|
getIsGCPFunction,
|
|
34
48
|
getIsAzureFunction,
|
|
49
|
+
enableGCPPubSubPushSubscription,
|
|
50
|
+
getIsFlexConsumptionAzureFunction,
|
|
35
51
|
isInServerlessEnvironment
|
|
36
52
|
}
|
|
@@ -47,6 +47,10 @@ const messaging = {
|
|
|
47
47
|
sns: {
|
|
48
48
|
opName: () => 'aws.request',
|
|
49
49
|
serviceName: awsServiceV0
|
|
50
|
+
},
|
|
51
|
+
bullmq: {
|
|
52
|
+
opName: () => 'bullmq.add',
|
|
53
|
+
serviceName: ({ tracerService }) => `${tracerService}-bullmq`
|
|
50
54
|
}
|
|
51
55
|
},
|
|
52
56
|
consumer: {
|
|
@@ -77,6 +81,10 @@ const messaging = {
|
|
|
77
81
|
sqs: {
|
|
78
82
|
opName: () => 'aws.request',
|
|
79
83
|
serviceName: awsServiceV0
|
|
84
|
+
},
|
|
85
|
+
bullmq: {
|
|
86
|
+
opName: () => 'bullmq.processJob',
|
|
87
|
+
serviceName: ({ tracerService }) => `${tracerService}-bullmq`
|
|
80
88
|
}
|
|
81
89
|
},
|
|
82
90
|
client: {
|
|
@@ -44,6 +44,10 @@ const messaging = {
|
|
|
44
44
|
sns: {
|
|
45
45
|
opName: () => 'aws.sns.send',
|
|
46
46
|
serviceName: identityService
|
|
47
|
+
},
|
|
48
|
+
bullmq: {
|
|
49
|
+
opName: () => 'bullmq.add',
|
|
50
|
+
serviceName: identityService
|
|
47
51
|
}
|
|
48
52
|
},
|
|
49
53
|
consumer: {
|
|
@@ -65,6 +69,10 @@ const messaging = {
|
|
|
65
69
|
sqs: {
|
|
66
70
|
opName: () => 'aws.sqs.process',
|
|
67
71
|
serviceName: identityService
|
|
72
|
+
},
|
|
73
|
+
bullmq: {
|
|
74
|
+
opName: () => 'bullmq.processJob',
|
|
75
|
+
serviceName: identityService
|
|
68
76
|
}
|
|
69
77
|
},
|
|
70
78
|
client: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const constants = require('./constants')
|
|
4
3
|
const tags = require('../../../ext/tags')
|
|
4
|
+
const constants = require('./constants')
|
|
5
5
|
const id = require('./id')
|
|
6
6
|
const { isError } = require('./util')
|
|
7
7
|
const { registerExtraService } = require('./service-naming/extra-services')
|
|
@@ -4,8 +4,8 @@ const log = require('./log')
|
|
|
4
4
|
const spanFormat = require('./span_format')
|
|
5
5
|
const SpanSampler = require('./span_sampler')
|
|
6
6
|
const GitMetadataTagger = require('./git_metadata_tagger')
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const processTags = require('./process-tags')
|
|
8
|
+
const { getValueFromEnvSources } = require('./config/helper')
|
|
9
9
|
|
|
10
10
|
const startedSpans = new WeakSet()
|
|
11
11
|
const finishedSpans = new WeakSet()
|
|
@@ -27,7 +27,7 @@ class SpanProcessor {
|
|
|
27
27
|
this._gitMetadataTagger = new GitMetadataTagger(config)
|
|
28
28
|
|
|
29
29
|
this._processTags = config.propagateProcessTags?.enabled
|
|
30
|
-
?
|
|
30
|
+
? processTags.serialized
|
|
31
31
|
: false
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -88,7 +88,7 @@ class SpanProcessor {
|
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
_erase (trace, active) {
|
|
91
|
-
if (
|
|
91
|
+
if (getValueFromEnvSources('DD_TRACE_EXPERIMENTAL_STATE_TRACKING') === 'true') {
|
|
92
92
|
const started = new Set()
|
|
93
93
|
const startedIds = new Set()
|
|
94
94
|
const finished = new Set()
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const os = require('os')
|
|
4
|
-
const { version } = require('./pkg')
|
|
3
|
+
const os = require('node:os')
|
|
5
4
|
const pkg = require('../../../package.json')
|
|
6
5
|
|
|
7
6
|
const { LogCollapsingLowestDenseDDSketch } = require('../../../vendor/dist/@datadog/sketches-js')
|
|
8
|
-
const { ORIGIN_KEY, TOP_LEVEL_KEY } = require('./constants')
|
|
9
7
|
const {
|
|
10
8
|
MEASURED,
|
|
11
9
|
HTTP_STATUS_CODE,
|
|
@@ -13,6 +11,9 @@ const {
|
|
|
13
11
|
HTTP_ROUTE,
|
|
14
12
|
HTTP_METHOD
|
|
15
13
|
} = require('../../../ext/tags')
|
|
14
|
+
const { ORIGIN_KEY, TOP_LEVEL_KEY } = require('./constants')
|
|
15
|
+
const { version } = require('./pkg')
|
|
16
|
+
const processTags = require('./process-tags')
|
|
16
17
|
|
|
17
18
|
const { SpanStatsExporter } = require('./exporters/span-stats')
|
|
18
19
|
|
|
@@ -176,7 +177,8 @@ class SpanStatsProcessor {
|
|
|
176
177
|
Lang: 'javascript',
|
|
177
178
|
TracerVersion: pkg.version,
|
|
178
179
|
RuntimeID: this.tags['runtime-id'],
|
|
179
|
-
Sequence: ++this.sequence
|
|
180
|
+
Sequence: ++this.sequence,
|
|
181
|
+
ProcessTags: processTags.serialized
|
|
180
182
|
})
|
|
181
183
|
}
|
|
182
184
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { channel } = require('dc-polyfill')
|
|
4
|
-
const TraceSourcePrioritySampler = require('./tracesource_priority_sampler')
|
|
5
4
|
const { USER_KEEP } = require('../../../../ext/priority')
|
|
6
5
|
const TraceState = require('../opentracing/propagation/tracestate')
|
|
7
6
|
const { APM_TRACING_ENABLED_KEY } = require('../constants')
|
|
7
|
+
const TraceSourcePrioritySampler = require('./tracesource_priority_sampler')
|
|
8
8
|
const { hasTraceSourcePropagationTag } = require('./tracesource')
|
|
9
9
|
|
|
10
10
|
const startCh = channel('dd-trace:span:start')
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { info, warn } = require('./log/writer')
|
|
4
|
-
|
|
5
3
|
const os = require('os')
|
|
6
4
|
const { inspect } = require('util')
|
|
7
|
-
const defaults = require('./config_defaults')
|
|
8
5
|
const tracerVersion = require('../../../package.json').version
|
|
6
|
+
const defaults = require('./config/defaults')
|
|
7
|
+
const { info, warn } = require('./log/writer')
|
|
9
8
|
|
|
10
9
|
const errors = {}
|
|
11
10
|
let config
|
|
@@ -15,23 +14,15 @@ let samplingRules = []
|
|
|
15
14
|
let alreadyRan = false
|
|
16
15
|
|
|
17
16
|
/**
|
|
18
|
-
* @param {{
|
|
17
|
+
* @param {{ status: number, message: string } } [agentError]
|
|
19
18
|
*/
|
|
20
|
-
function startupLog (
|
|
21
|
-
if (!config || !pluginManager) {
|
|
22
|
-
return
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
if (alreadyRan) {
|
|
19
|
+
function startupLog (agentError) {
|
|
20
|
+
if (alreadyRan || !config || !config.startupLogs || !pluginManager) {
|
|
26
21
|
return
|
|
27
22
|
}
|
|
28
23
|
|
|
29
24
|
alreadyRan = true
|
|
30
25
|
|
|
31
|
-
if (!config.startupLogs) {
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
|
|
35
26
|
const out = tracerInfo()
|
|
36
27
|
|
|
37
28
|
if (agentError) {
|
|
@@ -42,8 +33,8 @@ function startupLog ({ agentError } = {}) {
|
|
|
42
33
|
if (agentError) {
|
|
43
34
|
warn('DATADOG TRACER DIAGNOSTIC - Agent Error: ' + agentError.message)
|
|
44
35
|
errors.agentError = {
|
|
45
|
-
code: agentError.
|
|
46
|
-
message: `Agent Error
|
|
36
|
+
code: agentError.status,
|
|
37
|
+
message: `Agent Error: ${agentError.message}`
|
|
47
38
|
}
|
|
48
39
|
}
|
|
49
40
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const path = require('path')
|
|
4
|
+
const { fileURLToPath } = require('url')
|
|
5
|
+
const dc = require('dc-polyfill')
|
|
4
6
|
const parse = require('../../../../vendor/dist/module-details-from-path')
|
|
5
7
|
const requirePackageJson = require('../require-package-json')
|
|
6
|
-
const { sendData } = require('./send-data')
|
|
7
|
-
const dc = require('dc-polyfill')
|
|
8
|
-
const { fileURLToPath } = require('url')
|
|
9
8
|
const { isTrue } = require('../../src/util')
|
|
9
|
+
const { sendData } = require('./send-data')
|
|
10
10
|
|
|
11
11
|
/** @type {Set<string>} */
|
|
12
12
|
const savedDependenciesToSend = new Set()
|
|
@@ -3,60 +3,106 @@
|
|
|
3
3
|
const dc = require('dc-polyfill')
|
|
4
4
|
const { sendData } = require('./send-data')
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* RetryData is information that `telemetry.js` keeps in-memory to be merged into the next payload.
|
|
8
|
+
*
|
|
9
|
+
* @callback GetRetryData
|
|
10
|
+
* @returns {{ payload: Record<string, unknown>, reqType: string } | null}
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {import('./send-data').TelemetryConfig & {
|
|
14
|
+
* appsec?: { apiSecurity?: { endpointCollectionEnabled?: boolean, endpointCollectionMessageLimit?: number } }
|
|
15
|
+
* }} TelemetryConfig
|
|
16
|
+
*/
|
|
17
|
+
|
|
6
18
|
const fastifyRouteCh = dc.channel('apm:fastify:route:added')
|
|
7
19
|
const expressRouteCh = dc.channel('apm:express:route:added')
|
|
8
20
|
const routerRouteCh = dc.channel('apm:router:route:added')
|
|
9
21
|
|
|
22
|
+
/** @type {TelemetryConfig} */
|
|
10
23
|
let config
|
|
24
|
+
|
|
25
|
+
/** @type {import('./send-data').TelemetryApplication} */
|
|
11
26
|
let application
|
|
27
|
+
|
|
28
|
+
/** @type {import('./send-data').TelemetryHost} */
|
|
12
29
|
let host
|
|
30
|
+
|
|
31
|
+
/** @type {GetRetryData} */
|
|
13
32
|
let getRetryData
|
|
33
|
+
|
|
34
|
+
/** @type {import('./send-data').SendDataCallback} */
|
|
14
35
|
let updateRetryData
|
|
15
36
|
|
|
16
37
|
/**
|
|
17
38
|
* Keep track of endpoints that still need to be sent.
|
|
18
|
-
* Map key is `${METHOD} ${PATH}`, value is { method, path }
|
|
39
|
+
* Map key is `${METHOD} ${PATH}`, value is { method, path, operationName }
|
|
19
40
|
*/
|
|
41
|
+
/** @type {Map<string, { method: string, path: string, operationName: string }>} */
|
|
20
42
|
const pendingEndpoints = new Map()
|
|
43
|
+
|
|
44
|
+
/** @type {Set<string>} */
|
|
21
45
|
const wildcardEndpoints = new Set()
|
|
22
46
|
let flushScheduled = false
|
|
23
47
|
let isFirstPayload = true
|
|
24
48
|
|
|
49
|
+
/**
|
|
50
|
+
* @param {string} method
|
|
51
|
+
* @param {string} path
|
|
52
|
+
* @returns {string}
|
|
53
|
+
*/
|
|
25
54
|
function endpointKey (method, path) {
|
|
26
55
|
return `${method.toUpperCase()} ${path}`
|
|
27
56
|
}
|
|
28
57
|
|
|
58
|
+
/**
|
|
59
|
+
* @returns {void}
|
|
60
|
+
*/
|
|
29
61
|
function scheduleFlush () {
|
|
30
62
|
if (flushScheduled) return
|
|
31
63
|
flushScheduled = true
|
|
32
|
-
setImmediate(
|
|
64
|
+
// this used to be setImmediate() instead, but it was making the system test flaky
|
|
65
|
+
// don't ask me why
|
|
66
|
+
setTimeout(flushAndSend).unref()
|
|
33
67
|
}
|
|
34
68
|
|
|
35
|
-
|
|
69
|
+
/**
|
|
70
|
+
* @param {string} method
|
|
71
|
+
* @param {string} path
|
|
72
|
+
* @param {string} operationName
|
|
73
|
+
* @returns {void}
|
|
74
|
+
*/
|
|
75
|
+
function recordEndpoint (method, path, operationName) {
|
|
36
76
|
const key = endpointKey(method, path)
|
|
37
77
|
if (pendingEndpoints.has(key)) return
|
|
38
78
|
|
|
39
|
-
pendingEndpoints.set(key, { method: method.toUpperCase(), path })
|
|
79
|
+
pendingEndpoints.set(key, { method: method.toUpperCase(), path, operationName })
|
|
40
80
|
scheduleFlush()
|
|
41
81
|
}
|
|
42
82
|
|
|
83
|
+
/**
|
|
84
|
+
* @param {{ routeOptions?: { path?: string, method: string | string[] } } | null | undefined} routeData
|
|
85
|
+
*/
|
|
43
86
|
function onFastifyRoute (routeData) {
|
|
44
87
|
const routeOptions = routeData?.routeOptions
|
|
45
88
|
if (!routeOptions?.path) return
|
|
46
89
|
|
|
47
90
|
const methods = Array.isArray(routeOptions.method) ? routeOptions.method : [routeOptions.method]
|
|
48
91
|
for (const method of methods) {
|
|
49
|
-
recordEndpoint(method, routeOptions.path)
|
|
92
|
+
recordEndpoint(method, routeOptions.path, 'fastify.request')
|
|
50
93
|
}
|
|
51
94
|
}
|
|
52
95
|
|
|
96
|
+
/**
|
|
97
|
+
* @param {{ method?: string, path?: string }} param0
|
|
98
|
+
*/
|
|
53
99
|
function onExpressRoute ({ method, path }) {
|
|
54
100
|
if (!method || !path) return
|
|
55
101
|
|
|
56
102
|
// If wildcard already recorded for this path, skip specific methods
|
|
57
103
|
if (wildcardEndpoints.has(path)) return
|
|
58
104
|
|
|
59
|
-
recordEndpoint(method, path)
|
|
105
|
+
recordEndpoint(method, path, 'express.request')
|
|
60
106
|
|
|
61
107
|
// If this is a wildcard event, record it and mark path as wildcarded
|
|
62
108
|
if (method === '*') {
|
|
@@ -66,22 +112,28 @@ function onExpressRoute ({ method, path }) {
|
|
|
66
112
|
|
|
67
113
|
// Express automatically adds HEAD support for GET routes
|
|
68
114
|
if (method.toUpperCase() === 'GET') {
|
|
69
|
-
recordEndpoint('HEAD', path)
|
|
115
|
+
recordEndpoint('HEAD', path, 'express.request')
|
|
70
116
|
}
|
|
71
117
|
}
|
|
72
118
|
|
|
119
|
+
/**
|
|
120
|
+
* @param {{ method: string, path: string, operationName: string }[]} endpoints
|
|
121
|
+
*/
|
|
73
122
|
function buildEndpointObjects (endpoints) {
|
|
74
|
-
return endpoints.map(({ method, path }) => {
|
|
123
|
+
return endpoints.map(({ method, path, operationName }) => {
|
|
75
124
|
return {
|
|
76
125
|
type: 'REST',
|
|
77
126
|
method,
|
|
78
127
|
path,
|
|
79
|
-
operation_name:
|
|
128
|
+
operation_name: operationName,
|
|
80
129
|
resource_name: endpointKey(method, path)
|
|
81
130
|
}
|
|
82
131
|
})
|
|
83
132
|
}
|
|
84
133
|
|
|
134
|
+
/**
|
|
135
|
+
* @returns {void}
|
|
136
|
+
*/
|
|
85
137
|
function flushAndSend () {
|
|
86
138
|
flushScheduled = false
|
|
87
139
|
if (pendingEndpoints.size === 0) return
|
|
@@ -90,7 +142,8 @@ function flushAndSend () {
|
|
|
90
142
|
for (const [key, endpoint] of pendingEndpoints) {
|
|
91
143
|
batchEndpoints.push(endpoint)
|
|
92
144
|
pendingEndpoints.delete(key)
|
|
93
|
-
|
|
145
|
+
// Config is set when endpoint collection is enabled; message limit is optional
|
|
146
|
+
if (batchEndpoints.length >= (config.appsec?.apiSecurity?.endpointCollectionMessageLimit ?? 0)) break
|
|
94
147
|
}
|
|
95
148
|
|
|
96
149
|
const payloadObj = {
|
|
@@ -98,7 +151,10 @@ function flushAndSend () {
|
|
|
98
151
|
endpoints: buildEndpointObjects(batchEndpoints)
|
|
99
152
|
}
|
|
100
153
|
|
|
154
|
+
/** @type {import('./send-data').TelemetryRequestType} */
|
|
101
155
|
let reqType = 'app-endpoints'
|
|
156
|
+
|
|
157
|
+
/** @type {import('./send-data').TelemetryPayload} */
|
|
102
158
|
let payload = payloadObj
|
|
103
159
|
|
|
104
160
|
const retryData = getRetryData()
|
|
@@ -120,8 +176,15 @@ function flushAndSend () {
|
|
|
120
176
|
if (pendingEndpoints.size) scheduleFlush()
|
|
121
177
|
}
|
|
122
178
|
|
|
123
|
-
|
|
124
|
-
|
|
179
|
+
/**
|
|
180
|
+
* @param {TelemetryConfig} _config
|
|
181
|
+
* @param {import('./send-data').TelemetryApplication} _application
|
|
182
|
+
* @param {import('./send-data').TelemetryHost} _host
|
|
183
|
+
* @param {GetRetryData} getRetryDataFunction
|
|
184
|
+
* @param {import('./send-data').SendDataCallback} updateRetryDataFunction
|
|
185
|
+
*/
|
|
186
|
+
function start (_config, _application, _host, getRetryDataFunction, updateRetryDataFunction) {
|
|
187
|
+
if (!_config.appsec?.apiSecurity?.endpointCollectionEnabled) return
|
|
125
188
|
|
|
126
189
|
config = _config
|
|
127
190
|
application = _application
|
|
@@ -141,7 +204,6 @@ function stop () {
|
|
|
141
204
|
|
|
142
205
|
pendingEndpoints.clear()
|
|
143
206
|
flushScheduled = false
|
|
144
|
-
config = application = host = getRetryData = updateRetryData = null
|
|
145
207
|
}
|
|
146
208
|
|
|
147
209
|
module.exports = {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const dc = require('dc-polyfill')
|
|
4
|
-
const logCollector = require('./log-collector')
|
|
5
4
|
const { sendData } = require('../send-data')
|
|
5
|
+
const logCollector = require('./log-collector')
|
|
6
6
|
|
|
7
7
|
const telemetryLog = dc.channel('datadog:telemetry:log')
|
|
8
8
|
const errorLog = dc.channel('datadog:log:error')
|