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
|
@@ -18,9 +18,23 @@ const zlib = require('zlib')
|
|
|
18
18
|
const { keepTrace } = require('../priority_sampler')
|
|
19
19
|
const { ASM } = require('../standalone/product')
|
|
20
20
|
|
|
21
|
+
const REQUEST_HEADER_TAG_PREFIX = 'http.request.headers.'
|
|
22
|
+
const RESPONSE_HEADER_TAG_PREFIX = 'http.response.headers.'
|
|
23
|
+
|
|
24
|
+
const COLLECTED_REQUEST_BODY_MAX_STRING_LENGTH = 4096
|
|
25
|
+
const COLLECTED_REQUEST_BODY_MAX_DEPTH = 20
|
|
26
|
+
const COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE = 256
|
|
27
|
+
|
|
21
28
|
// default limiter, configurable with setRateLimit()
|
|
22
29
|
let limiter = new Limiter(100)
|
|
23
30
|
|
|
31
|
+
const config = {
|
|
32
|
+
headersExtendedCollectionEnabled: false,
|
|
33
|
+
maxHeadersCollected: 0,
|
|
34
|
+
headersRedaction: false,
|
|
35
|
+
raspBodyCollection: false
|
|
36
|
+
}
|
|
37
|
+
|
|
24
38
|
const metricsQueue = new Map()
|
|
25
39
|
|
|
26
40
|
// following header lists are ordered in the same way the spec orders them, it doesn't matter but it's easier to compare
|
|
@@ -31,17 +45,6 @@ const contentHeaderList = [
|
|
|
31
45
|
'content-language'
|
|
32
46
|
]
|
|
33
47
|
|
|
34
|
-
const EVENT_HEADERS_MAP = mapHeaderAndTags([
|
|
35
|
-
...ipHeaderList,
|
|
36
|
-
'x-forwarded',
|
|
37
|
-
'forwarded',
|
|
38
|
-
'via',
|
|
39
|
-
...contentHeaderList,
|
|
40
|
-
'host',
|
|
41
|
-
'accept-encoding',
|
|
42
|
-
'accept-language'
|
|
43
|
-
], 'http.request.headers.')
|
|
44
|
-
|
|
45
48
|
const identificationHeaders = [
|
|
46
49
|
'x-amzn-trace-id',
|
|
47
50
|
'cloudfront-viewer-ja3-fingerprint',
|
|
@@ -53,18 +56,56 @@ const identificationHeaders = [
|
|
|
53
56
|
'akamai-user-risk'
|
|
54
57
|
]
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
const eventHeadersList = [
|
|
60
|
+
...ipHeaderList,
|
|
61
|
+
'x-forwarded',
|
|
62
|
+
'forwarded',
|
|
63
|
+
'via',
|
|
64
|
+
...contentHeaderList,
|
|
65
|
+
'host',
|
|
66
|
+
'accept-encoding',
|
|
67
|
+
'accept-language'
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
const requestHeadersList = [
|
|
58
71
|
'content-type',
|
|
59
72
|
'user-agent',
|
|
60
73
|
'accept',
|
|
61
74
|
...identificationHeaders
|
|
62
|
-
]
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
// these request headers are always collected - it breaks the expected spec orders
|
|
78
|
+
const REQUEST_HEADERS_MAP = mapHeaderAndTags(requestHeadersList, REQUEST_HEADER_TAG_PREFIX)
|
|
79
|
+
|
|
80
|
+
const EVENT_HEADERS_MAP = mapHeaderAndTags(eventHeadersList, REQUEST_HEADER_TAG_PREFIX)
|
|
81
|
+
|
|
82
|
+
const RESPONSE_HEADERS_MAP = mapHeaderAndTags(contentHeaderList, RESPONSE_HEADER_TAG_PREFIX)
|
|
83
|
+
|
|
84
|
+
const NON_EXTENDED_REQUEST_HEADERS = new Set([...requestHeadersList, ...eventHeadersList])
|
|
85
|
+
const NON_EXTENDED_RESPONSE_HEADERS = new Set(contentHeaderList)
|
|
86
|
+
|
|
87
|
+
function init (_config) {
|
|
88
|
+
limiter = new Limiter(_config.rateLimit)
|
|
89
|
+
config.headersExtendedCollectionEnabled = _config.extendedHeadersCollection.enabled
|
|
90
|
+
config.maxHeadersCollected = _config.extendedHeadersCollection.maxHeaders
|
|
91
|
+
config.headersRedaction = _config.extendedHeadersCollection.redaction
|
|
92
|
+
config.raspBodyCollection = _config.rasp.bodyCollection
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function formatHeaderName (name) {
|
|
96
|
+
return name
|
|
97
|
+
.trim()
|
|
98
|
+
.slice(0, 200)
|
|
99
|
+
.replace(/[^a-zA-Z0-9_\-:/]/g, '_')
|
|
100
|
+
.toLowerCase()
|
|
101
|
+
}
|
|
63
102
|
|
|
64
|
-
|
|
103
|
+
function getHeaderTag (tagPrefix, headerName) {
|
|
104
|
+
return `${tagPrefix}${formatHeaderName(headerName)}`
|
|
105
|
+
}
|
|
65
106
|
|
|
66
107
|
function mapHeaderAndTags (headerList, tagPrefix) {
|
|
67
|
-
return new Map(headerList.map(headerName => [headerName,
|
|
108
|
+
return new Map(headerList.map(headerName => [headerName, getHeaderTag(tagPrefix, headerName)]))
|
|
68
109
|
}
|
|
69
110
|
|
|
70
111
|
function filterHeaders (headers, map) {
|
|
@@ -82,12 +123,92 @@ function filterHeaders (headers, map) {
|
|
|
82
123
|
return result
|
|
83
124
|
}
|
|
84
125
|
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
126
|
+
function filterExtendedHeaders (headers, excludedHeaderNames, tagPrefix, limit = 0) {
|
|
127
|
+
const result = {}
|
|
128
|
+
|
|
129
|
+
if (!headers) return result
|
|
130
|
+
|
|
131
|
+
let counter = 0
|
|
132
|
+
for (const [headerName, headerValue] of Object.entries(headers)) {
|
|
133
|
+
if (counter >= limit) break
|
|
134
|
+
if (!excludedHeaderNames.has(headerName)) {
|
|
135
|
+
result[getHeaderTag(tagPrefix, headerName)] = '' + headerValue
|
|
136
|
+
counter++
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return result
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
function getCollectedHeaders (req, res, shouldCollectEventHeaders) {
|
|
144
|
+
// Mandatory
|
|
145
|
+
const mandatoryCollectedHeaders = filterHeaders(req.headers, REQUEST_HEADERS_MAP)
|
|
146
|
+
|
|
147
|
+
// Basic collection
|
|
148
|
+
if (!shouldCollectEventHeaders) return mandatoryCollectedHeaders
|
|
149
|
+
|
|
150
|
+
const responseHeaders = res.getHeaders()
|
|
151
|
+
|
|
152
|
+
const requestEventCollectedHeaders = filterHeaders(req.headers, EVENT_HEADERS_MAP)
|
|
153
|
+
const responseEventCollectedHeaders = filterHeaders(responseHeaders, RESPONSE_HEADERS_MAP)
|
|
154
|
+
|
|
155
|
+
if (!config.headersExtendedCollectionEnabled || config.headersRedaction) {
|
|
156
|
+
// Standard collection
|
|
157
|
+
return Object.assign(
|
|
158
|
+
mandatoryCollectedHeaders,
|
|
159
|
+
requestEventCollectedHeaders,
|
|
160
|
+
responseEventCollectedHeaders
|
|
161
|
+
)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Extended collection
|
|
165
|
+
const requestExtendedHeadersAvailableCount =
|
|
166
|
+
config.maxHeadersCollected -
|
|
167
|
+
Object.keys(mandatoryCollectedHeaders).length -
|
|
168
|
+
Object.keys(requestEventCollectedHeaders).length
|
|
169
|
+
|
|
170
|
+
const requestEventExtendedCollectedHeaders =
|
|
171
|
+
filterExtendedHeaders(
|
|
172
|
+
req.headers,
|
|
173
|
+
NON_EXTENDED_REQUEST_HEADERS,
|
|
174
|
+
REQUEST_HEADER_TAG_PREFIX,
|
|
175
|
+
requestExtendedHeadersAvailableCount
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
const responseExtendedHeadersAvailableCount =
|
|
179
|
+
config.maxHeadersCollected -
|
|
180
|
+
Object.keys(responseEventCollectedHeaders).length
|
|
181
|
+
|
|
182
|
+
const responseEventExtendedCollectedHeaders =
|
|
183
|
+
filterExtendedHeaders(
|
|
184
|
+
responseHeaders,
|
|
185
|
+
NON_EXTENDED_RESPONSE_HEADERS,
|
|
186
|
+
RESPONSE_HEADER_TAG_PREFIX,
|
|
187
|
+
responseExtendedHeadersAvailableCount
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
const headersTags = Object.assign(
|
|
191
|
+
mandatoryCollectedHeaders,
|
|
192
|
+
requestEventCollectedHeaders,
|
|
193
|
+
requestEventExtendedCollectedHeaders,
|
|
194
|
+
responseEventCollectedHeaders,
|
|
195
|
+
responseEventExtendedCollectedHeaders
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
// Check discarded headers
|
|
199
|
+
const requestHeadersCount = Object.keys(req.headers).length
|
|
200
|
+
if (requestHeadersCount > config.maxHeadersCollected) {
|
|
201
|
+
headersTags['_dd.appsec.request.header_collection.discarded'] =
|
|
202
|
+
requestHeadersCount - config.maxHeadersCollected
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const responseHeadersCount = Object.keys(responseHeaders).length
|
|
206
|
+
if (responseHeadersCount > config.maxHeadersCollected) {
|
|
207
|
+
headersTags['_dd.appsec.response.header_collection.discarded'] =
|
|
208
|
+
responseHeadersCount - config.maxHeadersCollected
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return headersTags
|
|
91
212
|
}
|
|
92
213
|
|
|
93
214
|
function reportWafInit (wafVersion, rulesVersion, diagnosticsRules = {}, success = false) {
|
|
@@ -163,17 +284,97 @@ function reportAttack (attackData) {
|
|
|
163
284
|
const currentJson = currentTags['_dd.appsec.json']
|
|
164
285
|
|
|
165
286
|
// merge JSON arrays without parsing them
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
287
|
+
const attackDataStr = JSON.stringify(attackData)
|
|
288
|
+
newTags['_dd.appsec.json'] = currentJson
|
|
289
|
+
? currentJson.slice(0, -2) + ',' + attackDataStr.slice(1) + '}'
|
|
290
|
+
: '{"triggers":' + attackDataStr + '}'
|
|
171
291
|
|
|
172
292
|
if (req.socket) {
|
|
173
293
|
newTags['network.client.ip'] = req.socket.remoteAddress
|
|
174
294
|
}
|
|
175
295
|
|
|
176
296
|
rootSpan.addTags(newTags)
|
|
297
|
+
|
|
298
|
+
if (config.raspBodyCollection && isRaspAttack(attackData)) {
|
|
299
|
+
reportRequestBody(rootSpan, req.body)
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function truncateRequestBody (target, depth = 0) {
|
|
304
|
+
let wasTruncated = false
|
|
305
|
+
|
|
306
|
+
switch (typeof target) {
|
|
307
|
+
case 'string':
|
|
308
|
+
if (target.length > COLLECTED_REQUEST_BODY_MAX_STRING_LENGTH) {
|
|
309
|
+
return { value: target.slice(0, COLLECTED_REQUEST_BODY_MAX_STRING_LENGTH), truncated: true }
|
|
310
|
+
}
|
|
311
|
+
return { value: target, truncated: false }
|
|
312
|
+
case 'object': {
|
|
313
|
+
if (target === null) {
|
|
314
|
+
return { value: target, truncated: false }
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (depth >= COLLECTED_REQUEST_BODY_MAX_DEPTH) {
|
|
318
|
+
return { truncated: true }
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
if (typeof target.toJSON === 'function') {
|
|
322
|
+
try {
|
|
323
|
+
return truncateRequestBody(target.toJSON(), depth + 1)
|
|
324
|
+
} catch {
|
|
325
|
+
return { truncated: false }
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
if (Array.isArray(target)) {
|
|
330
|
+
const maxArrayLength = Math.min(target.length, COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE)
|
|
331
|
+
wasTruncated = target.length > COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE
|
|
332
|
+
const truncatedArray = new Array(maxArrayLength)
|
|
333
|
+
for (let i = 0; i < maxArrayLength; i++) {
|
|
334
|
+
const { value, truncated } = truncateRequestBody(target[i], depth + 1)
|
|
335
|
+
if (truncated) wasTruncated = true
|
|
336
|
+
truncatedArray[i] = value
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return { value: truncatedArray, truncated: wasTruncated }
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const keys = Object.keys(target)
|
|
343
|
+
const maxKeysLength = Math.min(keys.length, COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE)
|
|
344
|
+
wasTruncated = keys.length > COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE
|
|
345
|
+
|
|
346
|
+
const truncatedObject = {}
|
|
347
|
+
for (let i = 0; i < maxKeysLength; i++) {
|
|
348
|
+
const key = keys[i]
|
|
349
|
+
const { value, truncated } = truncateRequestBody(target[key], depth + 1)
|
|
350
|
+
if (truncated) wasTruncated = true
|
|
351
|
+
truncatedObject[key] = value
|
|
352
|
+
}
|
|
353
|
+
return { value: truncatedObject, truncated: wasTruncated }
|
|
354
|
+
}
|
|
355
|
+
default:
|
|
356
|
+
return { value: target, truncated: false }
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function reportRequestBody (rootSpan, requestBody) {
|
|
361
|
+
if (!requestBody) return
|
|
362
|
+
|
|
363
|
+
if (!rootSpan.meta_struct) {
|
|
364
|
+
rootSpan.meta_struct = {}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
if (!rootSpan.meta_struct['http.request.body']) {
|
|
368
|
+
const { truncated, value } = truncateRequestBody(requestBody)
|
|
369
|
+
rootSpan.meta_struct['http.request.body'] = value
|
|
370
|
+
if (truncated) {
|
|
371
|
+
rootSpan.setTag('_dd.appsec.rasp.request_body_size.exceeded', 'true')
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function isRaspAttack (events) {
|
|
377
|
+
return events.some(e => e.rule?.tags?.module === 'rasp')
|
|
177
378
|
}
|
|
178
379
|
|
|
179
380
|
function isFingerprintDerivative (derivative) {
|
|
@@ -252,15 +453,9 @@ function finishRequest (req, res) {
|
|
|
252
453
|
|
|
253
454
|
incrementWafRequestsMetric(req)
|
|
254
455
|
|
|
255
|
-
// collect some headers even when no attack is detected
|
|
256
|
-
const mandatoryTags = filterHeaders(req.headers, REQUEST_HEADERS_MAP)
|
|
257
|
-
rootSpan.addTags(mandatoryTags)
|
|
258
|
-
|
|
259
456
|
const tags = rootSpan.context()._tags
|
|
260
|
-
if (!shouldCollectEventHeaders(tags)) return
|
|
261
457
|
|
|
262
|
-
const newTags =
|
|
263
|
-
Object.assign(newTags, filterHeaders(req.headers, EVENT_HEADERS_MAP))
|
|
458
|
+
const newTags = getCollectedHeaders(req, res, shouldCollectEventHeaders(tags))
|
|
264
459
|
|
|
265
460
|
if (tags['appsec.event'] === 'true' && typeof req.route?.path === 'string') {
|
|
266
461
|
newTags['http.endpoint'] = req.route.path
|
|
@@ -283,13 +478,11 @@ function shouldCollectEventHeaders (tags = {}) {
|
|
|
283
478
|
return false
|
|
284
479
|
}
|
|
285
480
|
|
|
286
|
-
function setRateLimit (rateLimit) {
|
|
287
|
-
limiter = new Limiter(rateLimit)
|
|
288
|
-
}
|
|
289
|
-
|
|
290
481
|
module.exports = {
|
|
291
482
|
metricsQueue,
|
|
483
|
+
init,
|
|
292
484
|
filterHeaders,
|
|
485
|
+
filterExtendedHeaders,
|
|
293
486
|
formatHeaderName,
|
|
294
487
|
reportWafInit,
|
|
295
488
|
reportMetrics,
|
|
@@ -298,6 +491,6 @@ module.exports = {
|
|
|
298
491
|
reportRaspRuleSkipped: updateRaspRuleSkippedMetricTags,
|
|
299
492
|
reportDerivatives,
|
|
300
493
|
finishRequest,
|
|
301
|
-
|
|
302
|
-
|
|
494
|
+
mapHeaderAndTags,
|
|
495
|
+
truncateRequestBody
|
|
303
496
|
}
|
|
@@ -185,7 +185,7 @@ class SpyMap extends Map {
|
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
function concatArrays (files) {
|
|
188
|
-
return
|
|
188
|
+
return [...files.values()].flat()
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
/*
|
|
@@ -209,7 +209,7 @@ function mergeRulesData (files) {
|
|
|
209
209
|
}
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
|
-
return
|
|
212
|
+
return [...mergedRulesData.values()]
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
function rulesReducer (existingEntries, rulesDataEntry) {
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const {
|
|
4
|
-
|
|
5
|
-
const ddBasePath = calculateDDBasePath(__dirname)
|
|
3
|
+
const { ddBasePath } = require('../util')
|
|
6
4
|
|
|
7
5
|
const LIBRARY_FRAMES_BUFFER = 20
|
|
8
6
|
|
|
@@ -23,7 +21,7 @@ function getCallSiteList (maxDepth = 100) {
|
|
|
23
21
|
Error.prepareStackTrace = function (_, callsites) {
|
|
24
22
|
callsiteList = callsites
|
|
25
23
|
}
|
|
26
|
-
const e = new Error()
|
|
24
|
+
const e = new Error('message')
|
|
27
25
|
e.stack
|
|
28
26
|
} finally {
|
|
29
27
|
Error.prepareStackTrace = previousPrepareStackTrace
|
|
@@ -21,14 +21,12 @@ function addRaspRequestMetrics (store, { duration, durationExt, wafTimeout, erro
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
if (errorCode) {
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode = store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode
|
|
25
|
+
? Math.max(
|
|
26
26
|
errorCode,
|
|
27
27
|
store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode
|
|
28
28
|
)
|
|
29
|
-
|
|
30
|
-
store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode = errorCode
|
|
31
|
-
}
|
|
29
|
+
: errorCode
|
|
32
30
|
}
|
|
33
31
|
}
|
|
34
32
|
|
|
@@ -22,14 +22,12 @@ function addWafRequestMetrics (store, { duration, durationExt, wafTimeout, error
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
if (errorCode) {
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode = store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode
|
|
26
|
+
? Math.max(
|
|
27
27
|
errorCode,
|
|
28
28
|
store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode
|
|
29
29
|
)
|
|
30
|
-
|
|
31
|
-
store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode = errorCode
|
|
32
|
-
}
|
|
30
|
+
: errorCode
|
|
33
31
|
}
|
|
34
32
|
}
|
|
35
33
|
|
|
@@ -40,12 +40,10 @@ function setCollectionMode (mode, overwrite = true) {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
function obfuscateIfNeeded (str) {
|
|
43
|
-
|
|
43
|
+
return collectionMode === 'anonymization'
|
|
44
44
|
// get first 16 bytes of sha256 hash in lowercase hex
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return str
|
|
48
|
-
}
|
|
45
|
+
? 'anon_' + crypto.createHash('sha256').update(str).digest().toString('hex', 0, 16).toLowerCase()
|
|
46
|
+
: str
|
|
49
47
|
}
|
|
50
48
|
|
|
51
49
|
// TODO: should we find other ways to get the user ID ?
|
|
@@ -102,7 +102,7 @@ class WAFContextWrapper {
|
|
|
102
102
|
|
|
103
103
|
const end = process.hrtime.bigint()
|
|
104
104
|
|
|
105
|
-
metrics.durationExt = parseInt(end - start) / 1e3
|
|
105
|
+
metrics.durationExt = Number.parseInt(end - start) / 1e3
|
|
106
106
|
|
|
107
107
|
if (typeof result.errorCode === 'number' && result.errorCode < 0) {
|
|
108
108
|
const error = new Error('WAF code error')
|
|
@@ -137,7 +137,7 @@ class WAFContextWrapper {
|
|
|
137
137
|
metrics.wafTimeout = result.timeout
|
|
138
138
|
|
|
139
139
|
if (ruleTriggered) {
|
|
140
|
-
Reporter.reportAttack(
|
|
140
|
+
Reporter.reportAttack(result.events)
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
Reporter.reportDerivatives(result.derivatives)
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
// eslint-disable-next-line @stylistic/js/max-len
|
|
4
3
|
// Modeled after https://github.com/DataDog/libdatadog/blob/f3994857a59bb5679a65967138c5a3aec418a65f/ddcommon/src/azure_app_services.rs
|
|
5
4
|
|
|
6
5
|
const os = require('os')
|
|
@@ -13,7 +12,6 @@ function extractSubscriptionID (ownerName) {
|
|
|
13
12
|
return subId
|
|
14
13
|
}
|
|
15
14
|
}
|
|
16
|
-
return undefined
|
|
17
15
|
}
|
|
18
16
|
|
|
19
17
|
function extractResourceGroup (ownerName) {
|
|
@@ -22,7 +20,7 @@ function extractResourceGroup (ownerName) {
|
|
|
22
20
|
|
|
23
21
|
function buildResourceID (subscriptionID, siteName, resourceGroup) {
|
|
24
22
|
if (subscriptionID === undefined || siteName === undefined || resourceGroup === undefined) {
|
|
25
|
-
return
|
|
23
|
+
return
|
|
26
24
|
}
|
|
27
25
|
return `/subscriptions/${subscriptionID}/resourcegroups/${resourceGroup}/providers/microsoft.web/sites/${siteName}`
|
|
28
26
|
.toLowerCase()
|
|
@@ -79,18 +77,15 @@ function buildMetadata () {
|
|
|
79
77
|
function getAzureAppMetadata () {
|
|
80
78
|
// DD_AZURE_APP_SERVICES is an environment variable introduced by the .NET APM team and is set automatically for
|
|
81
79
|
// anyone using the Datadog APM Extensions (.NET, Java, or Node) for Windows Azure App Services
|
|
82
|
-
// eslint-disable-next-line @stylistic/js/max-len
|
|
83
80
|
// See: https://github.com/DataDog/datadog-aas-extension/blob/01f94b5c28b7fa7a9ab264ca28bd4e03be603900/node/src/applicationHost.xdt#L20-L21
|
|
84
|
-
return process.env.DD_AZURE_APP_SERVICES
|
|
81
|
+
return process.env.DD_AZURE_APP_SERVICES === undefined ? undefined : buildMetadata()
|
|
85
82
|
}
|
|
86
83
|
|
|
87
84
|
function getAzureFunctionMetadata () {
|
|
88
85
|
return getIsAzureFunction() ? buildMetadata() : undefined
|
|
89
86
|
}
|
|
90
87
|
|
|
91
|
-
// eslint-disable-next-line @stylistic/js/max-len
|
|
92
88
|
// Modeled after https://github.com/DataDog/libdatadog/blob/92272e90a7919f07178f3246ef8f82295513cfed/profiling/src/exporter/mod.rs#L187
|
|
93
|
-
// eslint-disable-next-line @stylistic/js/max-len
|
|
94
89
|
// and https://github.com/DataDog/libdatadog/blob/f3994857a59bb5679a65967138c5a3aec418a65f/trace-utils/src/trace_utils.rs#L533
|
|
95
90
|
function getAzureTagsFromMetadata (metadata) {
|
|
96
91
|
if (metadata === undefined) {
|
|
@@ -144,7 +144,7 @@ class TestVisDynamicInstrumentation {
|
|
|
144
144
|
|
|
145
145
|
let dynamicInstrumentation
|
|
146
146
|
|
|
147
|
-
module.exports = (config)
|
|
147
|
+
module.exports = function createAndGetTestVisDynamicInstrumentation (config) {
|
|
148
148
|
if (dynamicInstrumentation) {
|
|
149
149
|
return dynamicInstrumentation
|
|
150
150
|
}
|
|
@@ -75,12 +75,12 @@ breakpointSetChannel.on('message', async (probe) => {
|
|
|
75
75
|
async function removeBreakpoint (probeId) {
|
|
76
76
|
if (!sessionStarted) {
|
|
77
77
|
// We should not get in this state, but abort if we do, so the code doesn't fail unexpected
|
|
78
|
-
throw Error(`Cannot remove probe ${probeId}: Debugger not started`)
|
|
78
|
+
throw new Error(`Cannot remove probe ${probeId}: Debugger not started`)
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
const breakpointId = probeIdToBreakpointId.get(probeId)
|
|
82
82
|
if (!breakpointId) {
|
|
83
|
-
throw Error(`Unknown probe id: ${probeId}`)
|
|
83
|
+
throw new Error(`Unknown probe id: ${probeId}`)
|
|
84
84
|
}
|
|
85
85
|
await session.post('Debugger.removeBreakpoint', { breakpointId })
|
|
86
86
|
probeIdToBreakpointId.delete(probeId)
|
|
@@ -16,17 +16,17 @@ function getLatestEvpProxyVersion (err, agentInfo) {
|
|
|
16
16
|
return agentInfo.endpoints.reduce((acc, endpoint) => {
|
|
17
17
|
if (endpoint.includes(AGENT_EVP_PROXY_PATH_PREFIX)) {
|
|
18
18
|
const version = Number(endpoint.replace(AGENT_EVP_PROXY_PATH_REGEX, '$1'))
|
|
19
|
-
if (isNaN(version)) {
|
|
19
|
+
if (Number.isNaN(version)) {
|
|
20
20
|
return acc
|
|
21
21
|
}
|
|
22
|
-
return version
|
|
22
|
+
return Math.max(version, acc)
|
|
23
23
|
}
|
|
24
24
|
return acc
|
|
25
25
|
}, 0)
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
function getCanForwardDebuggerLogs (err, agentInfo) {
|
|
29
|
-
return !err && agentInfo.endpoints.
|
|
29
|
+
return !err && agentInfo.endpoints.includes(AGENT_DEBUGGER_INPUT)
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
class AgentProxyCiVisibilityExporter extends CiVisibilityExporter {
|
|
@@ -27,7 +27,7 @@ class DynamicInstrumentationLogsWriter extends BaseWriter {
|
|
|
27
27
|
'Content-Type': 'application/json'
|
|
28
28
|
},
|
|
29
29
|
// TODO: what's a good value for timeout for the logs intake?
|
|
30
|
-
timeout: this.timeout ||
|
|
30
|
+
timeout: this.timeout || 15_000,
|
|
31
31
|
url: this._url
|
|
32
32
|
}
|
|
33
33
|
|
|
@@ -31,7 +31,7 @@ function getIsTestSessionTrace (trace) {
|
|
|
31
31
|
)
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
const GIT_UPLOAD_TIMEOUT =
|
|
34
|
+
const GIT_UPLOAD_TIMEOUT = 60_000 // 60 seconds
|
|
35
35
|
const CAN_USE_CI_VIS_PROTOCOL_TIMEOUT = GIT_UPLOAD_TIMEOUT
|
|
36
36
|
|
|
37
37
|
class CiVisibilityExporter extends AgentInfoExporter {
|
|
@@ -216,7 +216,8 @@ class CiVisibilityExporter extends AgentInfoExporter {
|
|
|
216
216
|
isDiEnabled,
|
|
217
217
|
isKnownTestsEnabled,
|
|
218
218
|
isTestManagementEnabled,
|
|
219
|
-
testManagementAttemptToFixRetries
|
|
219
|
+
testManagementAttemptToFixRetries,
|
|
220
|
+
isImpactedTestsEnabled
|
|
220
221
|
} = remoteConfiguration
|
|
221
222
|
return {
|
|
222
223
|
isCodeCoverageEnabled,
|
|
@@ -232,7 +233,8 @@ class CiVisibilityExporter extends AgentInfoExporter {
|
|
|
232
233
|
isKnownTestsEnabled,
|
|
233
234
|
isTestManagementEnabled: isTestManagementEnabled && this._config.isTestManagementEnabled,
|
|
234
235
|
testManagementAttemptToFixRetries:
|
|
235
|
-
testManagementAttemptToFixRetries ?? this._config.testManagementAttemptToFixRetries
|
|
236
|
+
testManagementAttemptToFixRetries ?? this._config.testManagementAttemptToFixRetries,
|
|
237
|
+
isImpactedTestsEnabled: isImpactedTestsEnabled && this._config.isImpactedTestsEnabled
|
|
236
238
|
}
|
|
237
239
|
}
|
|
238
240
|
|
|
@@ -336,7 +338,7 @@ class CiVisibilityExporter extends AgentInfoExporter {
|
|
|
336
338
|
this._writer,
|
|
337
339
|
this._coverageWriter,
|
|
338
340
|
this._logsWriter
|
|
339
|
-
].filter(
|
|
341
|
+
].filter(Boolean)
|
|
340
342
|
|
|
341
343
|
let remaining = writers.length
|
|
342
344
|
|
|
@@ -50,7 +50,7 @@ function getCommonRequestOptions (url) {
|
|
|
50
50
|
headers: {
|
|
51
51
|
'dd-api-key': process.env.DATADOG_API_KEY || process.env.DD_API_KEY
|
|
52
52
|
},
|
|
53
|
-
timeout:
|
|
53
|
+
timeout: 15_000,
|
|
54
54
|
url
|
|
55
55
|
}
|
|
56
56
|
}
|
|
@@ -148,7 +148,7 @@ function uploadPackFile ({ url, isEvpProxy, evpProxyPrefix, packFileToUpload, re
|
|
|
148
148
|
filename,
|
|
149
149
|
contentType: 'application/octet-stream'
|
|
150
150
|
})
|
|
151
|
-
} catch
|
|
151
|
+
} catch {
|
|
152
152
|
callback(new Error(`Could not read "${packFileToUpload}"`))
|
|
153
153
|
return
|
|
154
154
|
}
|
|
@@ -25,7 +25,6 @@ class Writer {
|
|
|
25
25
|
_sendPayload (data, onDone = () => {}) {
|
|
26
26
|
// ## Jest
|
|
27
27
|
// Only available when `child_process` is used for the jest worker.
|
|
28
|
-
// eslint-disable-next-line
|
|
29
28
|
// https://github.com/facebook/jest/blob/bb39cb2c617a3334bf18daeca66bd87b7ccab28b/packages/jest-worker/README.md#experimental-worker
|
|
30
29
|
// If worker_threads is used, this will not work
|
|
31
30
|
// TODO: make it compatible with worker_threads
|
|
@@ -33,7 +32,6 @@ class Writer {
|
|
|
33
32
|
// ## Cucumber
|
|
34
33
|
// This reports to the test's main process the same way test data is reported by Cucumber
|
|
35
34
|
// See cucumber code:
|
|
36
|
-
// eslint-disable-next-line
|
|
37
35
|
// https://github.com/cucumber/cucumber-js/blob/5ce371870b677fe3d1a14915dc535688946f734c/src/runtime/parallel/run_worker.ts#L13
|
|
38
36
|
if (process.send) { // it only works if process.send is available
|
|
39
37
|
process.send([this._interprocessCode, data], () => {
|