dd-trace 5.53.0 → 5.55.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/ci/cypress/plugin.js +8 -0
- package/ci/cypress/polyfills.js +23 -0
- package/ci/init.js +8 -7
- package/index.d.ts +33 -16
- package/initialize.mjs +5 -6
- package/package.json +40 -38
- package/packages/datadog-code-origin/index.js +22 -4
- 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 +10 -10
- package/packages/datadog-instrumentations/src/child_process.js +1 -2
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +89 -75
- package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
- package/packages/datadog-instrumentations/src/couchbase.js +6 -9
- package/packages/datadog-instrumentations/src/cucumber.js +108 -68
- package/packages/datadog-instrumentations/src/cypress.js +2 -1
- package/packages/datadog-instrumentations/src/dns.js +5 -5
- package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
- package/packages/datadog-instrumentations/src/fastify.js +7 -9
- package/packages/datadog-instrumentations/src/fs.js +1 -1
- package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +35 -43
- 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/hapi.js +10 -11
- package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
- package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
- package/packages/datadog-instrumentations/src/helpers/hook.js +2 -3
- 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 +11 -12
- package/packages/datadog-instrumentations/src/http/client.js +14 -20
- package/packages/datadog-instrumentations/src/jest.js +201 -143
- package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
- package/packages/datadog-instrumentations/src/knex.js +4 -4
- package/packages/datadog-instrumentations/src/koa.js +2 -3
- package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
- package/packages/datadog-instrumentations/src/mariadb.js +49 -65
- package/packages/datadog-instrumentations/src/mocha/main.js +116 -73
- 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/mocha.js +3 -1
- package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
- package/packages/datadog-instrumentations/src/mysql.js +30 -37
- 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 +3 -2
- package/packages/datadog-instrumentations/src/openai.js +22 -24
- package/packages/datadog-instrumentations/src/oracledb.js +1 -1
- package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
- package/packages/datadog-instrumentations/src/pg.js +3 -5
- package/packages/datadog-instrumentations/src/playwright.js +123 -83
- package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
- package/packages/datadog-instrumentations/src/redis.js +4 -4
- package/packages/datadog-instrumentations/src/restify.js +9 -13
- package/packages/datadog-instrumentations/src/rhea.js +42 -54
- package/packages/datadog-instrumentations/src/router.js +30 -32
- package/packages/datadog-instrumentations/src/tedious.js +2 -3
- package/packages/datadog-instrumentations/src/vitest.js +87 -52
- 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-avsc/src/schema_iterator.js +12 -12
- package/packages/datadog-plugin-aws-sdk/src/base.js +15 -10
- 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/cloudwatchlogs.js +3 -5
- package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +28 -43
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +10 -11
- package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +4 -6
- package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
- package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
- package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -3
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +11 -15
- 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 +60 -4
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +99 -28
- package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
- package/packages/datadog-plugin-cypress/src/support.js +24 -5
- package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
- package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
- 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 +27 -10
- package/packages/datadog-plugin-graphql/src/execute.js +2 -2
- package/packages/datadog-plugin-graphql/src/index.js +10 -8
- package/packages/datadog-plugin-graphql/src/resolve.js +19 -12
- 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 +23 -13
- package/packages/datadog-plugin-http2/src/client.js +24 -25
- package/packages/datadog-plugin-jest/src/index.js +26 -23
- 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 +39 -14
- package/packages/datadog-plugin-mongodb-core/src/index.js +3 -2
- package/packages/datadog-plugin-mysql/src/index.js +22 -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 +7 -6
- package/packages/datadog-plugin-openai/src/services.js +6 -10
- package/packages/datadog-plugin-openai/src/tracing.js +12 -18
- package/packages/datadog-plugin-oracledb/src/index.js +1 -1
- package/packages/datadog-plugin-playwright/src/index.js +25 -4
- package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
- package/packages/datadog-plugin-redis/src/index.js +2 -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 +52 -35
- 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/analyzers.js +0 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
- package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
- 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 +5 -8
- 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 +16 -24
- 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 +2 -8
- 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 +7 -8
- 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 +7 -7
- package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +2 -3
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
- 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 -28
- 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/vulnerabilities.js +0 -1
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
- package/packages/dd-trace/src/appsec/index.js +5 -5
- 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 +232 -41
- package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
- package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
- package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
- package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
- package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
- 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 +8 -4
- package/packages/dd-trace/src/azure_metadata.js +9 -9
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +9 -8
- 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 +3 -2
- 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 +3 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +3 -2
- package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +3 -2
- 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 +6 -5
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
- 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 +3 -2
- package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +5 -4
- package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +12 -8
- 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 +3 -2
- package/packages/dd-trace/src/config-helper.js +89 -0
- package/packages/dd-trace/src/config.js +159 -129
- package/packages/dd-trace/src/config_stable.js +10 -7
- package/packages/dd-trace/src/datastreams/encoding.js +9 -9
- package/packages/dd-trace/src/datastreams/fnv.js +2 -2
- 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 +7 -7
- 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 +75 -69
- package/packages/dd-trace/src/debugger/devtools_client/condition.js +7 -10
- package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/index.js +9 -2
- package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
- package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -2
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +11 -14
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +4 -4
- 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/debugger/index.js +1 -0
- package/packages/dd-trace/src/dogstatsd.js +7 -6
- package/packages/dd-trace/src/encode/0.4.js +14 -11
- package/packages/dd-trace/src/encode/0.5.js +4 -6
- package/packages/dd-trace/src/encode/agentless-ci-visibility.js +8 -8
- 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 +7 -6
- package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
- package/packages/dd-trace/src/exporters/common/docker.js +4 -3
- package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
- package/packages/dd-trace/src/exporters/common/request.js +5 -2
- package/packages/dd-trace/src/exporters/common/util.js +4 -2
- 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 +15 -9
- package/packages/dd-trace/src/iitm.js +10 -22
- package/packages/dd-trace/src/index.js +4 -3
- package/packages/dd-trace/src/lambda/handler.js +7 -6
- package/packages/dd-trace/src/lambda/index.js +2 -1
- package/packages/dd-trace/src/lambda/runtime/patch.js +7 -6
- package/packages/dd-trace/src/lambda/runtime/ritm.js +4 -3
- package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
- package/packages/dd-trace/src/llmobs/index.js +21 -5
- package/packages/dd-trace/src/llmobs/noop.js +18 -20
- 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/handlers/index.js +11 -13
- package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
- package/packages/dd-trace/src/llmobs/plugins/openai.js +2 -3
- package/packages/dd-trace/src/llmobs/sdk.js +4 -3
- package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
- package/packages/dd-trace/src/llmobs/tagger.js +129 -102
- 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 +9 -8
- package/packages/dd-trace/src/log/log.js +1 -1
- package/packages/dd-trace/src/log/writer.js +3 -4
- package/packages/dd-trace/src/msgpack/chunk.js +3 -3
- package/packages/dd-trace/src/msgpack/encoder.js +31 -31
- package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
- package/packages/dd-trace/src/noop/span.js +4 -6
- 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 +7 -6
- package/packages/dd-trace/src/opentracing/propagation/log.js +10 -13
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +40 -37
- package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
- package/packages/dd-trace/src/opentracing/span.js +16 -20
- package/packages/dd-trace/src/opentracing/tracer.js +9 -6
- package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
- 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/plugin_manager.js +4 -3
- package/packages/dd-trace/src/plugins/ci_plugin.js +87 -11
- 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 +28 -20
- package/packages/dd-trace/src/plugins/util/git.js +166 -12
- 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 +9 -2
- package/packages/dd-trace/src/plugins/util/test.js +315 -51
- 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 +14 -4
- package/packages/dd-trace/src/plugins/util/web.js +8 -8
- package/packages/dd-trace/src/priority_sampler.js +64 -53
- package/packages/dd-trace/src/profiling/config.js +51 -35
- package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
- package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
- package/packages/dd-trace/src/profiling/exporters/event_serializer.js +7 -6
- package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
- package/packages/dd-trace/src/profiling/index.js +2 -1
- package/packages/dd-trace/src/profiling/profiler.js +44 -6
- 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/ssi-telemetry-mock-profiler.js +3 -1
- package/packages/dd-trace/src/profiling/tagger.js +21 -13
- package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
- package/packages/dd-trace/src/proxy.js +9 -10
- 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 +8 -8
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -4
- package/packages/dd-trace/src/sampler.js +41 -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 +11 -4
- 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 +5 -4
- package/packages/dd-trace/src/span_sampler.js +4 -1
- package/packages/dd-trace/src/standalone/tracesource.js +2 -3
- package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
- package/packages/dd-trace/src/startup-log.js +6 -18
- package/packages/dd-trace/src/supported-configurations.json +439 -0
- package/packages/dd-trace/src/telemetry/dependencies.js +64 -59
- 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 +8 -7
- package/packages/dd-trace/src/telemetry/telemetry.js +31 -45
- package/packages/dd-trace/src/tracer.js +3 -7
- package/packages/dd-trace/src/util.js +1 -6
- 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
- package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -122
- package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
|
@@ -2,11 +2,22 @@ const path = require('path')
|
|
|
2
2
|
const fs = require('fs')
|
|
3
3
|
const { URL } = require('url')
|
|
4
4
|
const log = require('../../log')
|
|
5
|
+
const { getEnvironmentVariable } = require('../../config-helper')
|
|
5
6
|
|
|
6
7
|
const istanbul = require('istanbul-lib-coverage')
|
|
7
8
|
const ignore = require('ignore')
|
|
8
9
|
|
|
9
|
-
const {
|
|
10
|
+
const {
|
|
11
|
+
getGitMetadata,
|
|
12
|
+
getGitInformationDiscrepancy,
|
|
13
|
+
getGitDiff,
|
|
14
|
+
getGitRemoteName,
|
|
15
|
+
getSourceBranch,
|
|
16
|
+
checkAndFetchBranch,
|
|
17
|
+
getLocalBranches,
|
|
18
|
+
getMergeBase,
|
|
19
|
+
getCounts
|
|
20
|
+
} = require('./git')
|
|
10
21
|
const { getUserProviderGitMetadata, validateGitRepositoryUrl, validateGitCommitSha } = require('./user-provided-git')
|
|
11
22
|
const { getCIMetadata } = require('./ci')
|
|
12
23
|
const { getRuntimeAndOSMetadata } = require('./env')
|
|
@@ -23,6 +34,11 @@ const {
|
|
|
23
34
|
CI_JOB_NAME
|
|
24
35
|
} = require('./tags')
|
|
25
36
|
const id = require('../../id')
|
|
37
|
+
const {
|
|
38
|
+
incrementCountMetric,
|
|
39
|
+
TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY,
|
|
40
|
+
TELEMETRY_GIT_SHA_MATCH
|
|
41
|
+
} = require('../../ci-visibility/telemetry')
|
|
26
42
|
|
|
27
43
|
const { SPAN_TYPE, RESOURCE_NAME, SAMPLING_PRIORITY } = require('../../../../../ext/tags')
|
|
28
44
|
const { SAMPLING_RULE_DECISION } = require('../../constants')
|
|
@@ -59,7 +75,7 @@ const TEST_EARLY_FLAKE_ENABLED = 'test.early_flake.enabled'
|
|
|
59
75
|
const TEST_EARLY_FLAKE_ABORT_REASON = 'test.early_flake.abort_reason'
|
|
60
76
|
const TEST_RETRY_REASON = 'test.retry_reason'
|
|
61
77
|
const TEST_HAS_FAILED_ALL_RETRIES = 'test.has_failed_all_retries'
|
|
62
|
-
|
|
78
|
+
const TEST_IS_MODIFIED = 'test.is_modified'
|
|
63
79
|
const CI_APP_ORIGIN = 'ciapp-test'
|
|
64
80
|
|
|
65
81
|
const JEST_TEST_RUNNER = 'test.jest.test_runner'
|
|
@@ -101,18 +117,20 @@ const PLAYWRIGHT_WORKER_TRACE_PAYLOAD_CODE = 90
|
|
|
101
117
|
|
|
102
118
|
// Early flake detection util strings
|
|
103
119
|
const EFD_STRING = "Retried by Datadog's Early Flake Detection"
|
|
104
|
-
const EFD_TEST_NAME_REGEX = new RegExp(EFD_STRING +
|
|
120
|
+
const EFD_TEST_NAME_REGEX = new RegExp(EFD_STRING + String.raw` \(#\d+\): `, 'g')
|
|
105
121
|
|
|
106
122
|
// Library Capabilities Tagging
|
|
107
123
|
const DD_CAPABILITIES_TEST_IMPACT_ANALYSIS = '_dd.library_capabilities.test_impact_analysis'
|
|
108
124
|
const DD_CAPABILITIES_EARLY_FLAKE_DETECTION = '_dd.library_capabilities.early_flake_detection'
|
|
109
125
|
const DD_CAPABILITIES_AUTO_TEST_RETRIES = '_dd.library_capabilities.auto_test_retries'
|
|
126
|
+
const DD_CAPABILITIES_IMPACTED_TESTS = '_dd.library_capabilities.impacted_tests'
|
|
110
127
|
const DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE = '_dd.library_capabilities.test_management.quarantine'
|
|
111
128
|
const DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE = '_dd.library_capabilities.test_management.disable'
|
|
112
129
|
const DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX = '_dd.library_capabilities.test_management.attempt_to_fix'
|
|
113
|
-
const UNSUPPORTED_TIA_FRAMEWORKS = ['playwright', 'vitest']
|
|
114
|
-
const UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE = ['cucumber', 'mocha']
|
|
115
|
-
const UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE = ['mocha']
|
|
130
|
+
const UNSUPPORTED_TIA_FRAMEWORKS = new Set(['playwright', 'vitest'])
|
|
131
|
+
const UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE = new Set(['cucumber', 'mocha'])
|
|
132
|
+
const UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE = new Set(['mocha'])
|
|
133
|
+
const NOT_SUPPORTED_GRANULARITY_IMPACTED_TESTS_FRAMEWORKS = new Set(['mocha', 'playwright', 'vitest'])
|
|
116
134
|
|
|
117
135
|
const TEST_LEVEL_EVENT_TYPES = [
|
|
118
136
|
'test',
|
|
@@ -145,7 +163,11 @@ const TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED = 'test.test_management.attempt_to_f
|
|
|
145
163
|
|
|
146
164
|
// Test Management utils strings
|
|
147
165
|
const ATTEMPT_TO_FIX_STRING = "Retried by Datadog's Test Management"
|
|
148
|
-
const ATTEMPT_TEST_NAME_REGEX = new RegExp(ATTEMPT_TO_FIX_STRING +
|
|
166
|
+
const ATTEMPT_TEST_NAME_REGEX = new RegExp(ATTEMPT_TO_FIX_STRING + String.raw` \(#\d+\): `, 'g')
|
|
167
|
+
|
|
168
|
+
// Impacted tests
|
|
169
|
+
const POSSIBLE_BASE_BRANCHES = ['main', 'master', 'preprod', 'prod', 'dev', 'development', 'trunk']
|
|
170
|
+
const BASE_LIKE_BRANCH_FILTER = /^(main|master|preprod|prod|dev|development|trunk|release\/.*|hotfix\/.*)$/
|
|
149
171
|
|
|
150
172
|
module.exports = {
|
|
151
173
|
TEST_CODE_OWNERS,
|
|
@@ -180,6 +202,7 @@ module.exports = {
|
|
|
180
202
|
TEST_EARLY_FLAKE_ABORT_REASON,
|
|
181
203
|
TEST_RETRY_REASON,
|
|
182
204
|
TEST_HAS_FAILED_ALL_RETRIES,
|
|
205
|
+
TEST_IS_MODIFIED,
|
|
183
206
|
getTestEnvironmentMetadata,
|
|
184
207
|
getTestParametersString,
|
|
185
208
|
finishAllTraceSpans,
|
|
@@ -212,6 +235,7 @@ module.exports = {
|
|
|
212
235
|
mergeCoverage,
|
|
213
236
|
fromCoverageMapToCoverage,
|
|
214
237
|
getTestLineStart,
|
|
238
|
+
getTestEndLine,
|
|
215
239
|
removeInvalidMetadata,
|
|
216
240
|
parseAnnotations,
|
|
217
241
|
EFD_STRING,
|
|
@@ -229,6 +253,7 @@ module.exports = {
|
|
|
229
253
|
DD_CAPABILITIES_TEST_IMPACT_ANALYSIS,
|
|
230
254
|
DD_CAPABILITIES_EARLY_FLAKE_DETECTION,
|
|
231
255
|
DD_CAPABILITIES_AUTO_TEST_RETRIES,
|
|
256
|
+
DD_CAPABILITIES_IMPACTED_TESTS,
|
|
232
257
|
DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE,
|
|
233
258
|
DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE,
|
|
234
259
|
DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX,
|
|
@@ -248,14 +273,20 @@ module.exports = {
|
|
|
248
273
|
TEST_MANAGEMENT_IS_QUARANTINED,
|
|
249
274
|
TEST_MANAGEMENT_ENABLED,
|
|
250
275
|
TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
|
|
251
|
-
getLibraryCapabilitiesTags
|
|
276
|
+
getLibraryCapabilitiesTags,
|
|
277
|
+
checkShaDiscrepancies,
|
|
278
|
+
getPullRequestDiff,
|
|
279
|
+
getPullRequestBaseBranch,
|
|
280
|
+
getModifiedTestsFromDiff,
|
|
281
|
+
isModifiedTest,
|
|
282
|
+
POSSIBLE_BASE_BRANCHES
|
|
252
283
|
}
|
|
253
284
|
|
|
254
285
|
// Returns pkg manager and its version, separated by '-', e.g. npm-8.15.0 or yarn-1.22.19
|
|
255
286
|
function getPkgManager () {
|
|
256
287
|
try {
|
|
257
|
-
return
|
|
258
|
-
} catch
|
|
288
|
+
return getEnvironmentVariable('npm_config_user_agent').split(' ')[0].replace('/', '-')
|
|
289
|
+
} catch {
|
|
259
290
|
return ''
|
|
260
291
|
}
|
|
261
292
|
}
|
|
@@ -264,35 +295,124 @@ function validateUrl (url) {
|
|
|
264
295
|
try {
|
|
265
296
|
const urlObject = new URL(url)
|
|
266
297
|
return (urlObject.protocol === 'https:' || urlObject.protocol === 'http:')
|
|
267
|
-
} catch
|
|
298
|
+
} catch {
|
|
268
299
|
return false
|
|
269
300
|
}
|
|
270
301
|
}
|
|
271
302
|
|
|
272
303
|
function removeInvalidMetadata (metadata) {
|
|
273
304
|
return Object.keys(metadata).reduce((filteredTags, tag) => {
|
|
274
|
-
if (tag === GIT_REPOSITORY_URL) {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
return filteredTags
|
|
278
|
-
}
|
|
305
|
+
if (tag === GIT_REPOSITORY_URL && !validateGitRepositoryUrl(metadata[GIT_REPOSITORY_URL])) {
|
|
306
|
+
log.error('Repository URL is not a valid repository URL: %s.', metadata[GIT_REPOSITORY_URL])
|
|
307
|
+
return filteredTags
|
|
279
308
|
}
|
|
280
|
-
if (tag === GIT_COMMIT_SHA) {
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
return filteredTags
|
|
284
|
-
}
|
|
309
|
+
if (tag === GIT_COMMIT_SHA && !validateGitCommitSha(metadata[GIT_COMMIT_SHA])) {
|
|
310
|
+
log.error('Git commit SHA must be a full-length git SHA: %s.', metadata[GIT_COMMIT_SHA])
|
|
311
|
+
return filteredTags
|
|
285
312
|
}
|
|
286
|
-
if (tag === CI_PIPELINE_URL) {
|
|
287
|
-
|
|
288
|
-
return filteredTags
|
|
289
|
-
}
|
|
313
|
+
if (tag === CI_PIPELINE_URL && !validateUrl(metadata[CI_PIPELINE_URL])) {
|
|
314
|
+
return filteredTags
|
|
290
315
|
}
|
|
291
316
|
filteredTags[tag] = metadata[tag]
|
|
292
317
|
return filteredTags
|
|
293
318
|
}, {})
|
|
294
319
|
}
|
|
295
320
|
|
|
321
|
+
function checkShaDiscrepancies (ciMetadata, userProvidedGitMetadata) {
|
|
322
|
+
const {
|
|
323
|
+
[GIT_COMMIT_SHA]: ciCommitSHA,
|
|
324
|
+
[GIT_REPOSITORY_URL]: ciRepositoryUrl
|
|
325
|
+
} = ciMetadata
|
|
326
|
+
const {
|
|
327
|
+
[GIT_COMMIT_SHA]: userProvidedCommitSHA,
|
|
328
|
+
[GIT_REPOSITORY_URL]: userProvidedRepositoryUrl
|
|
329
|
+
} = userProvidedGitMetadata
|
|
330
|
+
const { gitRepositoryUrl, gitCommitSHA } = getGitInformationDiscrepancy()
|
|
331
|
+
|
|
332
|
+
const checkDiscrepancyAndSendMetrics = (
|
|
333
|
+
valueExpected,
|
|
334
|
+
valueDiscrepant,
|
|
335
|
+
discrepancyType,
|
|
336
|
+
expectedProvider,
|
|
337
|
+
discrepantProvider
|
|
338
|
+
) => {
|
|
339
|
+
if (valueExpected && valueDiscrepant && valueExpected !== valueDiscrepant) {
|
|
340
|
+
incrementCountMetric(
|
|
341
|
+
TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY,
|
|
342
|
+
{
|
|
343
|
+
type: discrepancyType,
|
|
344
|
+
expected_provider: expectedProvider,
|
|
345
|
+
discrepant_provider: discrepantProvider
|
|
346
|
+
}
|
|
347
|
+
)
|
|
348
|
+
return true
|
|
349
|
+
}
|
|
350
|
+
return false
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
const checkConfigs = [
|
|
354
|
+
// User provided vs Git metadata
|
|
355
|
+
{
|
|
356
|
+
v1: userProvidedRepositoryUrl,
|
|
357
|
+
v2: gitRepositoryUrl,
|
|
358
|
+
type: 'repository_discrepancy',
|
|
359
|
+
expected: 'user_supplied',
|
|
360
|
+
discrepant: 'git_client'
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
v1: userProvidedCommitSHA,
|
|
364
|
+
v2: gitCommitSHA,
|
|
365
|
+
type: 'commit_discrepancy',
|
|
366
|
+
expected: 'user_supplied',
|
|
367
|
+
discrepant: 'git_client'
|
|
368
|
+
},
|
|
369
|
+
// User provided vs CI metadata
|
|
370
|
+
{
|
|
371
|
+
v1: userProvidedRepositoryUrl,
|
|
372
|
+
v2: ciRepositoryUrl,
|
|
373
|
+
type: 'repository_discrepancy',
|
|
374
|
+
expected: 'user_supplied',
|
|
375
|
+
discrepant: 'ci_provider'
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
v1: userProvidedCommitSHA,
|
|
379
|
+
v2: ciCommitSHA,
|
|
380
|
+
type: 'commit_discrepancy',
|
|
381
|
+
expected: 'user_supplied',
|
|
382
|
+
discrepant: 'ci_provider'
|
|
383
|
+
},
|
|
384
|
+
// CI metadata vs Git metadata
|
|
385
|
+
{
|
|
386
|
+
v1: ciRepositoryUrl,
|
|
387
|
+
v2: gitRepositoryUrl,
|
|
388
|
+
type: 'repository_discrepancy',
|
|
389
|
+
expected: 'ci_provider',
|
|
390
|
+
discrepant: 'git_client'
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
v1: ciCommitSHA,
|
|
394
|
+
v2: gitCommitSHA,
|
|
395
|
+
type: 'commit_discrepancy',
|
|
396
|
+
expected: 'ci_provider',
|
|
397
|
+
discrepant: 'git_client'
|
|
398
|
+
}
|
|
399
|
+
]
|
|
400
|
+
|
|
401
|
+
let gitCommitShaMatch = true
|
|
402
|
+
for (const checkConfig of checkConfigs) {
|
|
403
|
+
const { v1, v2, type, expected, discrepant } = checkConfig
|
|
404
|
+
const discrepancy = checkDiscrepancyAndSendMetrics(v1, v2, type, expected, discrepant)
|
|
405
|
+
if (discrepancy) {
|
|
406
|
+
gitCommitShaMatch = false
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
incrementCountMetric(
|
|
411
|
+
TELEMETRY_GIT_SHA_MATCH,
|
|
412
|
+
{ match: gitCommitShaMatch }
|
|
413
|
+
)
|
|
414
|
+
}
|
|
415
|
+
|
|
296
416
|
function getTestEnvironmentMetadata (testFramework, config) {
|
|
297
417
|
// TODO: eventually these will come from the tracer (generally available)
|
|
298
418
|
const ciMetadata = getCIMetadata()
|
|
@@ -320,6 +440,8 @@ function getTestEnvironmentMetadata (testFramework, config) {
|
|
|
320
440
|
|
|
321
441
|
const userProvidedGitMetadata = getUserProviderGitMetadata()
|
|
322
442
|
|
|
443
|
+
checkShaDiscrepancies(ciMetadata, userProvidedGitMetadata)
|
|
444
|
+
|
|
323
445
|
const runtimeAndOSMetadata = getRuntimeAndOSMetadata()
|
|
324
446
|
|
|
325
447
|
const metadata = {
|
|
@@ -344,7 +466,7 @@ function getTestParametersString (parametersByTestName, testName) {
|
|
|
344
466
|
// test is invoked with each parameter set sequencially
|
|
345
467
|
const testParameters = parametersByTestName[testName].shift()
|
|
346
468
|
return JSON.stringify({ arguments: testParameters, metadata: {} })
|
|
347
|
-
} catch
|
|
469
|
+
} catch {
|
|
348
470
|
// We can't afford to interrupt the test if `testParameters` is not serializable to JSON,
|
|
349
471
|
// so we ignore the test parameters and move on
|
|
350
472
|
return ''
|
|
@@ -413,7 +535,7 @@ function readCodeOwners (rootDir) {
|
|
|
413
535
|
for (const location of POSSIBLE_CODEOWNERS_LOCATIONS) {
|
|
414
536
|
try {
|
|
415
537
|
return fs.readFileSync(path.join(rootDir, location)).toString()
|
|
416
|
-
} catch
|
|
538
|
+
} catch {
|
|
417
539
|
// retry with next path
|
|
418
540
|
}
|
|
419
541
|
}
|
|
@@ -467,7 +589,7 @@ function getCodeOwnersForFilename (filename, entries) {
|
|
|
467
589
|
if (isResponsible) {
|
|
468
590
|
return JSON.stringify(entry.owners)
|
|
469
591
|
}
|
|
470
|
-
} catch
|
|
592
|
+
} catch {
|
|
471
593
|
return null
|
|
472
594
|
}
|
|
473
595
|
}
|
|
@@ -619,12 +741,19 @@ function getTestLineStart (err, testSuitePath) {
|
|
|
619
741
|
const testFileLine = err.stack.split('\n').find(line => line.includes(testSuitePath))
|
|
620
742
|
try {
|
|
621
743
|
const testFileLineMatch = testFileLine.match(/at (?:(.+?)\s+\()?(?:(.+?):(\d+)(?::(\d+))?|([^)]+))\)?/)
|
|
622
|
-
return parseInt(testFileLineMatch[3], 10) || null
|
|
623
|
-
} catch
|
|
744
|
+
return Number.parseInt(testFileLineMatch[3], 10) || null
|
|
745
|
+
} catch {
|
|
624
746
|
return null
|
|
625
747
|
}
|
|
626
748
|
}
|
|
627
749
|
|
|
750
|
+
// Get the end line of a test by inspecting a given function's source code
|
|
751
|
+
function getTestEndLine (testFn, startLine = 0) {
|
|
752
|
+
const source = testFn.toString()
|
|
753
|
+
const lineCount = source.split('\n').length
|
|
754
|
+
return startLine + lineCount - 1
|
|
755
|
+
}
|
|
756
|
+
|
|
628
757
|
/**
|
|
629
758
|
* Gets an object of test tags from an Playwright annotations array.
|
|
630
759
|
* @param {Object[]} annotations - Annotations from a Playwright test.
|
|
@@ -661,11 +790,11 @@ function addAttemptToFixStringToTestName (testName, numAttempt) {
|
|
|
661
790
|
}
|
|
662
791
|
|
|
663
792
|
function removeEfdStringFromTestName (testName) {
|
|
664
|
-
return testName.
|
|
793
|
+
return testName.replaceAll(EFD_TEST_NAME_REGEX, '')
|
|
665
794
|
}
|
|
666
795
|
|
|
667
796
|
function removeAttemptToFixStringFromTestName (testName) {
|
|
668
|
-
return testName.
|
|
797
|
+
return testName.replaceAll(ATTEMPT_TEST_NAME_REGEX, '')
|
|
669
798
|
}
|
|
670
799
|
|
|
671
800
|
function getIsFaultyEarlyFlakeDetection (projectSuites, testsBySuiteName, faultyThresholdPercentage) {
|
|
@@ -686,14 +815,14 @@ function getIsFaultyEarlyFlakeDetection (projectSuites, testsBySuiteName, faulty
|
|
|
686
815
|
)
|
|
687
816
|
}
|
|
688
817
|
|
|
689
|
-
function getTestSessionName (config,
|
|
818
|
+
function getTestSessionName (config, trimmedCommand, envTags) {
|
|
690
819
|
if (config.ciVisibilityTestSessionName) {
|
|
691
820
|
return config.ciVisibilityTestSessionName
|
|
692
821
|
}
|
|
693
822
|
if (envTags[CI_JOB_NAME]) {
|
|
694
|
-
return `${envTags[CI_JOB_NAME]}-${
|
|
823
|
+
return `${envTags[CI_JOB_NAME]}-${trimmedCommand}`
|
|
695
824
|
}
|
|
696
|
-
return
|
|
825
|
+
return trimmedCommand
|
|
697
826
|
}
|
|
698
827
|
|
|
699
828
|
// Calculate the number of a tests from the known tests response, which has a shape like:
|
|
@@ -761,28 +890,21 @@ function getFormattedError (error, repositoryRoot) {
|
|
|
761
890
|
return newError
|
|
762
891
|
}
|
|
763
892
|
|
|
764
|
-
function
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
}
|
|
769
|
-
if (isParallel && UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE.includes(testFramework)) {
|
|
770
|
-
return false
|
|
771
|
-
}
|
|
772
|
-
return true
|
|
773
|
-
}
|
|
893
|
+
function isTiaSupported (testFramework, isParallel) {
|
|
894
|
+
return !(UNSUPPORTED_TIA_FRAMEWORKS.has(testFramework) ||
|
|
895
|
+
(isParallel && UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE.has(testFramework)))
|
|
896
|
+
}
|
|
774
897
|
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
}
|
|
779
|
-
return true
|
|
780
|
-
}
|
|
898
|
+
function isAttemptToFixSupported (testFramework, isParallel) {
|
|
899
|
+
return !(isParallel && UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE.has(testFramework))
|
|
900
|
+
}
|
|
781
901
|
|
|
902
|
+
function getLibraryCapabilitiesTags (testFramework, isParallel) {
|
|
782
903
|
return {
|
|
783
904
|
[DD_CAPABILITIES_TEST_IMPACT_ANALYSIS]: isTiaSupported(testFramework, isParallel) ? '1' : undefined,
|
|
784
905
|
[DD_CAPABILITIES_EARLY_FLAKE_DETECTION]: '1',
|
|
785
906
|
[DD_CAPABILITIES_AUTO_TEST_RETRIES]: '1',
|
|
907
|
+
[DD_CAPABILITIES_IMPACTED_TESTS]: '1',
|
|
786
908
|
[DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE]: '1',
|
|
787
909
|
[DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE]: '1',
|
|
788
910
|
[DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX]: isAttemptToFixSupported(testFramework, isParallel)
|
|
@@ -790,3 +912,145 @@ function getLibraryCapabilitiesTags (testFramework, isParallel) {
|
|
|
790
912
|
: undefined
|
|
791
913
|
}
|
|
792
914
|
}
|
|
915
|
+
|
|
916
|
+
function getPullRequestBaseBranch (pullRequestBaseBranch) {
|
|
917
|
+
const remoteName = getGitRemoteName()
|
|
918
|
+
|
|
919
|
+
const sourceBranch = getSourceBranch()
|
|
920
|
+
// TODO: We will get the default branch name from the backend in the future.
|
|
921
|
+
const POSSIBLE_DEFAULT_BRANCHES = ['main', 'master']
|
|
922
|
+
|
|
923
|
+
const candidateBranches = []
|
|
924
|
+
if (pullRequestBaseBranch) {
|
|
925
|
+
checkAndFetchBranch(pullRequestBaseBranch, remoteName)
|
|
926
|
+
candidateBranches.push(pullRequestBaseBranch)
|
|
927
|
+
} else {
|
|
928
|
+
for (const branch of POSSIBLE_BASE_BRANCHES) {
|
|
929
|
+
checkAndFetchBranch(branch, remoteName)
|
|
930
|
+
}
|
|
931
|
+
|
|
932
|
+
const localBranches = getLocalBranches(remoteName)
|
|
933
|
+
for (const branch of localBranches) {
|
|
934
|
+
const shortBranchName = branch.replace(new RegExp(`^${remoteName}/`), '')
|
|
935
|
+
if (branch !== sourceBranch && BASE_LIKE_BRANCH_FILTER.test(shortBranchName)) {
|
|
936
|
+
candidateBranches.push(branch)
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
if (candidateBranches.length === 1) {
|
|
942
|
+
return getMergeBase(candidateBranches[0], sourceBranch)
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
const metrics = {}
|
|
946
|
+
for (const candidate of candidateBranches) {
|
|
947
|
+
// Find common ancestor
|
|
948
|
+
const baseSha = getMergeBase(candidate, sourceBranch)
|
|
949
|
+
if (!baseSha) {
|
|
950
|
+
continue
|
|
951
|
+
}
|
|
952
|
+
// Count commits ahead/behind
|
|
953
|
+
const counts = getCounts(candidate, sourceBranch)
|
|
954
|
+
if (!counts) {
|
|
955
|
+
continue
|
|
956
|
+
}
|
|
957
|
+
const behind = counts.behind
|
|
958
|
+
const ahead = counts.ahead
|
|
959
|
+
metrics[candidate] = {
|
|
960
|
+
behind,
|
|
961
|
+
ahead,
|
|
962
|
+
baseSha
|
|
963
|
+
}
|
|
964
|
+
}
|
|
965
|
+
|
|
966
|
+
function isDefaultBranch (branch) {
|
|
967
|
+
return POSSIBLE_DEFAULT_BRANCHES.some(defaultBranch =>
|
|
968
|
+
branch === defaultBranch || branch === `${remoteName}/${defaultBranch}`
|
|
969
|
+
)
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
if (Object.keys(metrics).length === 0) {
|
|
973
|
+
return null
|
|
974
|
+
}
|
|
975
|
+
// Find branch with smallest "ahead" value, preferring default branch on tie
|
|
976
|
+
let bestBranch = null
|
|
977
|
+
let bestScore = Infinity
|
|
978
|
+
for (const branch of Object.keys(metrics)) {
|
|
979
|
+
const score = metrics[branch].ahead
|
|
980
|
+
if (score < bestScore) {
|
|
981
|
+
bestScore = score
|
|
982
|
+
bestBranch = branch
|
|
983
|
+
} else if (score === bestScore && isDefaultBranch(branch)) {
|
|
984
|
+
bestScore = score
|
|
985
|
+
bestBranch = branch
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
return bestBranch ? metrics[bestBranch].baseSha : null
|
|
989
|
+
}
|
|
990
|
+
|
|
991
|
+
function getPullRequestDiff (baseCommit, targetCommit) {
|
|
992
|
+
if (!baseCommit) {
|
|
993
|
+
return
|
|
994
|
+
}
|
|
995
|
+
return getGitDiff(baseCommit, targetCommit)
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
function getModifiedTestsFromDiff (diff) {
|
|
999
|
+
if (!diff) return null
|
|
1000
|
+
const result = {}
|
|
1001
|
+
|
|
1002
|
+
const filesRegex = /^diff --git a\/(?<file>.+) b\/(?<file2>.+)$/g
|
|
1003
|
+
const linesRegex = /^@@ -\d+(,\d+)? \+(?<start>\d+)(,(?<count>\d+))? @@/g
|
|
1004
|
+
|
|
1005
|
+
let currentFile = null
|
|
1006
|
+
|
|
1007
|
+
// Go line by line
|
|
1008
|
+
const lines = diff.split('\n')
|
|
1009
|
+
for (const line of lines) {
|
|
1010
|
+
// Check for new file
|
|
1011
|
+
const fileMatch = filesRegex.exec(line)
|
|
1012
|
+
if (fileMatch && fileMatch.groups.file) {
|
|
1013
|
+
currentFile = fileMatch.groups.file
|
|
1014
|
+
result[currentFile] = []
|
|
1015
|
+
continue
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
// Check for changed lines
|
|
1019
|
+
const lineMatch = linesRegex.exec(line)
|
|
1020
|
+
if (lineMatch && currentFile) {
|
|
1021
|
+
const start = Number(lineMatch.groups.start)
|
|
1022
|
+
const count = lineMatch.groups.count ? Number(lineMatch.groups.count) : 1
|
|
1023
|
+
for (let j = 0; j < count; j++) {
|
|
1024
|
+
result[currentFile].push(start + j)
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
// Reset regexes to allow re-use
|
|
1029
|
+
filesRegex.lastIndex = 0
|
|
1030
|
+
linesRegex.lastIndex = 0
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
if (Object.keys(result).length === 0) {
|
|
1034
|
+
return null
|
|
1035
|
+
}
|
|
1036
|
+
return result
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
function isModifiedTest (testPath, testStartLine, testEndLine, modifiedTests, testFramework) {
|
|
1040
|
+
if (modifiedTests === undefined) {
|
|
1041
|
+
return false
|
|
1042
|
+
}
|
|
1043
|
+
|
|
1044
|
+
const lines = modifiedTests[testPath]
|
|
1045
|
+
if (!lines) {
|
|
1046
|
+
return false
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
// For unsupported frameworks, consider the test modified if any lines were changed
|
|
1050
|
+
if (NOT_SUPPORTED_GRANULARITY_IMPACTED_TESTS_FRAMEWORKS.has(testFramework)) {
|
|
1051
|
+
return lines.length > 0
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
// For supported frameworks, check if the test's line range overlaps with modified lines
|
|
1055
|
+
return lines.some(line => line >= testStartLine && line <= testEndLine)
|
|
1056
|
+
}
|
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
const log = require('../../log')
|
|
4
4
|
|
|
5
|
+
function applyFilter (filter, uri) {
|
|
6
|
+
if (typeof filter === 'function') {
|
|
7
|
+
return filter(uri)
|
|
8
|
+
} else if (filter instanceof RegExp) {
|
|
9
|
+
return filter.test(uri)
|
|
10
|
+
} else if (Array.isArray(filter)) {
|
|
11
|
+
return filter.some(filter => applyFilter(filter, uri))
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return filter === uri
|
|
15
|
+
}
|
|
16
|
+
|
|
5
17
|
const urlFilter = {
|
|
6
18
|
getFilter (config) {
|
|
7
19
|
if (typeof config.filter === 'function') {
|
|
@@ -13,23 +25,7 @@ const urlFilter = {
|
|
|
13
25
|
const allowlist = config.allowlist || config.whitelist || /.*/
|
|
14
26
|
const blocklist = config.blocklist || config.blacklist || []
|
|
15
27
|
|
|
16
|
-
return uri =>
|
|
17
|
-
const allowed = applyFilter(allowlist, uri)
|
|
18
|
-
const blocked = applyFilter(blocklist, uri)
|
|
19
|
-
return allowed && !blocked
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
function applyFilter (filter, uri) {
|
|
23
|
-
if (typeof filter === 'function') {
|
|
24
|
-
return filter(uri)
|
|
25
|
-
} else if (filter instanceof RegExp) {
|
|
26
|
-
return filter.test(uri)
|
|
27
|
-
} else if (filter instanceof Array) {
|
|
28
|
-
return filter.some(filter => applyFilter(filter, uri))
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return filter === uri
|
|
32
|
-
}
|
|
28
|
+
return uri => applyFilter(allowlist, uri) && !applyFilter(blocklist, uri)
|
|
33
29
|
}
|
|
34
30
|
}
|
|
35
31
|
|
|
@@ -9,11 +9,15 @@ const {
|
|
|
9
9
|
GIT_COMMIT_COMMITTER_NAME,
|
|
10
10
|
GIT_COMMIT_AUTHOR_DATE,
|
|
11
11
|
GIT_COMMIT_AUTHOR_EMAIL,
|
|
12
|
-
GIT_COMMIT_AUTHOR_NAME
|
|
12
|
+
GIT_COMMIT_AUTHOR_NAME,
|
|
13
|
+
GIT_PULL_REQUEST_BASE_BRANCH,
|
|
14
|
+
GIT_PULL_REQUEST_BASE_BRANCH_SHA,
|
|
15
|
+
GIT_COMMIT_HEAD_SHA
|
|
13
16
|
} = require('./tags')
|
|
14
17
|
|
|
15
18
|
const { normalizeRef } = require('./ci')
|
|
16
19
|
const { filterSensitiveInfoFromRepository } = require('./url')
|
|
20
|
+
const { getEnvironmentVariables } = require('../../config-helper')
|
|
17
21
|
|
|
18
22
|
function removeEmptyValues (tags) {
|
|
19
23
|
return Object.keys(tags).reduce((filteredTags, tag) => {
|
|
@@ -52,8 +56,11 @@ function getUserProviderGitMetadata () {
|
|
|
52
56
|
DD_GIT_COMMIT_COMMITTER_DATE,
|
|
53
57
|
DD_GIT_COMMIT_AUTHOR_NAME,
|
|
54
58
|
DD_GIT_COMMIT_AUTHOR_EMAIL,
|
|
55
|
-
DD_GIT_COMMIT_AUTHOR_DATE
|
|
56
|
-
|
|
59
|
+
DD_GIT_COMMIT_AUTHOR_DATE,
|
|
60
|
+
DD_GIT_PULL_REQUEST_BASE_BRANCH,
|
|
61
|
+
DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
|
|
62
|
+
DD_GIT_COMMIT_HEAD_SHA
|
|
63
|
+
} = getEnvironmentVariables()
|
|
57
64
|
|
|
58
65
|
const branch = normalizeRef(DD_GIT_BRANCH)
|
|
59
66
|
let tag = normalizeRef(DD_GIT_TAG)
|
|
@@ -74,7 +81,10 @@ function getUserProviderGitMetadata () {
|
|
|
74
81
|
[GIT_COMMIT_COMMITTER_EMAIL]: DD_GIT_COMMIT_COMMITTER_EMAIL,
|
|
75
82
|
[GIT_COMMIT_AUTHOR_NAME]: DD_GIT_COMMIT_AUTHOR_NAME,
|
|
76
83
|
[GIT_COMMIT_AUTHOR_EMAIL]: DD_GIT_COMMIT_AUTHOR_EMAIL,
|
|
77
|
-
[GIT_COMMIT_AUTHOR_DATE]: DD_GIT_COMMIT_AUTHOR_DATE
|
|
84
|
+
[GIT_COMMIT_AUTHOR_DATE]: DD_GIT_COMMIT_AUTHOR_DATE,
|
|
85
|
+
[GIT_PULL_REQUEST_BASE_BRANCH]: DD_GIT_PULL_REQUEST_BASE_BRANCH,
|
|
86
|
+
[GIT_PULL_REQUEST_BASE_BRANCH_SHA]: DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
|
|
87
|
+
[GIT_COMMIT_HEAD_SHA]: DD_GIT_COMMIT_HEAD_SHA
|
|
78
88
|
})
|
|
79
89
|
}
|
|
80
90
|
|
|
@@ -253,7 +253,7 @@ const web = {
|
|
|
253
253
|
if (!context) return null
|
|
254
254
|
if (context.middleware.length === 0) return context.span || null
|
|
255
255
|
|
|
256
|
-
return context.middleware.
|
|
256
|
+
return context.middleware.at(-1)
|
|
257
257
|
},
|
|
258
258
|
|
|
259
259
|
// Extract the parent span from the headers and start a new span as its child
|
|
@@ -421,7 +421,7 @@ function addAllowHeaders (req, res, headers) {
|
|
|
421
421
|
]
|
|
422
422
|
|
|
423
423
|
for (const header of contextHeaders) {
|
|
424
|
-
if (
|
|
424
|
+
if (requestHeaders.includes(header)) {
|
|
425
425
|
allowHeaders.push(header)
|
|
426
426
|
}
|
|
427
427
|
}
|
|
@@ -500,7 +500,7 @@ function addResourceTag (context) {
|
|
|
500
500
|
if (tags['resource.name']) return
|
|
501
501
|
|
|
502
502
|
const resource = [req.method, tags[HTTP_ROUTE]]
|
|
503
|
-
.filter(
|
|
503
|
+
.filter(Boolean)
|
|
504
504
|
.join(' ')
|
|
505
505
|
|
|
506
506
|
span.setTag(RESOURCE_NAME, resource)
|
|
@@ -530,10 +530,9 @@ function extractURL (req) {
|
|
|
530
530
|
|
|
531
531
|
if (req.stream) {
|
|
532
532
|
return `${headers[HTTP2_HEADER_SCHEME]}://${headers[HTTP2_HEADER_AUTHORITY]}${headers[HTTP2_HEADER_PATH]}`
|
|
533
|
-
} else {
|
|
534
|
-
const protocol = getProtocol(req)
|
|
535
|
-
return `${protocol}://${req.headers.host}${req.originalUrl || req.url}`
|
|
536
533
|
}
|
|
534
|
+
const protocol = getProtocol(req)
|
|
535
|
+
return `${protocol}://${req.headers.host}${req.originalUrl || req.url}`
|
|
537
536
|
}
|
|
538
537
|
|
|
539
538
|
function getProtocol (req) {
|
|
@@ -567,9 +566,10 @@ function getStatusValidator (config) {
|
|
|
567
566
|
return code => code < 500
|
|
568
567
|
}
|
|
569
568
|
|
|
569
|
+
const noop = () => {}
|
|
570
|
+
|
|
570
571
|
function getHooks (config) {
|
|
571
|
-
const
|
|
572
|
-
const request = (config.hooks && config.hooks.request) || noop
|
|
572
|
+
const request = config.hooks?.request ?? noop
|
|
573
573
|
|
|
574
574
|
return { request }
|
|
575
575
|
}
|