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
|
@@ -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) {
|
|
@@ -9,8 +9,8 @@ const { setUserTags } = require('./set_user')
|
|
|
9
9
|
const log = require('../../log')
|
|
10
10
|
|
|
11
11
|
function isUserBlocked (user) {
|
|
12
|
-
const
|
|
13
|
-
return !!getBlockingAction(actions)
|
|
12
|
+
const results = waf.run({ persistent: { [USER_ID]: user.id } })
|
|
13
|
+
return !!getBlockingAction(results?.actions)
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
function checkUserAndSetUser (tracer, user) {
|
|
@@ -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
|
|
|
@@ -49,10 +47,6 @@ function trackRaspMetrics (store, metrics, raspRule) {
|
|
|
49
47
|
telemetryMetrics.rulesVersion = metrics.rulesVersion
|
|
50
48
|
}
|
|
51
49
|
|
|
52
|
-
if (metrics.ruleTriggered) {
|
|
53
|
-
telemetryMetrics.ruleTriggered = true
|
|
54
|
-
}
|
|
55
|
-
|
|
56
50
|
appsecMetrics.count('rasp.rule.eval', tags).inc(1)
|
|
57
51
|
|
|
58
52
|
if (metrics.errorCode) {
|
|
@@ -68,7 +62,6 @@ function trackRaspMetrics (store, metrics, raspRule) {
|
|
|
68
62
|
|
|
69
63
|
function trackRaspRuleMatch (store, raspRule, blockTriggered, blocked) {
|
|
70
64
|
const telemetryMetrics = store[DD_TELEMETRY_REQUEST_METRICS]
|
|
71
|
-
if (!telemetryMetrics.ruleTriggered) return
|
|
72
65
|
|
|
73
66
|
const tags = {
|
|
74
67
|
waf_version: telemetryMetrics.wafVersion,
|
|
@@ -82,10 +75,6 @@ function trackRaspRuleMatch (store, raspRule, blockTriggered, blocked) {
|
|
|
82
75
|
}
|
|
83
76
|
|
|
84
77
|
appsecMetrics.count('rasp.rule.match', tags).inc(1)
|
|
85
|
-
|
|
86
|
-
// this is needed to not count it twice for the same match
|
|
87
|
-
// but it also means it can only be called once per waf call even if there are multiple rasp match
|
|
88
|
-
telemetryMetrics.ruleTriggered = null
|
|
89
78
|
}
|
|
90
79
|
|
|
91
80
|
function trackRaspRuleSkipped (raspRule, reason) {
|
|
@@ -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 ?
|
|
@@ -19,7 +19,7 @@ class WAFContextWrapper {
|
|
|
19
19
|
this.rulesVersion = rulesVersion
|
|
20
20
|
this.knownAddresses = knownAddresses
|
|
21
21
|
this.addressesToSkip = new Set()
|
|
22
|
-
this.
|
|
22
|
+
this.cachedUserIdResults = new Map()
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
run ({ persistent, ephemeral }, raspRule) {
|
|
@@ -36,9 +36,9 @@ class WAFContextWrapper {
|
|
|
36
36
|
// TODO: make this universal
|
|
37
37
|
const userId = persistent?.[addresses.USER_ID] || ephemeral?.[addresses.USER_ID]
|
|
38
38
|
if (userId) {
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
return
|
|
39
|
+
const cachedResults = this.cachedUserIdResults.get(userId)
|
|
40
|
+
if (cachedResults) {
|
|
41
|
+
return cachedResults
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
|
|
@@ -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,12 +137,12 @@ 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)
|
|
144
144
|
|
|
145
|
-
return result
|
|
145
|
+
return result
|
|
146
146
|
} catch (err) {
|
|
147
147
|
log.error('[ASM] Error while running the AppSec WAF', err)
|
|
148
148
|
|
|
@@ -168,7 +168,7 @@ class WAFContextWrapper {
|
|
|
168
168
|
const parameter = match.parameters[k]
|
|
169
169
|
|
|
170
170
|
if (parameter?.address === addresses.USER_ID) {
|
|
171
|
-
this.
|
|
171
|
+
this.cachedUserIdResults.set(userId, result)
|
|
172
172
|
return
|
|
173
173
|
}
|
|
174
174
|
}
|
|
@@ -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
|
|