dd-trace 5.52.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/README.md +5 -0
- package/index.d.ts +87 -22
- 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 +57 -37
- 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 +3 -3
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +92 -62
- package/packages/datadog-instrumentations/src/couchbase.js +5 -4
- package/packages/datadog-instrumentations/src/cucumber.js +126 -84
- package/packages/datadog-instrumentations/src/cypress.js +2 -1
- package/packages/datadog-instrumentations/src/dns.js +1 -1
- package/packages/datadog-instrumentations/src/express.js +2 -6
- package/packages/datadog-instrumentations/src/fs.js +7 -6
- 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 +1 -1
- package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
- package/packages/datadog-instrumentations/src/helpers/register.js +21 -18
- package/packages/datadog-instrumentations/src/http/client.js +16 -21
- package/packages/datadog-instrumentations/src/iovalkey.js +51 -0
- package/packages/datadog-instrumentations/src/jest.js +184 -87
- package/packages/datadog-instrumentations/src/kafkajs.js +65 -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 +85 -59
- package/packages/datadog-instrumentations/src/mocha/utils.js +103 -82
- 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 +55 -47
- package/packages/datadog-instrumentations/src/net.js +4 -2
- package/packages/datadog-instrumentations/src/next.js +7 -14
- 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 +6 -13
- package/packages/datadog-instrumentations/src/playwright.js +170 -136
- 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/url.js +9 -17
- package/packages/datadog-instrumentations/src/vitest.js +126 -97
- 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 +86 -20
- 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-iovalkey/src/index.js +18 -0
- package/packages/datadog-plugin-jest/src/index.js +36 -28
- 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 +15 -7
- 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 +88 -48
- 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 +48 -22
- package/packages/datadog-plugin-redis/src/index.js +9 -4
- 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 +99 -72
- package/packages/datadog-shimmer/src/shimmer.js +163 -36
- 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/graphql.js +2 -2
- 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 +15 -12
- package/packages/dd-trace/src/appsec/rasp/index.js +19 -17
- package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
- package/packages/dd-trace/src/appsec/rasp/utils.js +11 -6
- 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/sdk/user_blocking.js +2 -2
- package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
- package/packages/dd-trace/src/appsec/telemetry/index.js +1 -2
- package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -14
- 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 +8 -8
- 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 +131 -72
- 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 +17 -27
- package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
- package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -7
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +16 -8
- 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 +31 -4
- package/packages/dd-trace/src/dogstatsd.js +7 -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 +113 -99
- 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 +1 -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 -13
- 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/serverless.js +0 -48
- package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
- package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +8 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
- package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
- 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
|
@@ -44,27 +44,24 @@ class AbortError extends Error {
|
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
const types = new Set(['query', 'mutation', 'subscription'])
|
|
48
|
+
|
|
47
49
|
function getOperation (document, operationName) {
|
|
48
50
|
if (!document || !Array.isArray(document.definitions)) {
|
|
49
51
|
return
|
|
50
52
|
}
|
|
51
53
|
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return definitions
|
|
57
|
-
.filter(def => types.indexOf(def.operation) !== -1)
|
|
58
|
-
.find(def => operationName === (def.name && def.name.value))
|
|
59
|
-
} else {
|
|
60
|
-
return definitions.find(def => types.indexOf(def.operation) !== -1)
|
|
54
|
+
for (const definition of document.definitions) {
|
|
55
|
+
if (definition && types.has(definition.operation) && (!operationName || definition.name?.value === operationName)) {
|
|
56
|
+
return definition
|
|
57
|
+
}
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
|
|
64
61
|
function normalizeArgs (args, defaultFieldResolver) {
|
|
65
62
|
if (args.length !== 1) return normalizePositional(args, defaultFieldResolver)
|
|
66
63
|
|
|
67
|
-
args[0].contextValue
|
|
64
|
+
args[0].contextValue ||= {}
|
|
68
65
|
args[0].fieldResolver = wrapResolve(args[0].fieldResolver || defaultFieldResolver)
|
|
69
66
|
|
|
70
67
|
return args[0]
|
|
@@ -4,8 +4,6 @@ const types = require('./types')
|
|
|
4
4
|
const { addHook, channel } = require('../helpers/instrument')
|
|
5
5
|
const shimmer = require('../../../datadog-shimmer')
|
|
6
6
|
|
|
7
|
-
const nodeMajor = parseInt(process.versions.node.split('.')[0])
|
|
8
|
-
|
|
9
7
|
const patched = new WeakSet()
|
|
10
8
|
const instances = new WeakMap()
|
|
11
9
|
|
|
@@ -98,7 +96,7 @@ function wrapMethod (method, path, type, hasPeer) {
|
|
|
98
96
|
return wrapped
|
|
99
97
|
}
|
|
100
98
|
|
|
101
|
-
function wrapCallback (ctx, callback = () => {
|
|
99
|
+
function wrapCallback (ctx, callback = () => {}) {
|
|
102
100
|
return shimmer.wrapFunction(callback, callback => function (err) {
|
|
103
101
|
if (err) {
|
|
104
102
|
ctx.error = err
|
|
@@ -112,18 +110,18 @@ function wrapCallback (ctx, callback = () => { }) {
|
|
|
112
110
|
})
|
|
113
111
|
}
|
|
114
112
|
|
|
115
|
-
function
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
113
|
+
const onStatusWithPeer = function (ctx, arg1, thisArg) {
|
|
114
|
+
ctx.result = arg1
|
|
115
|
+
ctx.peer = thisArg.getPeer()
|
|
116
|
+
finishChannel.publish(ctx)
|
|
117
|
+
}
|
|
121
118
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
119
|
+
const onStatusWithoutPeer = function (ctx, arg1) {
|
|
120
|
+
ctx.result = arg1
|
|
121
|
+
finishChannel.publish(ctx)
|
|
122
|
+
}
|
|
126
123
|
|
|
124
|
+
function createWrapEmit (ctx, hasPeer = false) {
|
|
127
125
|
const onStatus = hasPeer ? onStatusWithPeer : onStatusWithoutPeer
|
|
128
126
|
|
|
129
127
|
return function wrapEmit (emit) {
|
|
@@ -245,16 +243,6 @@ function patch (hasPeer = false) {
|
|
|
245
243
|
}
|
|
246
244
|
}
|
|
247
245
|
|
|
248
|
-
if (nodeMajor <= 14) {
|
|
249
|
-
addHook({ name: 'grpc', versions: ['>=1.24.3'] }, patch(true))
|
|
250
|
-
|
|
251
|
-
addHook({ name: 'grpc', versions: ['>=1.24.3'], file: 'src/client.js' }, client => {
|
|
252
|
-
shimmer.wrap(client, 'makeClientConstructor', createWrapMakeClientConstructor(true))
|
|
253
|
-
|
|
254
|
-
return client
|
|
255
|
-
})
|
|
256
|
-
}
|
|
257
|
-
|
|
258
246
|
addHook({ name: '@grpc/grpc-js', versions: ['>=1.0.3 <1.1.4'] }, patch(false))
|
|
259
247
|
|
|
260
248
|
addHook({ name: '@grpc/grpc-js', versions: ['>=1.0.3 <1.1.4'], file: 'build/src/make-client.js' }, client => {
|
|
@@ -4,8 +4,6 @@ const types = require('./types')
|
|
|
4
4
|
const { channel, addHook } = require('../helpers/instrument')
|
|
5
5
|
const shimmer = require('../../../datadog-shimmer')
|
|
6
6
|
|
|
7
|
-
const nodeMajor = parseInt(process.versions.node.split('.')[0])
|
|
8
|
-
|
|
9
7
|
const startChannel = channel('apm:grpc:server:request:start')
|
|
10
8
|
const asyncStartChannel = channel('apm:grpc:server:request:asyncStart')
|
|
11
9
|
const errorChannel = channel('apm:grpc:server:request:error')
|
|
@@ -17,17 +15,14 @@ const emitChannel = channel('apm:grpc:server:request:emit')
|
|
|
17
15
|
const OK = 0
|
|
18
16
|
const CANCELLED = 1
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
if (server.type === 'unary' && typeof args[1] !== 'function') return false
|
|
27
|
-
|
|
28
|
-
return true
|
|
29
|
-
}
|
|
18
|
+
const isValid = (server, args) => {
|
|
19
|
+
return Boolean(startChannel.hasSubscribers &&
|
|
20
|
+
server?.type &&
|
|
21
|
+
args[0] &&
|
|
22
|
+
(server.type === 'unary' ? typeof args[1] === 'function' : isEmitter(args[0])))
|
|
23
|
+
}
|
|
30
24
|
|
|
25
|
+
function wrapHandler (func, name) {
|
|
31
26
|
return function (call, callback) {
|
|
32
27
|
if (!isValid(this, arguments)) return func.apply(this, arguments)
|
|
33
28
|
|
|
@@ -152,14 +147,6 @@ function isEmitter (obj) {
|
|
|
152
147
|
return typeof obj.emit === 'function' && typeof obj.once === 'function'
|
|
153
148
|
}
|
|
154
149
|
|
|
155
|
-
if (nodeMajor <= 14) {
|
|
156
|
-
addHook({ name: 'grpc', versions: ['>=1.24.3'], file: 'src/server.js' }, server => {
|
|
157
|
-
shimmer.wrap(server.Server.prototype, 'register', wrapRegister)
|
|
158
|
-
|
|
159
|
-
return server
|
|
160
|
-
})
|
|
161
|
-
}
|
|
162
|
-
|
|
163
150
|
addHook({ name: '@grpc/grpc-js', versions: ['>=1.0.3'], file: 'build/src/server.js' }, server => {
|
|
164
151
|
shimmer.wrap(server.Server.prototype, 'register', wrapRegister)
|
|
165
152
|
|
|
@@ -10,27 +10,33 @@ const NM = 'node_modules/'
|
|
|
10
10
|
*/
|
|
11
11
|
module.exports = function extractPackageAndModulePath (fullPath) {
|
|
12
12
|
const nm = fullPath.lastIndexOf(NM)
|
|
13
|
-
if (nm
|
|
13
|
+
if (nm === -1) {
|
|
14
14
|
return { pkg: null, path: null }
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
const subPath = fullPath.
|
|
17
|
+
const subPath = fullPath.slice(nm + NM.length)
|
|
18
18
|
const firstSlash = subPath.indexOf('/')
|
|
19
19
|
|
|
20
|
-
const firstPath = fullPath.
|
|
20
|
+
const firstPath = fullPath.slice(0, nm + NM.length)
|
|
21
|
+
|
|
22
|
+
const firstSlashSubPath = subPath.slice(Math.max(0, firstSlash + 1))
|
|
21
23
|
|
|
22
24
|
if (subPath[0] === '@') {
|
|
23
|
-
const secondSlash =
|
|
25
|
+
const secondSlash = firstSlashSubPath.indexOf('/')
|
|
26
|
+
const pkg = subPath.slice(0, Math.max(0, firstSlash + 1 + secondSlash))
|
|
27
|
+
|
|
24
28
|
return {
|
|
25
|
-
pkg
|
|
26
|
-
path: subPath.
|
|
27
|
-
pkgJson: firstPath +
|
|
29
|
+
pkg,
|
|
30
|
+
path: subPath.slice(Math.max(0, firstSlash + 1 + secondSlash + 1)),
|
|
31
|
+
pkgJson: firstPath + pkg + '/package.json'
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
34
|
|
|
35
|
+
const pkg = subPath.slice(0, Math.max(0, firstSlash))
|
|
36
|
+
|
|
31
37
|
return {
|
|
32
|
-
pkg
|
|
33
|
-
path:
|
|
34
|
-
pkgJson: firstPath +
|
|
38
|
+
pkg,
|
|
39
|
+
path: firstSlashSubPath,
|
|
40
|
+
pkgJson: firstPath + pkg + '/package.json'
|
|
35
41
|
}
|
|
36
42
|
}
|
|
@@ -22,7 +22,7 @@ function Hook (modules, hookOptions, onrequire) {
|
|
|
22
22
|
this._patched = Object.create(null)
|
|
23
23
|
|
|
24
24
|
const safeHook = (moduleExports, moduleName, moduleBaseDir, moduleVersion) => {
|
|
25
|
-
const parts = [moduleBaseDir, moduleName].filter(
|
|
25
|
+
const parts = [moduleBaseDir, moduleName].filter(Boolean)
|
|
26
26
|
const filename = path.join(...parts)
|
|
27
27
|
|
|
28
28
|
if (this._patched[filename]) return moduleExports
|
|
@@ -61,6 +61,7 @@ module.exports = {
|
|
|
61
61
|
http2: () => require('../http2'),
|
|
62
62
|
https: () => require('../http'),
|
|
63
63
|
ioredis: () => require('../ioredis'),
|
|
64
|
+
iovalkey: () => require('../iovalkey'),
|
|
64
65
|
'jest-circus': () => require('../jest'),
|
|
65
66
|
'jest-config': () => require('../jest'),
|
|
66
67
|
'jest-environment-node': () => require('../jest'),
|
|
@@ -104,7 +105,6 @@ module.exports = {
|
|
|
104
105
|
nyc: () => require('../nyc'),
|
|
105
106
|
oracledb: () => require('../oracledb'),
|
|
106
107
|
openai: { esmFirst: true, fn: () => require('../openai') },
|
|
107
|
-
paperplane: () => require('../paperplane'),
|
|
108
108
|
passport: () => require('../passport'),
|
|
109
109
|
'passport-http': () => require('../passport-http'),
|
|
110
110
|
'passport-local': () => require('../passport-local'),
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const dc = require('dc-polyfill')
|
|
4
|
-
const satisfies = require('semifies')
|
|
5
4
|
const instrumentations = require('./instrumentations')
|
|
6
5
|
const { AsyncResource } = require('async_hooks')
|
|
7
6
|
|
|
@@ -34,43 +33,4 @@ exports.addHook = function addHook ({ name, versions, file, filePattern }, hook)
|
|
|
34
33
|
}
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
// https://nodejs.org/api/async_context.html#asyncresourcebindfn-thisarg
|
|
39
|
-
if (satisfies(process.versions.node, '>=17.8.0')) {
|
|
40
|
-
exports.AsyncResource = AsyncResource
|
|
41
|
-
} else {
|
|
42
|
-
exports.AsyncResource = class extends AsyncResource {
|
|
43
|
-
static bind (fn, type, thisArg) {
|
|
44
|
-
type = type || fn.name
|
|
45
|
-
return (new exports.AsyncResource(type || 'bound-anonymous-fn')).bind(fn, thisArg)
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
bind (fn, thisArg) {
|
|
49
|
-
let bound
|
|
50
|
-
if (thisArg === undefined) {
|
|
51
|
-
const resource = this
|
|
52
|
-
bound = function (...args) {
|
|
53
|
-
args.unshift(fn, this)
|
|
54
|
-
return Reflect.apply(resource.runInAsyncScope, resource, args)
|
|
55
|
-
}
|
|
56
|
-
} else {
|
|
57
|
-
bound = this.runInAsyncScope.bind(this, fn, thisArg)
|
|
58
|
-
}
|
|
59
|
-
Object.defineProperties(bound, {
|
|
60
|
-
length: {
|
|
61
|
-
configurable: true,
|
|
62
|
-
enumerable: false,
|
|
63
|
-
value: fn.length,
|
|
64
|
-
writable: false
|
|
65
|
-
},
|
|
66
|
-
asyncResource: {
|
|
67
|
-
configurable: true,
|
|
68
|
-
enumerable: true,
|
|
69
|
-
value: this,
|
|
70
|
-
writable: true
|
|
71
|
-
}
|
|
72
|
-
})
|
|
73
|
-
return bound
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
36
|
+
exports.AsyncResource = AsyncResource
|
|
@@ -26,7 +26,7 @@ const disabledInstrumentations = new Set(
|
|
|
26
26
|
// Check for DD_TRACE_<INTEGRATION>_ENABLED environment variables
|
|
27
27
|
for (const [key, value] of Object.entries(process.env)) {
|
|
28
28
|
const match = key.match(/^DD_TRACE_(.+)_ENABLED$/)
|
|
29
|
-
if (match && (value
|
|
29
|
+
if (match && (value?.toLowerCase() === 'false' || value === '0')) {
|
|
30
30
|
const integration = match[1].toLowerCase()
|
|
31
31
|
disabledInstrumentations.add(integration)
|
|
32
32
|
}
|
|
@@ -43,7 +43,7 @@ if (!disabledInstrumentations.has('process')) {
|
|
|
43
43
|
require('../process')
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
const HOOK_SYMBOL = Symbol('
|
|
46
|
+
const HOOK_SYMBOL = Symbol('hookExportsSet')
|
|
47
47
|
|
|
48
48
|
if (DD_TRACE_DEBUG && DD_TRACE_DEBUG.toLowerCase() !== 'false') {
|
|
49
49
|
checkRequireCache.checkForRequiredModules()
|
|
@@ -89,12 +89,13 @@ for (const packageName of names) {
|
|
|
89
89
|
fullFilePattern = filename(name, fullFilePattern)
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
-
// Create a
|
|
92
|
+
// Create a WeakSet associated with the hook function so that patches on the same moduleExport only happens once
|
|
93
93
|
// for example by instrumenting both dns and node:dns double the spans would be created
|
|
94
|
-
// since they both patch the same moduleExport, this
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
94
|
+
// since they both patch the same moduleExport, this WeakSet is used to mitigate that
|
|
95
|
+
// TODO(BridgeAR): Instead of using a WeakSet here, why not just use aliases for the hook in register?
|
|
96
|
+
// That way it would also not be duplicated. The actual name being used has to be identified else wise.
|
|
97
|
+
// Maybe it is also not important to know what name was actually used?
|
|
98
|
+
hook[HOOK_SYMBOL] ??= new WeakSet()
|
|
98
99
|
let matchesFile = false
|
|
99
100
|
|
|
100
101
|
matchesFile = moduleName === fullFilename
|
|
@@ -114,7 +115,7 @@ for (const packageName of names) {
|
|
|
114
115
|
log.error('Error getting version for "%s": %s', name, e.message, e)
|
|
115
116
|
continue
|
|
116
117
|
}
|
|
117
|
-
if (
|
|
118
|
+
if (namesAndSuccesses[`${name}@${version}`] === undefined && !file) {
|
|
118
119
|
// TODO If `file` is present, we might elsewhere instrument the result of the module
|
|
119
120
|
// for a version range that actually matches, so we can't assume that we're _not_
|
|
120
121
|
// going to instrument that. However, the way the data model around instrumentation
|
|
@@ -122,9 +123,7 @@ for (const packageName of names) {
|
|
|
122
123
|
// ignore this if there is a `file` in the hook. The thing to do here is rework
|
|
123
124
|
// everything so that we can be sure that there are _no_ instrumentations that it
|
|
124
125
|
// could match.
|
|
125
|
-
|
|
126
|
-
namesAndSuccesses[`${name}@${version}`] = false
|
|
127
|
-
}
|
|
126
|
+
namesAndSuccesses[`${name}@${version}`] = false
|
|
128
127
|
}
|
|
129
128
|
|
|
130
129
|
if (matchVersion(version, versions)) {
|
|
@@ -140,12 +139,16 @@ for (const packageName of names) {
|
|
|
140
139
|
loadChannel.publish({ name, version, file })
|
|
141
140
|
// Send the name and version of the module back to the callback because now addHook
|
|
142
141
|
// takes in an array of names so by passing the name the callback will know which module name is being used
|
|
143
|
-
|
|
144
|
-
//
|
|
145
|
-
|
|
142
|
+
// TODO(BridgeAR): This is only true in case the name is identical
|
|
143
|
+
// in all loads. If they deviate, the deviating name would not be
|
|
144
|
+
// picked up due to the unification. Check what modules actually use the name.
|
|
145
|
+
// TODO(BridgeAR): Only replace moduleExports if the hook returns a new value.
|
|
146
|
+
// This allows to reduce the instrumentation code (no return needed).
|
|
147
|
+
moduleExports = hook(moduleExports, version, name) ?? moduleExports
|
|
148
|
+
// Set the moduleExports in the hooks WeakSet
|
|
149
|
+
hook[HOOK_SYMBOL].add(moduleExports)
|
|
146
150
|
} catch (e) {
|
|
147
|
-
log.info('Error during ddtrace instrumentation of application, aborting.')
|
|
148
|
-
log.info(e)
|
|
151
|
+
log.info('Error during ddtrace instrumentation of application, aborting.', e)
|
|
149
152
|
telemetry('error', [
|
|
150
153
|
`error_type:${e.constructor.name}`,
|
|
151
154
|
`integration:${name}`,
|
|
@@ -185,7 +188,7 @@ function getVersion (moduleBaseDir) {
|
|
|
185
188
|
}
|
|
186
189
|
|
|
187
190
|
function filename (name, file) {
|
|
188
|
-
return [name, file].filter(
|
|
191
|
+
return [name, file].filter(Boolean).join('/')
|
|
189
192
|
}
|
|
190
193
|
|
|
191
194
|
// This function captures the instrumentation file name for a given package by parsing the hook require
|
|
@@ -212,7 +215,7 @@ function parseHookInstrumentationFileName (packageName) {
|
|
|
212
215
|
let moduleName = match[1]
|
|
213
216
|
// Remove leading '../' if present
|
|
214
217
|
if (moduleName.startsWith('../')) {
|
|
215
|
-
moduleName = moduleName.
|
|
218
|
+
moduleName = moduleName.slice(3)
|
|
216
219
|
}
|
|
217
220
|
return moduleName
|
|
218
221
|
}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
/* eslint-disable no-fallthrough */
|
|
4
4
|
|
|
5
5
|
const url = require('url')
|
|
6
|
+
const { errorMonitor } = require('events')
|
|
6
7
|
const { channel, addHook } = require('../helpers/instrument')
|
|
7
8
|
const shimmer = require('../../../datadog-shimmer')
|
|
8
9
|
|
|
@@ -25,6 +26,19 @@ function hookFn (http) {
|
|
|
25
26
|
return http
|
|
26
27
|
}
|
|
27
28
|
|
|
29
|
+
function combineOptions (inputURL, inputOptions) {
|
|
30
|
+
return inputOptions !== null && typeof inputOptions === 'object'
|
|
31
|
+
? Object.assign(inputURL || {}, inputOptions)
|
|
32
|
+
: inputURL
|
|
33
|
+
}
|
|
34
|
+
function normalizeHeaders (options) {
|
|
35
|
+
options.headers ??= {}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function normalizeCallback (inputOptions, callback, inputURL) {
|
|
39
|
+
return typeof inputOptions === 'function' ? [inputOptions, inputURL || {}] : [callback, inputOptions]
|
|
40
|
+
}
|
|
41
|
+
|
|
28
42
|
function patch (http, methodName) {
|
|
29
43
|
shimmer.wrap(http, methodName, instrumentRequest)
|
|
30
44
|
|
|
@@ -88,7 +102,7 @@ function patch (http, methodName) {
|
|
|
88
102
|
const res = arg
|
|
89
103
|
ctx.res = res
|
|
90
104
|
res.on('end', finish)
|
|
91
|
-
res.on(
|
|
105
|
+
res.on(errorMonitor, finish)
|
|
92
106
|
break
|
|
93
107
|
}
|
|
94
108
|
case 'connect':
|
|
@@ -142,30 +156,11 @@ function patch (http, methodName) {
|
|
|
142
156
|
return { uri, options, callback, originalUrl }
|
|
143
157
|
}
|
|
144
158
|
|
|
145
|
-
function combineOptions (inputURL, inputOptions) {
|
|
146
|
-
if (inputOptions !== null && typeof inputOptions === 'object') {
|
|
147
|
-
return Object.assign(inputURL || {}, inputOptions)
|
|
148
|
-
} else {
|
|
149
|
-
return inputURL
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
function normalizeHeaders (options) {
|
|
153
|
-
options.headers = options.headers || {}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function normalizeCallback (inputOptions, callback, inputURL) {
|
|
157
|
-
if (typeof inputOptions === 'function') {
|
|
158
|
-
return [inputOptions, inputURL || {}]
|
|
159
|
-
} else {
|
|
160
|
-
return [callback, inputOptions]
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
159
|
function normalizeOptions (inputURL) {
|
|
165
160
|
if (typeof inputURL === 'string') {
|
|
166
161
|
try {
|
|
167
162
|
return urlToOptions(new url.URL(inputURL))
|
|
168
|
-
} catch
|
|
163
|
+
} catch {
|
|
169
164
|
// eslint-disable-next-line n/no-deprecated-api
|
|
170
165
|
return url.parse(inputURL)
|
|
171
166
|
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const {
|
|
4
|
+
channel,
|
|
5
|
+
addHook,
|
|
6
|
+
AsyncResource
|
|
7
|
+
} = require('./helpers/instrument')
|
|
8
|
+
const shimmer = require('../../datadog-shimmer')
|
|
9
|
+
|
|
10
|
+
const startCh = channel('apm:iovalkey:command:start')
|
|
11
|
+
const finishCh = channel('apm:iovalkey:command:finish')
|
|
12
|
+
const errorCh = channel('apm:iovalkey:command:error')
|
|
13
|
+
|
|
14
|
+
addHook({ name: 'iovalkey', versions: ['>=0.0.1'] }, Valkey => {
|
|
15
|
+
shimmer.wrap(Valkey.prototype, 'sendCommand', sendCommand => function (command, stream) {
|
|
16
|
+
if (!startCh.hasSubscribers) return sendCommand.apply(this, arguments)
|
|
17
|
+
|
|
18
|
+
if (!command?.promise) return sendCommand.apply(this, arguments)
|
|
19
|
+
|
|
20
|
+
const options = this.options || {}
|
|
21
|
+
const connectionName = options.connectionName
|
|
22
|
+
const db = options.db
|
|
23
|
+
const connectionOptions = { host: options.host, port: options.port }
|
|
24
|
+
|
|
25
|
+
const asyncResource = new AsyncResource('bound-anonymous-fn')
|
|
26
|
+
return asyncResource.runInAsyncScope(() => {
|
|
27
|
+
startCh.publish({ db, command: command.name, args: command.args, connectionOptions, connectionName })
|
|
28
|
+
|
|
29
|
+
const onResolve = asyncResource.bind(() => finishCh.publish())
|
|
30
|
+
const onReject = asyncResource.bind(err => finish(finishCh, errorCh, err))
|
|
31
|
+
|
|
32
|
+
command.promise.then(onResolve, onReject)
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
return sendCommand.apply(this, arguments)
|
|
36
|
+
} catch (err) {
|
|
37
|
+
errorCh.publish(err)
|
|
38
|
+
|
|
39
|
+
throw err
|
|
40
|
+
}
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
return Valkey
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
function finish (finishCh, errorCh, error) {
|
|
47
|
+
if (error) {
|
|
48
|
+
errorCh.publish(error)
|
|
49
|
+
}
|
|
50
|
+
finishCh.publish()
|
|
51
|
+
}
|