dd-trace 5.53.0 → 5.54.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 +2 -1
- package/index.d.ts +33 -16
- package/initialize.mjs +3 -4
- package/package.json +36 -34
- package/packages/datadog-core/src/utils/src/get.js +1 -1
- package/packages/datadog-core/src/utils/src/has.js +1 -1
- package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
- package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
- package/packages/datadog-core/src/utils/src/pick.js +2 -2
- package/packages/datadog-core/src/utils/src/set.js +1 -1
- package/packages/datadog-core/src/utils/src/uniq.js +1 -1
- package/packages/datadog-instrumentations/src/amqp10.js +19 -17
- package/packages/datadog-instrumentations/src/amqplib.js +52 -35
- package/packages/datadog-instrumentations/src/apollo.js +2 -2
- package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
- package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
- package/packages/datadog-instrumentations/src/child_process.js +1 -2
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +88 -73
- package/packages/datadog-instrumentations/src/couchbase.js +3 -3
- package/packages/datadog-instrumentations/src/cucumber.js +87 -40
- package/packages/datadog-instrumentations/src/cypress.js +2 -1
- package/packages/datadog-instrumentations/src/dns.js +1 -1
- package/packages/datadog-instrumentations/src/fs.js +1 -1
- package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
- package/packages/datadog-instrumentations/src/graphql.js +7 -10
- package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
- package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
- package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
- package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
- package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
- package/packages/datadog-instrumentations/src/helpers/register.js +5 -7
- package/packages/datadog-instrumentations/src/http/client.js +14 -20
- package/packages/datadog-instrumentations/src/jest.js +137 -48
- package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
- package/packages/datadog-instrumentations/src/knex.js +4 -4
- package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
- package/packages/datadog-instrumentations/src/mariadb.js +38 -61
- package/packages/datadog-instrumentations/src/mocha/main.js +63 -24
- package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
- package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
- package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
- package/packages/datadog-instrumentations/src/mysql.js +20 -36
- package/packages/datadog-instrumentations/src/mysql2.js +53 -47
- package/packages/datadog-instrumentations/src/net.js +1 -1
- package/packages/datadog-instrumentations/src/next.js +1 -0
- package/packages/datadog-instrumentations/src/nyc.js +1 -1
- package/packages/datadog-instrumentations/src/openai.js +21 -23
- package/packages/datadog-instrumentations/src/oracledb.js +1 -1
- package/packages/datadog-instrumentations/src/pg.js +1 -2
- package/packages/datadog-instrumentations/src/playwright.js +112 -69
- package/packages/datadog-instrumentations/src/redis.js +3 -3
- package/packages/datadog-instrumentations/src/restify.js +2 -2
- package/packages/datadog-instrumentations/src/rhea.js +42 -54
- package/packages/datadog-instrumentations/src/router.js +22 -25
- package/packages/datadog-instrumentations/src/tedious.js +1 -1
- package/packages/datadog-instrumentations/src/vitest.js +77 -28
- package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
- package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
- package/packages/datadog-plugin-amqplib/src/client.js +6 -2
- package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
- package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
- package/packages/datadog-plugin-amqplib/src/util.js +1 -1
- package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
- package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
- package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
- package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
- package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
- package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
- package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
- package/packages/datadog-plugin-child_process/src/index.js +4 -4
- package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
- package/packages/datadog-plugin-cucumber/src/index.js +57 -2
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
- package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
- package/packages/datadog-plugin-cypress/src/support.js +24 -5
- package/packages/datadog-plugin-express/src/code_origin.js +30 -0
- package/packages/datadog-plugin-express/src/index.js +10 -12
- package/packages/datadog-plugin-express/src/tracing.js +19 -0
- package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
- package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
- package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
- package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
- package/packages/datadog-plugin-graphql/src/execute.js +2 -2
- package/packages/datadog-plugin-graphql/src/index.js +7 -6
- package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
- package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
- package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
- package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
- package/packages/datadog-plugin-grpc/src/client.js +2 -2
- package/packages/datadog-plugin-grpc/src/util.js +2 -2
- package/packages/datadog-plugin-http/src/client.js +18 -7
- package/packages/datadog-plugin-http2/src/client.js +20 -20
- package/packages/datadog-plugin-jest/src/index.js +23 -21
- package/packages/datadog-plugin-jest/src/util.js +8 -8
- package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
- package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
- package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
- package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
- package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
- package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
- package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
- package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
- package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
- package/packages/datadog-plugin-mariadb/src/index.js +3 -9
- package/packages/datadog-plugin-mocha/src/index.js +33 -13
- package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
- package/packages/datadog-plugin-mysql/src/index.js +11 -9
- package/packages/datadog-plugin-mysql2/src/index.js +16 -0
- package/packages/datadog-plugin-net/src/tcp.js +1 -1
- package/packages/datadog-plugin-next/src/index.js +6 -5
- package/packages/datadog-plugin-openai/src/services.js +6 -10
- package/packages/datadog-plugin-openai/src/tracing.js +10 -14
- package/packages/datadog-plugin-oracledb/src/index.js +1 -1
- package/packages/datadog-plugin-playwright/src/index.js +22 -2
- package/packages/datadog-plugin-redis/src/index.js +1 -1
- package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
- package/packages/datadog-plugin-rhea/src/producer.js +5 -2
- package/packages/datadog-plugin-router/src/index.js +1 -1
- package/packages/datadog-plugin-selenium/src/index.js +1 -6
- package/packages/datadog-plugin-vitest/src/index.js +47 -31
- package/packages/datadog-shimmer/src/shimmer.js +4 -8
- package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
- package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
- package/packages/dd-trace/src/appsec/blocking.js +6 -20
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
- package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
- package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
- package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
- package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
- package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
- package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
- package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
- package/packages/dd-trace/src/appsec/iast/index.js +1 -0
- package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
- package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
- package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
- package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
- package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
- package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
- package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
- package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
- 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 +5 -7
- package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
- package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
- package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
- package/packages/dd-trace/src/appsec/index.js +1 -1
- package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
- package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
- package/packages/dd-trace/src/appsec/reporter.js +233 -40
- package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
- package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
- package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
- package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
- package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
- package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -2
- package/packages/dd-trace/src/azure_metadata.js +2 -7
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
- package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
- package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
- package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
- package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
- package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
- package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
- package/packages/dd-trace/src/config.js +82 -51
- package/packages/dd-trace/src/config_stable.js +3 -3
- package/packages/dd-trace/src/datastreams/encoding.js +9 -9
- package/packages/dd-trace/src/datastreams/fnv.js +1 -1
- package/packages/dd-trace/src/datastreams/pathway.js +4 -4
- package/packages/dd-trace/src/datastreams/processor.js +5 -7
- package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
- package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
- package/packages/dd-trace/src/datastreams/size.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +74 -67
- package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
- package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -1
- package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
- package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
- package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
- package/packages/dd-trace/src/dogstatsd.js +5 -4
- package/packages/dd-trace/src/encode/0.4.js +9 -9
- package/packages/dd-trace/src/encode/0.5.js +1 -1
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
- package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
- package/packages/dd-trace/src/encode/tags-processors.js +1 -1
- package/packages/dd-trace/src/exporter.js +6 -6
- package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
- package/packages/dd-trace/src/exporters/common/docker.js +1 -1
- package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
- package/packages/dd-trace/src/exporters/common/request.js +1 -1
- package/packages/dd-trace/src/exporters/common/util.js +1 -1
- package/packages/dd-trace/src/external-logger/src/index.js +5 -5
- package/packages/dd-trace/src/flare/file.js +1 -5
- package/packages/dd-trace/src/format.js +1 -1
- package/packages/dd-trace/src/git_properties.js +1 -1
- package/packages/dd-trace/src/id.js +12 -6
- package/packages/dd-trace/src/iitm.js +10 -22
- package/packages/dd-trace/src/lambda/handler.js +6 -6
- package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
- package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
- package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
- package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
- package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
- package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
- package/packages/dd-trace/src/llmobs/sdk.js +2 -2
- package/packages/dd-trace/src/llmobs/tagger.js +110 -96
- package/packages/dd-trace/src/llmobs/util.js +9 -9
- package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
- package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
- package/packages/dd-trace/src/log/index.js +4 -4
- package/packages/dd-trace/src/log/log.js +1 -1
- package/packages/dd-trace/src/log/writer.js +2 -2
- package/packages/dd-trace/src/msgpack/chunk.js +3 -3
- package/packages/dd-trace/src/msgpack/encoder.js +28 -28
- package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
- package/packages/dd-trace/src/noop/span.js +3 -5
- package/packages/dd-trace/src/noop/tracer.js +1 -2
- package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
- package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
- package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
- package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
- package/packages/dd-trace/src/opentracing/span.js +9 -14
- package/packages/dd-trace/src/opentracing/tracer.js +9 -6
- package/packages/dd-trace/src/payload-tagging/index.js +1 -1
- package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
- package/packages/dd-trace/src/pkg.js +1 -1
- package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
- package/packages/dd-trace/src/plugins/consumer.js +2 -2
- package/packages/dd-trace/src/plugins/inbound.js +5 -1
- package/packages/dd-trace/src/plugins/index.js +0 -1
- package/packages/dd-trace/src/plugins/outbound.js +4 -5
- package/packages/dd-trace/src/plugins/plugin.js +1 -1
- package/packages/dd-trace/src/plugins/producer.js +2 -2
- package/packages/dd-trace/src/plugins/storage.js +2 -2
- package/packages/dd-trace/src/plugins/util/ci.js +23 -15
- package/packages/dd-trace/src/plugins/util/git.js +165 -11
- package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
- package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
- package/packages/dd-trace/src/plugins/util/llm.js +27 -10
- package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
- package/packages/dd-trace/src/plugins/util/test.js +311 -48
- package/packages/dd-trace/src/plugins/util/url.js +1 -1
- package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
- package/packages/dd-trace/src/plugins/util/web.js +5 -4
- package/packages/dd-trace/src/priority_sampler.js +22 -22
- package/packages/dd-trace/src/profiling/config.js +44 -8
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
- package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
- package/packages/dd-trace/src/profiling/profiler.js +37 -2
- package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
- package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
- package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
- package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
- package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
- package/packages/dd-trace/src/profiling/tagger.js +3 -5
- package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
- package/packages/dd-trace/src/proxy.js +7 -9
- package/packages/dd-trace/src/random_sampler.js +40 -0
- package/packages/dd-trace/src/rate_limiter.js +4 -4
- package/packages/dd-trace/src/remote_config/index.js +3 -7
- package/packages/dd-trace/src/remote_config/manager.js +25 -13
- package/packages/dd-trace/src/require-package-json.js +1 -1
- package/packages/dd-trace/src/ritm.js +4 -4
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
- package/packages/dd-trace/src/sampler.js +33 -4
- package/packages/dd-trace/src/sampling_rule.js +12 -3
- package/packages/dd-trace/src/scope.js +1 -1
- package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
- package/packages/dd-trace/src/span_processor.js +3 -3
- package/packages/dd-trace/src/span_sampler.js +4 -1
- package/packages/dd-trace/src/standalone/tracesource.js +1 -1
- package/packages/dd-trace/src/startup-log.js +2 -2
- package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
- package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
- package/packages/dd-trace/src/telemetry/metrics.js +10 -5
- package/packages/dd-trace/src/telemetry/send-data.js +1 -1
- package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
- package/packages/dd-trace/src/util.js +1 -1
- package/version.js +1 -0
- package/packages/datadog-instrumentations/src/paperplane.js +0 -77
- package/packages/datadog-plugin-paperplane/src/index.js +0 -25
- package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
- package/packages/datadog-plugin-paperplane/src/server.js +0 -24
|
@@ -59,13 +59,17 @@ class RemoteConfigManager extends EventEmitter {
|
|
|
59
59
|
targets_version: 0,
|
|
60
60
|
// Use getter so `apply_*` can be updated async and still affect the content of `config_states`
|
|
61
61
|
get config_states () {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
62
|
+
const configs = []
|
|
63
|
+
for (const conf of appliedConfigs.values()) {
|
|
64
|
+
configs.push({
|
|
65
|
+
id: conf.id,
|
|
66
|
+
version: conf.version,
|
|
67
|
+
product: conf.product,
|
|
68
|
+
apply_state: conf.apply_state,
|
|
69
|
+
apply_error: conf.apply_error
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
return configs
|
|
69
73
|
},
|
|
70
74
|
has_error: false,
|
|
71
75
|
error: '',
|
|
@@ -125,7 +129,7 @@ class RemoteConfigManager extends EventEmitter {
|
|
|
125
129
|
}
|
|
126
130
|
|
|
127
131
|
updateProducts () {
|
|
128
|
-
this.state.client.products =
|
|
132
|
+
this.state.client.products = [...this._handlers.keys()]
|
|
129
133
|
}
|
|
130
134
|
|
|
131
135
|
getPayload () {
|
|
@@ -246,11 +250,19 @@ class RemoteConfigManager extends EventEmitter {
|
|
|
246
250
|
this.dispatch(toApply, 'apply')
|
|
247
251
|
this.dispatch(toModify, 'modify')
|
|
248
252
|
|
|
249
|
-
this.state.cached_target_files =
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
253
|
+
this.state.cached_target_files = []
|
|
254
|
+
|
|
255
|
+
for (const conf of this.appliedConfigs.values()) {
|
|
256
|
+
const hashes = []
|
|
257
|
+
for (const hash of Object.entries(conf.hashes)) {
|
|
258
|
+
hashes.push({ algorithm: hash[0], hash: hash[1] })
|
|
259
|
+
}
|
|
260
|
+
this.state.cached_target_files.push({
|
|
261
|
+
path: conf.path,
|
|
262
|
+
length: conf.length,
|
|
263
|
+
hashes
|
|
264
|
+
})
|
|
265
|
+
}
|
|
254
266
|
}
|
|
255
267
|
}
|
|
256
268
|
|
|
@@ -60,11 +60,11 @@ function Hook (modules, options, onrequire) {
|
|
|
60
60
|
let filename
|
|
61
61
|
try {
|
|
62
62
|
filename = Module._resolveFilename(request, this)
|
|
63
|
-
} catch
|
|
63
|
+
} catch {
|
|
64
64
|
return _origRequire.apply(this, arguments)
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
const core = filename.
|
|
67
|
+
const core = !filename.includes(path.sep)
|
|
68
68
|
let name, basedir, hooks
|
|
69
69
|
// return known patched modules immediately
|
|
70
70
|
if (cache[filename]) {
|
|
@@ -113,7 +113,7 @@ function Hook (modules, options, onrequire) {
|
|
|
113
113
|
const inAWSLambda = process.env.AWS_LAMBDA_FUNCTION_NAME !== undefined
|
|
114
114
|
const hasLambdaHandler = process.env.DD_LAMBDA_HANDLER !== undefined
|
|
115
115
|
const segments = filename.split(path.sep)
|
|
116
|
-
const filenameFromNodeModule = segments.
|
|
116
|
+
const filenameFromNodeModule = segments.includes('node_modules')
|
|
117
117
|
// decide how to assign the stat
|
|
118
118
|
// first case will only happen when patching an AWS Lambda Handler
|
|
119
119
|
const stat = inAWSLambda && hasLambdaHandler && !filenameFromNodeModule ? { name: filename } : parse(filename)
|
|
@@ -134,7 +134,7 @@ function Hook (modules, options, onrequire) {
|
|
|
134
134
|
let res
|
|
135
135
|
try {
|
|
136
136
|
res = Module._findPath(name, [basedir, ...paths])
|
|
137
|
-
} catch
|
|
137
|
+
} catch {
|
|
138
138
|
// case where the file specified in package.json "main" doesn't exist
|
|
139
139
|
// in this case, the file is treated as module-internal
|
|
140
140
|
}
|
|
@@ -11,7 +11,7 @@ const { performance, PerformanceObserver } = require('perf_hooks')
|
|
|
11
11
|
|
|
12
12
|
const { NODE_MAJOR, NODE_MINOR } = require('../../../../version')
|
|
13
13
|
const { DD_RUNTIME_METRICS_FLUSH_INTERVAL = '10000' } = process.env
|
|
14
|
-
const INTERVAL = parseInt(DD_RUNTIME_METRICS_FLUSH_INTERVAL, 10)
|
|
14
|
+
const INTERVAL = Number.parseInt(DD_RUNTIME_METRICS_FLUSH_INTERVAL, 10)
|
|
15
15
|
|
|
16
16
|
// Node >=16 has PerformanceObserver with `gc` type, but <16.7 had a critical bug.
|
|
17
17
|
// See: https://github.com/nodejs/node/issues/39548
|
|
@@ -141,7 +141,7 @@ function captureCpuUsage () {
|
|
|
141
141
|
time = process.hrtime()
|
|
142
142
|
cpuUsage = process.cpuUsage()
|
|
143
143
|
|
|
144
|
-
const elapsedMs = elapsedTime[0] * 1000 + elapsedTime[1] /
|
|
144
|
+
const elapsedMs = elapsedTime[0] * 1000 + elapsedTime[1] / 1_000_000
|
|
145
145
|
const userPercent = 100 * elapsedUsage.user / 1000 / elapsedMs
|
|
146
146
|
const systemPercent = 100 * elapsedUsage.system / 1000 / elapsedMs
|
|
147
147
|
const totalPercent = userPercent + systemPercent
|
|
@@ -1,11 +1,27 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
+
// Maximum trace ID value is the maximum value for a 64-bit unsigned integer.
|
|
4
|
+
// Javascript cannot handle such large numbers, we will loose precision but it's fine
|
|
5
|
+
// as it is cast into a float64 when computing the threshold
|
|
6
|
+
const MAX_TRACE_ID = 2 ** 64 - 1
|
|
7
|
+
|
|
8
|
+
const UINT64_MODULO = 2n ** 64n
|
|
9
|
+
|
|
10
|
+
// Knuth's factor for the sampling algorithm
|
|
11
|
+
const SAMPLING_KNUTH_FACTOR = 1_111_111_111_111_111_111n
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* `Sampler` determines whether or not to sample a trace/span based on the trace ID.
|
|
15
|
+
*
|
|
16
|
+
* This class uses a deterministic sampling algorithm that is consistent across all languages.
|
|
17
|
+
*/
|
|
3
18
|
class Sampler {
|
|
4
19
|
/**
|
|
5
|
-
* @param
|
|
20
|
+
* @param {number} rate
|
|
6
21
|
*/
|
|
7
22
|
constructor (rate) {
|
|
8
23
|
this._rate = rate
|
|
24
|
+
this._threshold = BigInt(Math.floor(rate * MAX_TRACE_ID))
|
|
9
25
|
}
|
|
10
26
|
|
|
11
27
|
/**
|
|
@@ -16,10 +32,23 @@ class Sampler {
|
|
|
16
32
|
}
|
|
17
33
|
|
|
18
34
|
/**
|
|
19
|
-
*
|
|
35
|
+
* Determines whether a trace/span should be sampled based on the configured sampling rate.
|
|
36
|
+
*
|
|
37
|
+
* @param {Span|SpanContext} span - The span or span context to evaluate.
|
|
38
|
+
* @returns {boolean} `true` if the trace/span should be sampled, otherwise `false`.
|
|
20
39
|
*/
|
|
21
|
-
isSampled () {
|
|
22
|
-
|
|
40
|
+
isSampled (span) {
|
|
41
|
+
if (this._rate === 1) {
|
|
42
|
+
return true
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (this._rate === 0) {
|
|
46
|
+
return false
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
span = typeof span.context === 'function' ? span.context() : span
|
|
50
|
+
|
|
51
|
+
return (span._traceId.toBigInt() * SAMPLING_KNUTH_FACTOR) % UINT64_MODULO <= this._threshold
|
|
23
52
|
}
|
|
24
53
|
}
|
|
25
54
|
|
|
@@ -69,7 +69,7 @@ function resourceLocator (span) {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
class SamplingRule {
|
|
72
|
-
constructor ({ name, service, resource, tags, sampleRate = 1
|
|
72
|
+
constructor ({ name, service, resource, tags, sampleRate = 1, provenance, maxPerSecond } = {}) {
|
|
73
73
|
this.matchers = []
|
|
74
74
|
|
|
75
75
|
if (name) {
|
|
@@ -112,6 +112,9 @@ class SamplingRule {
|
|
|
112
112
|
|
|
113
113
|
match (span) {
|
|
114
114
|
for (const matcher of this.matchers) {
|
|
115
|
+
// Rule is a special object with a .match() property.
|
|
116
|
+
// It has nothing to do with a regular expression.
|
|
117
|
+
// eslint-disable-next-line unicorn/prefer-regexp-test
|
|
115
118
|
if (!matcher.match(span)) {
|
|
116
119
|
return false
|
|
117
120
|
}
|
|
@@ -120,8 +123,14 @@ class SamplingRule {
|
|
|
120
123
|
return true
|
|
121
124
|
}
|
|
122
125
|
|
|
123
|
-
|
|
124
|
-
|
|
126
|
+
/**
|
|
127
|
+
* Determines whether a span should be sampled based on the configured sampling rule.
|
|
128
|
+
*
|
|
129
|
+
* @param {Span|SpanContext} span - The span or span context to evaluate.
|
|
130
|
+
* @returns {boolean} `true` if the span should be sampled, otherwise `false`.
|
|
131
|
+
*/
|
|
132
|
+
sample (span) {
|
|
133
|
+
if (!this._sampler.isSampled(span)) {
|
|
125
134
|
return false
|
|
126
135
|
}
|
|
127
136
|
|
|
@@ -3,7 +3,7 @@ function identityService ({ tracerService }) {
|
|
|
3
3
|
}
|
|
4
4
|
|
|
5
5
|
function getFormattedHostString ({ host, port }) {
|
|
6
|
-
return [host, port].filter(
|
|
6
|
+
return [host, port].filter(Boolean).join(':')
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
function httpPluginClientService ({ tracerService, pluginConfig, sessionDetails }) {
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
const { identityService, httpPluginClientService, awsServiceV0 } = require('../util')
|
|
2
|
-
const { DD_MAJOR } = require('../../../../../../version')
|
|
3
2
|
|
|
4
3
|
const web = {
|
|
5
4
|
client: {
|
|
6
5
|
grpc: {
|
|
7
|
-
opName: () =>
|
|
6
|
+
opName: () => 'grpc.client',
|
|
8
7
|
serviceName: identityService
|
|
9
8
|
},
|
|
10
9
|
moleculer: {
|
|
@@ -62,7 +61,7 @@ const web = {
|
|
|
62
61
|
serviceName: ({ pluginConfig, tracerService }) => pluginConfig.service || tracerService
|
|
63
62
|
},
|
|
64
63
|
grpc: {
|
|
65
|
-
opName: () =>
|
|
64
|
+
opName: () => 'grpc.server',
|
|
66
65
|
serviceName: identityService
|
|
67
66
|
},
|
|
68
67
|
moleculer: {
|
|
@@ -47,14 +47,14 @@ class SpanProcessor {
|
|
|
47
47
|
this._gitMetadataTagger.tagGitMetadata(spanContext)
|
|
48
48
|
|
|
49
49
|
for (const span of started) {
|
|
50
|
-
if (span._duration
|
|
50
|
+
if (span._duration === undefined) {
|
|
51
|
+
active.push(span)
|
|
52
|
+
} else {
|
|
51
53
|
const formattedSpan = format(span)
|
|
52
54
|
this._stats?.onSpanFinished(formattedSpan)
|
|
53
55
|
formatted.push(formattedSpan)
|
|
54
56
|
|
|
55
57
|
spanProcessCh.publish({ span })
|
|
56
|
-
} else {
|
|
57
|
-
active.push(span)
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -10,6 +10,9 @@ class SpanSampler {
|
|
|
10
10
|
|
|
11
11
|
findRule (context) {
|
|
12
12
|
for (const rule of this._rules) {
|
|
13
|
+
// Rule is a special object with a .match() property.
|
|
14
|
+
// It has nothing to do with a regular expression.
|
|
15
|
+
// eslint-disable-next-line unicorn/prefer-regexp-test
|
|
13
16
|
if (rule.match(context)) {
|
|
14
17
|
return rule
|
|
15
18
|
}
|
|
@@ -23,7 +26,7 @@ class SpanSampler {
|
|
|
23
26
|
const { started } = spanContext._trace
|
|
24
27
|
for (const span of started) {
|
|
25
28
|
const rule = this.findRule(span)
|
|
26
|
-
if (rule && rule.sample()) {
|
|
29
|
+
if (rule && rule.sample(spanContext)) {
|
|
27
30
|
span.context()._spanSampling = {
|
|
28
31
|
sampleRate: rule.sampleRate,
|
|
29
32
|
maxPerSecond: rule.maxPerSecond
|
|
@@ -5,7 +5,7 @@ const { hasOwn } = require('../util')
|
|
|
5
5
|
|
|
6
6
|
function addTraceSourceTag (tags, product) {
|
|
7
7
|
if (tags && product) {
|
|
8
|
-
const actual = tags[TRACE_SOURCE_PROPAGATION_KEY] ? parseInt(tags[TRACE_SOURCE_PROPAGATION_KEY], 16) : 0
|
|
8
|
+
const actual = tags[TRACE_SOURCE_PROPAGATION_KEY] ? Number.parseInt(tags[TRACE_SOURCE_PROPAGATION_KEY], 16) : 0
|
|
9
9
|
tags[TRACE_SOURCE_PROPAGATION_KEY] = ((actual | product.id) >>> 0).toString(16).padStart(2, '0')
|
|
10
10
|
}
|
|
11
11
|
|
|
@@ -18,7 +18,7 @@ function getIntegrationsAndAnalytics () {
|
|
|
18
18
|
for (const pluginName in pluginManager._pluginsByName) {
|
|
19
19
|
integrations.add(pluginName)
|
|
20
20
|
}
|
|
21
|
-
extras.integrations_loaded =
|
|
21
|
+
extras.integrations_loaded = [...integrations]
|
|
22
22
|
return extras
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -47,7 +47,7 @@ function startupLog ({ agentError } = {}) {
|
|
|
47
47
|
if (agentError) {
|
|
48
48
|
warn('DATADOG TRACER DIAGNOSTIC - Agent Error: ' + agentError.message)
|
|
49
49
|
errors.agentError = {
|
|
50
|
-
code: agentError.code
|
|
50
|
+
code: agentError.code ?? '',
|
|
51
51
|
message: `Agent Error:${agentError.message}`
|
|
52
52
|
}
|
|
53
53
|
}
|
|
@@ -35,8 +35,8 @@ function waitAndSend (config, application, host) {
|
|
|
35
35
|
immediate = setImmediate(() => {
|
|
36
36
|
immediate = null
|
|
37
37
|
if (savedDependenciesToSend.size > 0) {
|
|
38
|
-
const dependencies =
|
|
39
|
-
// if a
|
|
38
|
+
const dependencies = [...savedDependenciesToSend.values()]
|
|
39
|
+
// if a dependency is from the initial load, *always* send the event
|
|
40
40
|
// Otherwise, only send if dependencyCollection is enabled
|
|
41
41
|
.filter(dep => {
|
|
42
42
|
const initialLoadModule = isTrue(dep.split(' ')[2])
|
|
@@ -94,7 +94,7 @@ function onModuleLoad (data) {
|
|
|
94
94
|
if (filename && filename.startsWith(FILE_URI_START)) {
|
|
95
95
|
try {
|
|
96
96
|
filename = fileURLToPath(filename)
|
|
97
|
-
} catch
|
|
97
|
+
} catch {
|
|
98
98
|
// cannot transform url to path
|
|
99
99
|
}
|
|
100
100
|
}
|
|
@@ -118,7 +118,7 @@ function onModuleLoad (data) {
|
|
|
118
118
|
|
|
119
119
|
waitAndSend(config, application, host)
|
|
120
120
|
}
|
|
121
|
-
} catch
|
|
121
|
+
} catch {
|
|
122
122
|
// can not read the package.json, do nothing
|
|
123
123
|
}
|
|
124
124
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const log = require('../../log')
|
|
4
|
-
const {
|
|
4
|
+
const { ddBasePath } = require('../../util')
|
|
5
5
|
|
|
6
6
|
const logs = new Map() // hash -> log
|
|
7
7
|
|
|
8
8
|
// NOTE: Is this a reasonable number?
|
|
9
|
-
let maxEntries =
|
|
9
|
+
let maxEntries = 10_000
|
|
10
10
|
let overflowedCount = 0
|
|
11
11
|
|
|
12
12
|
function hashCode (hashSource) {
|
|
@@ -20,9 +20,9 @@ function hashCode (hashSource) {
|
|
|
20
20
|
|
|
21
21
|
function createHash (logEntry) {
|
|
22
22
|
const prime = 31
|
|
23
|
-
let result =
|
|
24
|
-
result = (((prime * result) | 0) + (
|
|
25
|
-
result = (((prime * result) | 0) + (
|
|
23
|
+
let result = logEntry.level ? hashCode(logEntry.level) : 0
|
|
24
|
+
result = (((prime * result) | 0) + (logEntry.message ? hashCode(logEntry.message) : 0)) | 0
|
|
25
|
+
result = (((prime * result) | 0) + (logEntry.stack_trace ? hashCode(logEntry.stack_trace) : 0)) | 0
|
|
26
26
|
return result
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -30,7 +30,6 @@ function isValid (logEntry) {
|
|
|
30
30
|
return logEntry?.level && logEntry.message
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
const ddBasePath = calculateDDBasePath(__dirname)
|
|
34
33
|
const EOL = '\n'
|
|
35
34
|
const STACK_FRAME_LINE_REGEX = /^\s*at\s/gm
|
|
36
35
|
|
|
@@ -42,7 +41,7 @@ function sanitize (logEntry) {
|
|
|
42
41
|
|
|
43
42
|
const firstIndex = stackLines.findIndex(l => l.match(STACK_FRAME_LINE_REGEX))
|
|
44
43
|
|
|
45
|
-
const isDDCode = firstIndex
|
|
44
|
+
const isDDCode = firstIndex !== -1 && stackLines[firstIndex].includes(ddBasePath)
|
|
46
45
|
stackLines = stackLines
|
|
47
46
|
.filter((line, index) => (isDDCode && index < firstIndex) || line.includes(ddBasePath))
|
|
48
47
|
.map(line => line.replace(ddBasePath, ''))
|
|
@@ -78,11 +77,11 @@ const logCollector = {
|
|
|
78
77
|
return false
|
|
79
78
|
}
|
|
80
79
|
const hash = createHash(logEntry)
|
|
81
|
-
if (
|
|
80
|
+
if (logs.has(hash)) {
|
|
81
|
+
logs.get(hash).count++
|
|
82
|
+
} else {
|
|
82
83
|
logs.set(hash, logEntry)
|
|
83
84
|
return true
|
|
84
|
-
} else {
|
|
85
|
-
logs.get(hash).count++
|
|
86
85
|
}
|
|
87
86
|
} catch (e) {
|
|
88
87
|
log.error('Unable to add log to logCollector: %s', e.message)
|
|
@@ -19,8 +19,14 @@ function now () {
|
|
|
19
19
|
return Date.now() / 1e3
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
function mapToJsonArray (map) {
|
|
23
|
-
|
|
22
|
+
function mapToJsonArray (map, filter) {
|
|
23
|
+
const array = []
|
|
24
|
+
for (const value of map.values()) {
|
|
25
|
+
if (!filter || filter(value)) {
|
|
26
|
+
array.push(value.toJSON())
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return array
|
|
24
30
|
}
|
|
25
31
|
|
|
26
32
|
function hasPoints (metric) {
|
|
@@ -138,7 +144,7 @@ class RateMetric extends Metric {
|
|
|
138
144
|
|
|
139
145
|
track (value = 1) {
|
|
140
146
|
this.rate += value
|
|
141
|
-
const rate = this.interval ? (this.rate / this.interval) : 0
|
|
147
|
+
const rate = this.interval ? (this.rate / this.interval) : 0
|
|
142
148
|
this.points = [[now(), rate]]
|
|
143
149
|
}
|
|
144
150
|
}
|
|
@@ -169,8 +175,7 @@ class MetricsCollection extends Map {
|
|
|
169
175
|
toJSON () {
|
|
170
176
|
if (!this.size) return
|
|
171
177
|
|
|
172
|
-
const series = mapToJsonArray(this)
|
|
173
|
-
.filter(hasPoints)
|
|
178
|
+
const series = mapToJsonArray(this, hasPoints)
|
|
174
179
|
|
|
175
180
|
if (!series.length) return
|
|
176
181
|
|
|
@@ -74,7 +74,7 @@ function sendData (config, application, host, reqType, payload = {}, cb = () =>
|
|
|
74
74
|
|
|
75
75
|
const data = JSON.stringify({
|
|
76
76
|
api_version: 'v2',
|
|
77
|
-
naming_schema_version: config.spanAttributeSchema
|
|
77
|
+
naming_schema_version: config.spanAttributeSchema ?? '',
|
|
78
78
|
request_type: reqType,
|
|
79
79
|
tracer_time: Math.floor(Date.now() / 1000),
|
|
80
80
|
runtime_id: config.tags['runtime-id'],
|
|
@@ -303,6 +303,25 @@ function formatMapForTelemetry (map) {
|
|
|
303
303
|
: ''
|
|
304
304
|
}
|
|
305
305
|
|
|
306
|
+
const nameMapping = {
|
|
307
|
+
sampleRate: 'DD_TRACE_SAMPLE_RATE',
|
|
308
|
+
logInjection: 'DD_LOG_INJECTION',
|
|
309
|
+
headerTags: 'DD_TRACE_HEADER_TAGS',
|
|
310
|
+
tags: 'DD_TAGS',
|
|
311
|
+
'sampler.rules': 'DD_TRACE_SAMPLING_RULES',
|
|
312
|
+
traceEnabled: 'DD_TRACE_ENABLED',
|
|
313
|
+
url: 'DD_TRACE_AGENT_URL',
|
|
314
|
+
'sampler.rateLimit': 'DD_TRACE_RATE_LIMIT',
|
|
315
|
+
queryStringObfuscation: 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP',
|
|
316
|
+
version: 'DD_VERSION',
|
|
317
|
+
env: 'DD_ENV',
|
|
318
|
+
service: 'DD_SERVICE',
|
|
319
|
+
clientIpHeader: 'DD_TRACE_CLIENT_IP_HEADER',
|
|
320
|
+
'grpc.client.error.statuses': 'DD_GRPC_CLIENT_ERROR_STATUSES',
|
|
321
|
+
'grpc.server.error.statuses': 'DD_GRPC_SERVER_ERROR_STATUSES',
|
|
322
|
+
traceId128BitLoggingEnabled: 'DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED'
|
|
323
|
+
}
|
|
324
|
+
|
|
306
325
|
function updateConfig (changes, config) {
|
|
307
326
|
if (!config.telemetry.enabled) return
|
|
308
327
|
if (changes.length === 0) return
|
|
@@ -312,25 +331,6 @@ function updateConfig (changes, config) {
|
|
|
312
331
|
const application = createAppObject(config)
|
|
313
332
|
const host = createHostObject()
|
|
314
333
|
|
|
315
|
-
const nameMapping = {
|
|
316
|
-
sampleRate: 'DD_TRACE_SAMPLE_RATE',
|
|
317
|
-
logInjection: 'DD_LOG_INJECTION',
|
|
318
|
-
headerTags: 'DD_TRACE_HEADER_TAGS',
|
|
319
|
-
tags: 'DD_TAGS',
|
|
320
|
-
'sampler.rules': 'DD_TRACE_SAMPLING_RULES',
|
|
321
|
-
traceEnabled: 'DD_TRACE_ENABLED',
|
|
322
|
-
url: 'DD_TRACE_AGENT_URL',
|
|
323
|
-
'sampler.rateLimit': 'DD_TRACE_RATE_LIMIT',
|
|
324
|
-
queryStringObfuscation: 'DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP',
|
|
325
|
-
version: 'DD_VERSION',
|
|
326
|
-
env: 'DD_ENV',
|
|
327
|
-
service: 'DD_SERVICE',
|
|
328
|
-
clientIpHeader: 'DD_TRACE_CLIENT_IP_HEADER',
|
|
329
|
-
'grpc.client.error.statuses': 'DD_GRPC_CLIENT_ERROR_STATUSES',
|
|
330
|
-
'grpc.server.error.statuses': 'DD_GRPC_SERVER_ERROR_STATUSES',
|
|
331
|
-
traceId128BitLoggingEnabled: 'DD_TRACE_128_BIT_TRACEID_LOGGING_ENABLED'
|
|
332
|
-
}
|
|
333
|
-
|
|
334
334
|
const namesNeedFormatting = new Set(['DD_TAGS', 'peerServiceMapping', 'serviceMapping'])
|
|
335
335
|
|
|
336
336
|
const configuration = []
|
|
@@ -361,14 +361,14 @@ function updateConfig (changes, config) {
|
|
|
361
361
|
return !names.includes(entry.name)
|
|
362
362
|
}
|
|
363
363
|
|
|
364
|
-
if (
|
|
365
|
-
configWithOrigin = configuration
|
|
366
|
-
} else {
|
|
364
|
+
if (configWithOrigin.length) {
|
|
367
365
|
// update configWithOrigin to contain up-to-date full list of config values for app-extended-heartbeat
|
|
368
366
|
configWithOrigin = configWithOrigin.filter(isNotModified)
|
|
369
|
-
configWithOrigin = configWithOrigin
|
|
367
|
+
configWithOrigin = [...configWithOrigin, ...configuration]
|
|
370
368
|
const { reqType, payload } = createPayload('app-client-configuration-change', { configuration })
|
|
371
369
|
sendData(config, application, host, reqType, payload, updateRetryData)
|
|
370
|
+
} else {
|
|
371
|
+
configWithOrigin = configuration
|
|
372
372
|
}
|
|
373
373
|
}
|
|
374
374
|
|
|
@@ -382,7 +382,6 @@ function profilingEnabledToBoolean (profilingEnabled) {
|
|
|
382
382
|
if (profilingEnabled === 'false') {
|
|
383
383
|
return false
|
|
384
384
|
}
|
|
385
|
-
return undefined
|
|
386
385
|
}
|
|
387
386
|
|
|
388
387
|
module.exports = {
|
package/version.js
CHANGED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const { addHook, channel } = require('./helpers/instrument')
|
|
4
|
-
const shimmer = require('../../datadog-shimmer')
|
|
5
|
-
|
|
6
|
-
const logChannel = channel('apm:paperplane:log')
|
|
7
|
-
const handleChannel = channel('apm:paperplane:request:handle')
|
|
8
|
-
const routeChannel = channel('apm:paperplane:request:route')
|
|
9
|
-
|
|
10
|
-
const nodeMajor = Number(process.versions.node.split('.')[0])
|
|
11
|
-
const name = 'paperplane'
|
|
12
|
-
const versions = nodeMajor <= 12 ? ['>=2.3.2'] : nodeMajor <= 14 ? ['>=3.1.1'] : []
|
|
13
|
-
|
|
14
|
-
const wrapRoute = handler => req => {
|
|
15
|
-
const { original, route } = req
|
|
16
|
-
|
|
17
|
-
if (routeChannel.hasSubscribers) {
|
|
18
|
-
routeChannel.publish({ req: original, route })
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return handler(req)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const wrapLogger = logger => record => {
|
|
25
|
-
const event = { message: record }
|
|
26
|
-
|
|
27
|
-
logChannel.publish(event)
|
|
28
|
-
|
|
29
|
-
return logger(event.message)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const wrapMount = mount => opts => {
|
|
33
|
-
const handler = mount(opts)
|
|
34
|
-
|
|
35
|
-
return function (req, res) {
|
|
36
|
-
handleChannel.publish(req)
|
|
37
|
-
|
|
38
|
-
return handler.apply(this, arguments)
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const wrapRoutes = routes => handlers => {
|
|
43
|
-
const traced = {}
|
|
44
|
-
|
|
45
|
-
for (const route in handlers) {
|
|
46
|
-
traced[route] = wrapRoute(handlers[route])
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return routes(traced)
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
addHook({ name, versions, file: 'lib/logger.js' }, exports => {
|
|
53
|
-
shimmer.wrap(exports, 'logger', wrapLogger)
|
|
54
|
-
|
|
55
|
-
return exports
|
|
56
|
-
})
|
|
57
|
-
|
|
58
|
-
addHook({ name, versions, file: 'lib/mount.js' }, exports => {
|
|
59
|
-
shimmer.wrap(exports, 'mount', wrapMount)
|
|
60
|
-
|
|
61
|
-
return exports
|
|
62
|
-
})
|
|
63
|
-
|
|
64
|
-
addHook({ name, versions, file: 'lib/routes.js' }, exports => {
|
|
65
|
-
shimmer.wrap(exports, 'routes', wrapRoutes)
|
|
66
|
-
|
|
67
|
-
return exports
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
if (nodeMajor <= 12) {
|
|
71
|
-
addHook({ name, versions: ['2.3.0 - 2.3.1'] }, paperplane => {
|
|
72
|
-
shimmer.wrap(paperplane, 'mount', wrapMount)
|
|
73
|
-
shimmer.wrap(paperplane, 'routes', wrapRoutes)
|
|
74
|
-
|
|
75
|
-
return paperplane
|
|
76
|
-
})
|
|
77
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const Plugin = require('../../dd-trace/src/plugins/plugin')
|
|
4
|
-
const PaperplaneLoggerPlugin = require('./logger')
|
|
5
|
-
const PaperplaneServerPlugin = require('./server')
|
|
6
|
-
|
|
7
|
-
class PaperplanePlugin extends Plugin {
|
|
8
|
-
static get id () {
|
|
9
|
-
return 'paperplane'
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
constructor (...args) {
|
|
13
|
-
super(...args)
|
|
14
|
-
|
|
15
|
-
this.server = new PaperplaneServerPlugin(...args)
|
|
16
|
-
this.logger = new PaperplaneLoggerPlugin(...args)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
configure (config) {
|
|
20
|
-
this.server.configure(config)
|
|
21
|
-
this.logger.configure(config)
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
module.exports = PaperplanePlugin
|