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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
'use strict'
|
|
2
|
+
/* eslint-disable unicorn/prefer-string-slice */
|
|
2
3
|
|
|
3
4
|
const log = require('../../../../log')
|
|
4
5
|
const vulnerabilities = require('../../vulnerabilities')
|
|
@@ -82,7 +83,7 @@ class SensitiveHandler {
|
|
|
82
83
|
|
|
83
84
|
for (let i = 0; i < value.length; i++) {
|
|
84
85
|
if (nextTainted != null && nextTainted.start === i) {
|
|
85
|
-
this.writeValuePart(valueParts, value.
|
|
86
|
+
this.writeValuePart(valueParts, value.slice(start, i), sourceIndex)
|
|
86
87
|
|
|
87
88
|
sourceIndex = sourcesIndexes[nextTaintedIndex]
|
|
88
89
|
|
|
@@ -113,16 +114,14 @@ class SensitiveHandler {
|
|
|
113
114
|
nextSensitive = entries.length > 0 ? entries[0] : null
|
|
114
115
|
}
|
|
115
116
|
|
|
116
|
-
if (this.isSensibleSource(sources[sourceIndex])) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
sources[sourceIndex].redacted = true
|
|
121
|
-
}
|
|
117
|
+
if (this.isSensibleSource(sources[sourceIndex]) && !sources[sourceIndex].redacted) {
|
|
118
|
+
redactedSources.push(sourceIndex)
|
|
119
|
+
sources[sourceIndex].pattern = ''.padEnd(sources[sourceIndex].value.length, REDACTED_SOURCE_BUFFER)
|
|
120
|
+
sources[sourceIndex].redacted = true
|
|
122
121
|
}
|
|
123
122
|
|
|
124
|
-
if (redactedSources.
|
|
125
|
-
const partValue = value.
|
|
123
|
+
if (redactedSources.includes(sourceIndex)) {
|
|
124
|
+
const partValue = value.slice(i, i + (nextTainted.end - nextTainted.start))
|
|
126
125
|
this.writeRedactedValuePart(
|
|
127
126
|
valueParts,
|
|
128
127
|
partValue.length,
|
|
@@ -135,7 +134,7 @@ class SensitiveHandler {
|
|
|
135
134
|
redactedSourcesContext[sourceIndex] = []
|
|
136
135
|
} else {
|
|
137
136
|
const substringEnd = Math.min(nextTainted.end, value.length)
|
|
138
|
-
this.writeValuePart(valueParts, value.
|
|
137
|
+
this.writeValuePart(valueParts, value.slice(nextTainted.start, substringEnd), sourceIndex)
|
|
139
138
|
}
|
|
140
139
|
|
|
141
140
|
start = i + (nextTainted.end - nextTainted.start)
|
|
@@ -144,7 +143,7 @@ class SensitiveHandler {
|
|
|
144
143
|
nextTaintedIndex++
|
|
145
144
|
sourceIndex = null
|
|
146
145
|
} else if (nextSensitive != null && nextSensitive.start === i) {
|
|
147
|
-
this.writeValuePart(valueParts, value.
|
|
146
|
+
this.writeValuePart(valueParts, value.slice(start, i), sourceIndex)
|
|
148
147
|
if (nextTainted != null && intersects(nextSensitive, nextTainted)) {
|
|
149
148
|
sourceIndex = sourcesIndexes[nextTaintedIndex]
|
|
150
149
|
|
|
@@ -171,7 +170,7 @@ class SensitiveHandler {
|
|
|
171
170
|
}
|
|
172
171
|
|
|
173
172
|
if (start < value.length) {
|
|
174
|
-
this.writeValuePart(valueParts, value.
|
|
173
|
+
this.writeValuePart(valueParts, value.slice(start))
|
|
175
174
|
}
|
|
176
175
|
|
|
177
176
|
return { redactedValueParts: valueParts, redactedSources }
|
|
@@ -197,10 +196,10 @@ class SensitiveHandler {
|
|
|
197
196
|
|
|
198
197
|
writeValuePart (valueParts, value, source) {
|
|
199
198
|
if (value.length > 0) {
|
|
200
|
-
if (source
|
|
201
|
-
valueParts.push({ value, source })
|
|
202
|
-
} else {
|
|
199
|
+
if (source == null) {
|
|
203
200
|
valueParts.push({ value })
|
|
201
|
+
} else {
|
|
202
|
+
valueParts.push({ value, source })
|
|
204
203
|
}
|
|
205
204
|
}
|
|
206
205
|
}
|
|
@@ -214,7 +213,9 @@ class SensitiveHandler {
|
|
|
214
213
|
sourceRedactionContext,
|
|
215
214
|
isSensibleSource
|
|
216
215
|
) {
|
|
217
|
-
if (sourceIndex
|
|
216
|
+
if (sourceIndex == null) {
|
|
217
|
+
valueParts.push({ redacted: true })
|
|
218
|
+
} else {
|
|
218
219
|
const placeholder = source.value.includes(partValue)
|
|
219
220
|
? source.pattern
|
|
220
221
|
: '*'.repeat(length)
|
|
@@ -252,9 +253,9 @@ class SensitiveHandler {
|
|
|
252
253
|
_value.substring(_sourceRedactionContext.start - offset, _sourceRedactionContext.end - offset)
|
|
253
254
|
const indexOfPartValueInPattern = source.value.indexOf(sensitive)
|
|
254
255
|
|
|
255
|
-
const pattern = indexOfPartValueInPattern
|
|
256
|
-
? placeholder.substring(
|
|
257
|
-
: placeholder.substring(
|
|
256
|
+
const pattern = indexOfPartValueInPattern === -1
|
|
257
|
+
? placeholder.substring(_sourceRedactionContext.start, _sourceRedactionContext.end)
|
|
258
|
+
: placeholder.substring(indexOfPartValueInPattern, indexOfPartValueInPattern + sensitive.length)
|
|
258
259
|
|
|
259
260
|
valueParts.push({
|
|
260
261
|
redacted: true,
|
|
@@ -262,7 +263,7 @@ class SensitiveHandler {
|
|
|
262
263
|
pattern
|
|
263
264
|
})
|
|
264
265
|
|
|
265
|
-
_value = _value.
|
|
266
|
+
_value = _value.slice(pattern.length)
|
|
266
267
|
offset += pattern.length
|
|
267
268
|
})
|
|
268
269
|
|
|
@@ -273,8 +274,6 @@ class SensitiveHandler {
|
|
|
273
274
|
})
|
|
274
275
|
}
|
|
275
276
|
}
|
|
276
|
-
} else {
|
|
277
|
-
valueParts.push({ redacted: true })
|
|
278
277
|
}
|
|
279
278
|
}
|
|
280
279
|
|
|
@@ -282,7 +281,7 @@ class SensitiveHandler {
|
|
|
282
281
|
if (redactionNamePattern) {
|
|
283
282
|
try {
|
|
284
283
|
this._namePattern = new RegExp(redactionNamePattern, 'gmi')
|
|
285
|
-
} catch
|
|
284
|
+
} catch {
|
|
286
285
|
log.warn('[ASM] Redaction name pattern is not valid')
|
|
287
286
|
}
|
|
288
287
|
}
|
|
@@ -290,7 +289,7 @@ class SensitiveHandler {
|
|
|
290
289
|
if (redactionValuePattern) {
|
|
291
290
|
try {
|
|
292
291
|
this._valuePattern = new RegExp(redactionValuePattern, 'gmi')
|
|
293
|
-
} catch
|
|
292
|
+
} catch {
|
|
294
293
|
log.warn('[ASM] Redaction value pattern is not valid')
|
|
295
294
|
}
|
|
296
295
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// eslint-disable-next-line @stylistic/
|
|
1
|
+
// eslint-disable-next-line @stylistic/max-len
|
|
2
2
|
const DEFAULT_IAST_REDACTION_NAME_PATTERN = '(?:p(?:ass)?w(?:or)?d|pass(?:_?phrase)?|secret|(?:api_?|private_?|public_?|access_?|secret_?)key(?:_?id)?|token|consumer_?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?|(?:sur|last)name|user(?:name)?|address|e?mail)'
|
|
3
|
-
// eslint-disable-next-line @stylistic/
|
|
4
|
-
const DEFAULT_IAST_REDACTION_VALUE_PATTERN =
|
|
3
|
+
// eslint-disable-next-line @stylistic/max-len
|
|
4
|
+
const DEFAULT_IAST_REDACTION_VALUE_PATTERN = String.raw`(?:bearer\s+[a-z0-9\._\-]+|glpat-[\w\-]{20}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L][\w=\-]+\.ey[I-L][\w=\-]+(?:\.[\w.+/=\-]+)?|(?:[\-]{5}BEGIN[a-z\s]+PRIVATE\sKEY[\-]{5}[^\-]+[\-]{5}END[a-z\s]+PRIVATE\sKEY[\-]{5}|ssh-rsa\s*[a-z0-9/\.+]{100,})|[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,})`
|
|
5
5
|
|
|
6
6
|
module.exports = {
|
|
7
7
|
DEFAULT_IAST_REDACTION_NAME_PATTERN,
|
|
@@ -57,14 +57,14 @@ class VulnerabilityFormatter {
|
|
|
57
57
|
|
|
58
58
|
evidence.ranges.forEach((range, rangeIndex) => {
|
|
59
59
|
if (fromIndex < range.start) {
|
|
60
|
-
valueParts.push({ value: evidence.value.
|
|
60
|
+
valueParts.push({ value: evidence.value.slice(fromIndex, range.start) })
|
|
61
61
|
}
|
|
62
|
-
valueParts.push({ value: evidence.value.
|
|
62
|
+
valueParts.push({ value: evidence.value.slice(range.start, range.end), source: sourcesIndexes[rangeIndex] })
|
|
63
63
|
fromIndex = range.end
|
|
64
64
|
})
|
|
65
65
|
|
|
66
66
|
if (fromIndex < evidence.value.length) {
|
|
67
|
-
valueParts.push({ value: evidence.value.
|
|
67
|
+
valueParts.push({ value: evidence.value.slice(fromIndex) })
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
return { valueParts }
|
|
@@ -72,7 +72,7 @@ class VulnerabilityFormatter {
|
|
|
72
72
|
|
|
73
73
|
formatEvidence (type, evidence, sourcesIndexes, sources) {
|
|
74
74
|
if (evidence.value === undefined) {
|
|
75
|
-
return
|
|
75
|
+
return
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
return this._redactVulnearbilities
|
|
@@ -7,7 +7,7 @@ const STRINGIFY_RANGE_KEY = 'DD_' + crypto.randomBytes(20).toString('hex')
|
|
|
7
7
|
const STRINGIFY_SENSITIVE_KEY = STRINGIFY_RANGE_KEY + 'SENSITIVE'
|
|
8
8
|
const STRINGIFY_SENSITIVE_NOT_STRING_KEY = STRINGIFY_SENSITIVE_KEY + 'NOTSTRING'
|
|
9
9
|
|
|
10
|
-
// eslint-disable-next-line @stylistic/
|
|
10
|
+
// eslint-disable-next-line @stylistic/max-len
|
|
11
11
|
const KEYS_REGEX_WITH_SENSITIVE_RANGES = new RegExp(`(?:"(${STRINGIFY_RANGE_KEY}_\\d+_))|(?:"(${STRINGIFY_SENSITIVE_KEY}_\\d+_(\\d+)_))|("${STRINGIFY_SENSITIVE_NOT_STRING_KEY}_\\d+_([\\s0-9.a-zA-Z]*)")`, 'gm')
|
|
12
12
|
const KEYS_REGEX_WITHOUT_SENSITIVE_RANGES = new RegExp(`"(${STRINGIFY_RANGE_KEY}_\\d+_)`, 'gm')
|
|
13
13
|
|
|
@@ -99,22 +99,17 @@ function stringifyWithRanges (obj, objRanges, loadSensitiveRanges = false) {
|
|
|
99
99
|
} else {
|
|
100
100
|
currentLevelClone[key] = val
|
|
101
101
|
}
|
|
102
|
-
} else if (Array.isArray(val)) {
|
|
103
|
-
currentLevelClone[key] = []
|
|
104
102
|
} else {
|
|
105
|
-
currentLevelClone[key] = {}
|
|
103
|
+
currentLevelClone[key] = Array.isArray(val) ? [] : {}
|
|
106
104
|
}
|
|
107
105
|
})
|
|
108
106
|
|
|
109
107
|
value = JSON.stringify(cloneObj, null, 2)
|
|
110
108
|
|
|
111
109
|
if (counter > 0) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
} else {
|
|
116
|
-
keysRegex = KEYS_REGEX_WITHOUT_SENSITIVE_RANGES
|
|
117
|
-
}
|
|
110
|
+
const keysRegex = loadSensitiveRanges
|
|
111
|
+
? KEYS_REGEX_WITH_SENSITIVE_RANGES
|
|
112
|
+
: KEYS_REGEX_WITHOUT_SENSITIVE_RANGES
|
|
118
113
|
keysRegex.lastIndex = 0
|
|
119
114
|
|
|
120
115
|
let regexRes = keysRegex.exec(value)
|
|
@@ -141,7 +136,7 @@ function stringifyWithRanges (obj, objRanges, loadSensitiveRanges = false) {
|
|
|
141
136
|
|
|
142
137
|
sensitiveRanges.push({
|
|
143
138
|
start: offset,
|
|
144
|
-
end: offset + parseInt(regexRes[3])
|
|
139
|
+
end: offset + Number.parseInt(regexRes[3])
|
|
145
140
|
})
|
|
146
141
|
|
|
147
142
|
value = value.replace(sensitiveId, '')
|
|
@@ -79,17 +79,15 @@ function isValidVulnerability (vulnerability) {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
function sendVulnerabilities (vulnerabilities, span) {
|
|
82
|
-
if (vulnerabilities &&
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
span.addTags(tags)
|
|
92
|
-
}
|
|
82
|
+
if (vulnerabilities?.length && span?.addTags) {
|
|
83
|
+
const validatedVulnerabilities = vulnerabilities.filter(isValidVulnerability)
|
|
84
|
+
const jsonToSend = vulnerabilitiesFormatter.toJson(validatedVulnerabilities)
|
|
85
|
+
|
|
86
|
+
if (jsonToSend.vulnerabilities.length > 0) {
|
|
87
|
+
const tags = {}
|
|
88
|
+
// TODO: Store this outside of the span and set the tag in the exporter.
|
|
89
|
+
tags[IAST_JSON_TAG_KEY] = JSON.stringify(jsonToSend)
|
|
90
|
+
span.addTags(tags)
|
|
93
91
|
}
|
|
94
92
|
}
|
|
95
93
|
return IAST_JSON_TAG_KEY
|
|
@@ -34,6 +34,7 @@ const UserTracking = require('./user_tracking')
|
|
|
34
34
|
const { storage } = require('../../../datadog-core')
|
|
35
35
|
const graphql = require('./graphql')
|
|
36
36
|
const rasp = require('./rasp')
|
|
37
|
+
const { isInServerlessEnvironment } = require('../serverless')
|
|
37
38
|
|
|
38
39
|
const responseAnalyzedSet = new WeakSet()
|
|
39
40
|
|
|
@@ -57,7 +58,7 @@ function enable (_config) {
|
|
|
57
58
|
|
|
58
59
|
remoteConfig.enableWafUpdate(_config.appsec)
|
|
59
60
|
|
|
60
|
-
Reporter.
|
|
61
|
+
Reporter.init(_config.appsec)
|
|
61
62
|
|
|
62
63
|
apiSecuritySampler.configure(_config)
|
|
63
64
|
|
|
@@ -83,7 +84,9 @@ function enable (_config) {
|
|
|
83
84
|
isEnabled = true
|
|
84
85
|
config = _config
|
|
85
86
|
} catch (err) {
|
|
86
|
-
|
|
87
|
+
if (!isInServerlessEnvironment()) {
|
|
88
|
+
log.error('[ASM] Unable to start AppSec', err)
|
|
89
|
+
}
|
|
87
90
|
|
|
88
91
|
disable()
|
|
89
92
|
}
|
|
@@ -106,7 +109,7 @@ function onRequestBodyParsed ({ req, res, body, abortController }) {
|
|
|
106
109
|
}
|
|
107
110
|
}, req)
|
|
108
111
|
|
|
109
|
-
handleResults(results, req, res, rootSpan, abortController)
|
|
112
|
+
handleResults(results?.actions, req, res, rootSpan, abortController)
|
|
110
113
|
}
|
|
111
114
|
|
|
112
115
|
function onRequestCookieParser ({ req, res, abortController, cookies }) {
|
|
@@ -121,7 +124,7 @@ function onRequestCookieParser ({ req, res, abortController, cookies }) {
|
|
|
121
124
|
}
|
|
122
125
|
}, req)
|
|
123
126
|
|
|
124
|
-
handleResults(results, req, res, rootSpan, abortController)
|
|
127
|
+
handleResults(results?.actions, req, res, rootSpan, abortController)
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
function incomingHttpStartTranslator ({ req, res, abortController }) {
|
|
@@ -149,9 +152,9 @@ function incomingHttpStartTranslator ({ req, res, abortController }) {
|
|
|
149
152
|
persistent[addresses.HTTP_CLIENT_IP] = clientIp
|
|
150
153
|
}
|
|
151
154
|
|
|
152
|
-
const
|
|
155
|
+
const results = waf.run({ persistent }, req)
|
|
153
156
|
|
|
154
|
-
handleResults(actions, req, res, rootSpan, abortController)
|
|
157
|
+
handleResults(results?.actions, req, res, rootSpan, abortController)
|
|
155
158
|
}
|
|
156
159
|
|
|
157
160
|
function incomingHttpEndTranslator ({ req, res }) {
|
|
@@ -198,7 +201,7 @@ function onPassportVerify ({ framework, login, user, success, abortController })
|
|
|
198
201
|
|
|
199
202
|
const results = UserTracking.trackLogin(framework, login, user, success, rootSpan)
|
|
200
203
|
|
|
201
|
-
handleResults(results, store.req, store.req.res, rootSpan, abortController)
|
|
204
|
+
handleResults(results?.actions, store.req, store.req.res, rootSpan, abortController)
|
|
202
205
|
}
|
|
203
206
|
|
|
204
207
|
function onPassportDeserializeUser ({ user, abortController }) {
|
|
@@ -212,7 +215,7 @@ function onPassportDeserializeUser ({ user, abortController }) {
|
|
|
212
215
|
|
|
213
216
|
const results = UserTracking.trackUser(user, rootSpan)
|
|
214
217
|
|
|
215
|
-
handleResults(results, store.req, store.req.res, rootSpan, abortController)
|
|
218
|
+
handleResults(results?.actions, store.req, store.req.res, rootSpan, abortController)
|
|
216
219
|
}
|
|
217
220
|
|
|
218
221
|
function onExpressSession ({ req, res, sessionId, abortController }) {
|
|
@@ -231,7 +234,7 @@ function onExpressSession ({ req, res, sessionId, abortController }) {
|
|
|
231
234
|
}
|
|
232
235
|
}, req)
|
|
233
236
|
|
|
234
|
-
handleResults(results, req, res, rootSpan, abortController)
|
|
237
|
+
handleResults(results?.actions, req, res, rootSpan, abortController)
|
|
235
238
|
}
|
|
236
239
|
|
|
237
240
|
function onRequestQueryParsed ({ req, res, query, abortController }) {
|
|
@@ -251,7 +254,7 @@ function onRequestQueryParsed ({ req, res, query, abortController }) {
|
|
|
251
254
|
}
|
|
252
255
|
}, req)
|
|
253
256
|
|
|
254
|
-
handleResults(results, req, res, rootSpan, abortController)
|
|
257
|
+
handleResults(results?.actions, req, res, rootSpan, abortController)
|
|
255
258
|
}
|
|
256
259
|
|
|
257
260
|
function onRequestProcessParams ({ req, res, abortController, params }) {
|
|
@@ -266,7 +269,7 @@ function onRequestProcessParams ({ req, res, abortController, params }) {
|
|
|
266
269
|
}
|
|
267
270
|
}, req)
|
|
268
271
|
|
|
269
|
-
handleResults(results, req, res, rootSpan, abortController)
|
|
272
|
+
handleResults(results?.actions, req, res, rootSpan, abortController)
|
|
270
273
|
}
|
|
271
274
|
|
|
272
275
|
function onResponseBody ({ req, res, body }) {
|
|
@@ -308,7 +311,7 @@ function onResponseWriteHead ({ req, res, abortController, statusCode, responseH
|
|
|
308
311
|
|
|
309
312
|
responseAnalyzedSet.add(res)
|
|
310
313
|
|
|
311
|
-
handleResults(results, req, res, rootSpan, abortController)
|
|
314
|
+
handleResults(results?.actions, req, res, rootSpan, abortController)
|
|
312
315
|
}
|
|
313
316
|
|
|
314
317
|
function onResponseSetHeader ({ res, abortController }) {
|
|
@@ -22,8 +22,8 @@ function removeAllListeners (emitter, event) {
|
|
|
22
22
|
}
|
|
23
23
|
cleaned = true
|
|
24
24
|
|
|
25
|
-
for (
|
|
26
|
-
emitter.on(event,
|
|
25
|
+
for (const listener of listeners) {
|
|
26
|
+
emitter.on(event, listener)
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
}
|
|
@@ -41,19 +41,7 @@ function findDatadogRaspAbortError (err, deep = 10) {
|
|
|
41
41
|
function handleUncaughtExceptionMonitor (error) {
|
|
42
42
|
if (!blockOnDatadogRaspAbortError({ error })) return
|
|
43
43
|
|
|
44
|
-
if (
|
|
45
|
-
const cleanUp = removeAllListeners(process, 'uncaughtException')
|
|
46
|
-
const handler = () => {
|
|
47
|
-
process.removeListener('uncaughtException', handler)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
setTimeout(() => {
|
|
51
|
-
process.removeListener('uncaughtException', handler)
|
|
52
|
-
cleanUp()
|
|
53
|
-
})
|
|
54
|
-
|
|
55
|
-
process.on('uncaughtException', handler)
|
|
56
|
-
} else {
|
|
44
|
+
if (process.hasUncaughtExceptionCaptureCallback()) {
|
|
57
45
|
// uncaughtException event is not executed when hasUncaughtExceptionCaptureCallback is true
|
|
58
46
|
let previousCb
|
|
59
47
|
const cb = ({ currentCallback, abortController }) => {
|
|
@@ -78,6 +66,18 @@ function handleUncaughtExceptionMonitor (error) {
|
|
|
78
66
|
process.setUncaughtExceptionCaptureCallback(previousCb)
|
|
79
67
|
})
|
|
80
68
|
}
|
|
69
|
+
} else {
|
|
70
|
+
const cleanUp = removeAllListeners(process, 'uncaughtException')
|
|
71
|
+
const handler = () => {
|
|
72
|
+
process.removeListener('uncaughtException', handler)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
setTimeout(() => {
|
|
76
|
+
process.removeListener('uncaughtException', handler)
|
|
77
|
+
cleanUp()
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
process.on('uncaughtException', handler)
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
83
|
|
|
@@ -85,10 +85,12 @@ function blockOnDatadogRaspAbortError ({ error }) {
|
|
|
85
85
|
const abortError = findDatadogRaspAbortError(error)
|
|
86
86
|
if (!abortError) return false
|
|
87
87
|
|
|
88
|
-
const { req, res, blockingAction, raspRule } = abortError
|
|
88
|
+
const { req, res, blockingAction, raspRule, ruleTriggered } = abortError
|
|
89
89
|
if (!isBlocked(res)) {
|
|
90
90
|
const blocked = block(req, res, web.root(req), null, blockingAction)
|
|
91
|
-
|
|
91
|
+
if (ruleTriggered) {
|
|
92
|
+
updateRaspRuleMatchMetricTags(req, raspRule, true, blocked)
|
|
93
|
+
}
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
return true
|
|
@@ -88,6 +88,7 @@ function pathToStr (path) {
|
|
|
88
88
|
if (!path) return
|
|
89
89
|
|
|
90
90
|
if (typeof path === 'string' ||
|
|
91
|
+
// eslint-disable-next-line unicorn/no-instanceof-builtins
|
|
91
92
|
path instanceof String ||
|
|
92
93
|
path instanceof Buffer ||
|
|
93
94
|
path instanceof URL) {
|
|
@@ -104,7 +105,7 @@ function shouldAnalyze (path, fs) {
|
|
|
104
105
|
|
|
105
106
|
function shouldAnalyzeURLFile (path, fs) {
|
|
106
107
|
if (path.startsWith('file://')) {
|
|
107
|
-
return shouldAnalyze(path.
|
|
108
|
+
return shouldAnalyze(path.slice(7), fs)
|
|
108
109
|
}
|
|
109
110
|
}
|
|
110
111
|
|
|
@@ -20,23 +20,26 @@ const RULE_TYPES = {
|
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
class DatadogRaspAbortError extends Error {
|
|
23
|
-
constructor (req, res, blockingAction, raspRule) {
|
|
23
|
+
constructor (req, res, blockingAction, raspRule, ruleTriggered) {
|
|
24
24
|
super('DatadogRaspAbortError')
|
|
25
25
|
this.name = 'DatadogRaspAbortError'
|
|
26
26
|
this.req = req
|
|
27
27
|
this.res = res
|
|
28
28
|
this.blockingAction = blockingAction
|
|
29
29
|
this.raspRule = raspRule
|
|
30
|
+
this.ruleTriggered = ruleTriggered
|
|
30
31
|
}
|
|
31
32
|
}
|
|
32
33
|
|
|
33
|
-
function handleResult (
|
|
34
|
-
const generateStackTraceAction = actions?.generate_stack
|
|
34
|
+
function handleResult (result, req, res, abortController, config, raspRule) {
|
|
35
|
+
const generateStackTraceAction = result?.actions?.generate_stack
|
|
35
36
|
|
|
36
37
|
const { enabled, maxDepth, maxStackTraces } = config.appsec.stackTrace
|
|
37
38
|
|
|
38
39
|
const rootSpan = web.root(req)
|
|
39
40
|
|
|
41
|
+
const ruleTriggered = !!result?.events?.length
|
|
42
|
+
|
|
40
43
|
if (generateStackTraceAction && enabled && canReportStackTrace(rootSpan, maxStackTraces)) {
|
|
41
44
|
const frames = getCallsiteFrames(maxDepth)
|
|
42
45
|
|
|
@@ -48,11 +51,11 @@ function handleResult (actions, req, res, abortController, config, raspRule) {
|
|
|
48
51
|
}
|
|
49
52
|
|
|
50
53
|
if (abortController && !abortOnUncaughtException) {
|
|
51
|
-
const blockingAction = getBlockingAction(actions)
|
|
54
|
+
const blockingAction = getBlockingAction(result?.actions)
|
|
52
55
|
|
|
53
56
|
// Should block only in express
|
|
54
57
|
if (blockingAction && rootSpan?.context()._name === 'express.request') {
|
|
55
|
-
const abortError = new DatadogRaspAbortError(req, res, blockingAction, raspRule)
|
|
58
|
+
const abortError = new DatadogRaspAbortError(req, res, blockingAction, raspRule, ruleTriggered)
|
|
56
59
|
abortController.abort(abortError)
|
|
57
60
|
|
|
58
61
|
// TODO Delete this when support for node 16 is removed
|
|
@@ -64,7 +67,9 @@ function handleResult (actions, req, res, abortController, config, raspRule) {
|
|
|
64
67
|
}
|
|
65
68
|
}
|
|
66
69
|
|
|
67
|
-
|
|
70
|
+
if (ruleTriggered) {
|
|
71
|
+
updateRaspRuleMatchMetricTags(req, raspRule, false, false)
|
|
72
|
+
}
|
|
68
73
|
}
|
|
69
74
|
|
|
70
75
|
module.exports = {
|