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
|
@@ -34,7 +34,10 @@ const {
|
|
|
34
34
|
TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX,
|
|
35
35
|
TEST_HAS_FAILED_ALL_RETRIES,
|
|
36
36
|
TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
|
|
37
|
-
TEST_RETRY_REASON_TYPES
|
|
37
|
+
TEST_RETRY_REASON_TYPES,
|
|
38
|
+
TEST_IS_MODIFIED,
|
|
39
|
+
isModifiedTest,
|
|
40
|
+
getTestEndLine
|
|
38
41
|
} = require('../../dd-trace/src/plugins/util/test')
|
|
39
42
|
const { RESOURCE_NAME } = require('../../../ext/tags')
|
|
40
43
|
const { COMPONENT, ERROR_MESSAGE } = require('../../dd-trace/src/constants')
|
|
@@ -221,13 +224,8 @@ class CucumberPlugin extends CiPlugin {
|
|
|
221
224
|
this.telemetry.ciVisEvent(TELEMETRY_CODE_COVERAGE_FINISHED, 'suite', { library: 'istanbul' })
|
|
222
225
|
})
|
|
223
226
|
|
|
224
|
-
this.
|
|
225
|
-
testName,
|
|
226
|
-
testFileAbsolutePath,
|
|
227
|
-
testSourceLine,
|
|
228
|
-
isParallel,
|
|
229
|
-
promises
|
|
230
|
-
}) => {
|
|
227
|
+
this.addBind('ci:cucumber:test:start', (ctx) => {
|
|
228
|
+
const { testName, testFileAbsolutePath, testSourceLine, isParallel, promises } = ctx
|
|
231
229
|
const store = storage('legacy').getStore()
|
|
232
230
|
const testSuite = getTestSuitePath(testFileAbsolutePath, this.sourceRoot)
|
|
233
231
|
const testSourceFile = getTestSuitePath(testFileAbsolutePath, this.repositoryRoot)
|
|
@@ -240,22 +238,23 @@ class CucumberPlugin extends CiPlugin {
|
|
|
240
238
|
extraTags[CUCUMBER_IS_PARALLEL] = 'true'
|
|
241
239
|
}
|
|
242
240
|
|
|
243
|
-
const
|
|
241
|
+
const span = this.startTestSpan(testName, testSuite, extraTags)
|
|
244
242
|
|
|
245
|
-
|
|
243
|
+
ctx.parentStore = store
|
|
244
|
+
ctx.currentStore = { ...store, span }
|
|
246
245
|
|
|
247
|
-
this.activeTestSpan =
|
|
246
|
+
this.activeTestSpan = span
|
|
248
247
|
// Time we give the breakpoint to be hit
|
|
249
248
|
if (promises && this.runningTestProbe) {
|
|
250
249
|
promises.hitBreakpointPromise = new Promise((resolve) => {
|
|
251
250
|
setTimeout(resolve, BREAKPOINT_HIT_GRACE_PERIOD_MS)
|
|
252
251
|
})
|
|
253
252
|
}
|
|
253
|
+
|
|
254
|
+
return ctx.currentStore
|
|
254
255
|
})
|
|
255
256
|
|
|
256
|
-
this.addSub('ci:cucumber:test:retry', ({ isFirstAttempt, error, isAtrRetry }) => {
|
|
257
|
-
const store = storage('legacy').getStore()
|
|
258
|
-
const span = store.span
|
|
257
|
+
this.addSub('ci:cucumber:test:retry', ({ span, isFirstAttempt, error, isAtrRetry }) => {
|
|
259
258
|
if (!isFirstAttempt) {
|
|
260
259
|
span.setTag(TEST_IS_RETRY, 'true')
|
|
261
260
|
if (isAtrRetry) {
|
|
@@ -284,7 +283,9 @@ class CucumberPlugin extends CiPlugin {
|
|
|
284
283
|
finishAllTraceSpans(span)
|
|
285
284
|
})
|
|
286
285
|
|
|
287
|
-
this.
|
|
286
|
+
this.addBind('ci:cucumber:test-step:start', (ctx) => {
|
|
287
|
+
const { resource } = ctx
|
|
288
|
+
|
|
288
289
|
const store = storage('legacy').getStore()
|
|
289
290
|
const childOf = store ? store.span : store
|
|
290
291
|
const span = this.tracer.startSpan('cucumber.step', {
|
|
@@ -295,7 +296,10 @@ class CucumberPlugin extends CiPlugin {
|
|
|
295
296
|
[RESOURCE_NAME]: resource
|
|
296
297
|
}
|
|
297
298
|
})
|
|
298
|
-
|
|
299
|
+
ctx.parentStore = store
|
|
300
|
+
ctx.currentStore = { ...store, span }
|
|
301
|
+
|
|
302
|
+
return ctx.currentStore
|
|
299
303
|
})
|
|
300
304
|
|
|
301
305
|
this.addSub('ci:cucumber:worker-report:trace', (traces) => {
|
|
@@ -329,6 +333,7 @@ class CucumberPlugin extends CiPlugin {
|
|
|
329
333
|
})
|
|
330
334
|
|
|
331
335
|
this.addSub('ci:cucumber:test:finish', ({
|
|
336
|
+
span,
|
|
332
337
|
isStep,
|
|
333
338
|
status,
|
|
334
339
|
skipReason,
|
|
@@ -343,9 +348,9 @@ class CucumberPlugin extends CiPlugin {
|
|
|
343
348
|
hasPassedAllRetries,
|
|
344
349
|
hasFailedAttemptToFix,
|
|
345
350
|
isDisabled,
|
|
346
|
-
isQuarantined
|
|
351
|
+
isQuarantined,
|
|
352
|
+
isModified
|
|
347
353
|
}) => {
|
|
348
|
-
const span = storage('legacy').getStore().span
|
|
349
354
|
const statusTag = isStep ? 'step.status' : TEST_STATUS
|
|
350
355
|
|
|
351
356
|
span.setTag(statusTag, status)
|
|
@@ -399,6 +404,14 @@ class CucumberPlugin extends CiPlugin {
|
|
|
399
404
|
span.setTag(TEST_MANAGEMENT_IS_QUARANTINED, 'true')
|
|
400
405
|
}
|
|
401
406
|
|
|
407
|
+
if (isModified) {
|
|
408
|
+
span.setTag(TEST_IS_MODIFIED, 'true')
|
|
409
|
+
if (isEfdRetry) {
|
|
410
|
+
span.setTag(TEST_IS_RETRY, 'true')
|
|
411
|
+
span.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
402
415
|
span.finish()
|
|
403
416
|
if (!isStep) {
|
|
404
417
|
const spanTags = span.context()._tags
|
|
@@ -425,11 +438,64 @@ class CucumberPlugin extends CiPlugin {
|
|
|
425
438
|
}
|
|
426
439
|
})
|
|
427
440
|
|
|
428
|
-
this.
|
|
441
|
+
this.addBind('ci:cucumber:error', (ctx) => {
|
|
442
|
+
const { err } = ctx
|
|
429
443
|
if (err) {
|
|
430
|
-
const span =
|
|
444
|
+
const span = ctx.currentStore.span
|
|
431
445
|
span.setTag('error', err)
|
|
446
|
+
|
|
447
|
+
ctx.parentStore = ctx.currentStore
|
|
448
|
+
ctx.currentStore = { ...ctx.currentStore, span }
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
return ctx.currentStore
|
|
452
|
+
})
|
|
453
|
+
|
|
454
|
+
this.addBind('ci:cucumber:test:fn', (ctx) => {
|
|
455
|
+
return ctx.currentStore
|
|
456
|
+
})
|
|
457
|
+
|
|
458
|
+
this.addSub('ci:cucumber:is-modified-test', ({
|
|
459
|
+
scenarios,
|
|
460
|
+
testFileAbsolutePath,
|
|
461
|
+
modifiedTests,
|
|
462
|
+
stepIds,
|
|
463
|
+
stepDefinitions,
|
|
464
|
+
setIsModified
|
|
465
|
+
}) => {
|
|
466
|
+
const testScenarioPath = getTestSuitePath(testFileAbsolutePath, this.repositoryRoot || process.cwd())
|
|
467
|
+
for (const scenario of scenarios) {
|
|
468
|
+
const isModified = isModifiedTest(
|
|
469
|
+
testScenarioPath,
|
|
470
|
+
scenario.location.line,
|
|
471
|
+
scenario.steps[scenario.steps.length - 1].location.line,
|
|
472
|
+
modifiedTests,
|
|
473
|
+
'cucumber'
|
|
474
|
+
)
|
|
475
|
+
if (isModified) {
|
|
476
|
+
setIsModified(true)
|
|
477
|
+
return
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
for (const stepDefinition of stepDefinitions) {
|
|
481
|
+
if (!stepIds?.includes(stepDefinition.id)) {
|
|
482
|
+
continue
|
|
483
|
+
}
|
|
484
|
+
const testStartLineStep = stepDefinition.line
|
|
485
|
+
const testEndLineStep = getTestEndLine(stepDefinition.code, testStartLineStep)
|
|
486
|
+
const isModified = isModifiedTest(
|
|
487
|
+
stepDefinition.uri,
|
|
488
|
+
testStartLineStep,
|
|
489
|
+
testEndLineStep,
|
|
490
|
+
modifiedTests,
|
|
491
|
+
'cucumber'
|
|
492
|
+
)
|
|
493
|
+
if (isModified) {
|
|
494
|
+
setIsModified(true)
|
|
495
|
+
return
|
|
496
|
+
}
|
|
432
497
|
}
|
|
498
|
+
setIsModified(false)
|
|
433
499
|
})
|
|
434
500
|
}
|
|
435
501
|
|
|
@@ -41,7 +41,11 @@ const {
|
|
|
41
41
|
TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
|
|
42
42
|
TEST_HAS_FAILED_ALL_RETRIES,
|
|
43
43
|
getLibraryCapabilitiesTags,
|
|
44
|
-
TEST_RETRY_REASON_TYPES
|
|
44
|
+
TEST_RETRY_REASON_TYPES,
|
|
45
|
+
getPullRequestDiff,
|
|
46
|
+
getModifiedTestsFromDiff,
|
|
47
|
+
TEST_IS_MODIFIED,
|
|
48
|
+
getPullRequestBaseBranch
|
|
45
49
|
} = require('../../dd-trace/src/plugins/util/test')
|
|
46
50
|
const { isMarkedAsUnskippable } = require('../../datadog-plugin-jest/src/util')
|
|
47
51
|
const { ORIGIN_KEY, COMPONENT } = require('../../dd-trace/src/constants')
|
|
@@ -67,7 +71,11 @@ const {
|
|
|
67
71
|
GIT_BRANCH,
|
|
68
72
|
CI_PROVIDER_NAME,
|
|
69
73
|
CI_WORKSPACE_PATH,
|
|
70
|
-
GIT_COMMIT_MESSAGE
|
|
74
|
+
GIT_COMMIT_MESSAGE,
|
|
75
|
+
GIT_TAG,
|
|
76
|
+
GIT_PULL_REQUEST_BASE_BRANCH_SHA,
|
|
77
|
+
GIT_COMMIT_HEAD_SHA,
|
|
78
|
+
GIT_PULL_REQUEST_BASE_BRANCH
|
|
71
79
|
} = require('../../dd-trace/src/plugins/util/tags')
|
|
72
80
|
const {
|
|
73
81
|
OS_VERSION,
|
|
@@ -76,6 +84,7 @@ const {
|
|
|
76
84
|
RUNTIME_NAME,
|
|
77
85
|
RUNTIME_VERSION
|
|
78
86
|
} = require('../../dd-trace/src/plugins/util/env')
|
|
87
|
+
const { DD_MAJOR } = require('../../../version')
|
|
79
88
|
|
|
80
89
|
const TEST_FRAMEWORK_NAME = 'cypress'
|
|
81
90
|
|
|
@@ -175,6 +184,26 @@ function getTestManagementTests (tracer, testConfiguration) {
|
|
|
175
184
|
})
|
|
176
185
|
}
|
|
177
186
|
|
|
187
|
+
function getModifiedTests (testEnvironmentMetadata) {
|
|
188
|
+
const {
|
|
189
|
+
[GIT_PULL_REQUEST_BASE_BRANCH]: pullRequestBaseBranch,
|
|
190
|
+
[GIT_PULL_REQUEST_BASE_BRANCH_SHA]: pullRequestBaseBranchSha,
|
|
191
|
+
[GIT_COMMIT_HEAD_SHA]: commitHeadSha
|
|
192
|
+
} = testEnvironmentMetadata
|
|
193
|
+
|
|
194
|
+
const baseBranchSha = pullRequestBaseBranchSha || getPullRequestBaseBranch(pullRequestBaseBranch)
|
|
195
|
+
|
|
196
|
+
if (baseBranchSha) {
|
|
197
|
+
const diff = getPullRequestDiff(baseBranchSha, commitHeadSha)
|
|
198
|
+
const modifiedTests = getModifiedTestsFromDiff(diff)
|
|
199
|
+
if (modifiedTests) {
|
|
200
|
+
return modifiedTests
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
throw new Error('Modified tests could not be retrieved')
|
|
205
|
+
}
|
|
206
|
+
|
|
178
207
|
function getSuiteStatus (suiteStats) {
|
|
179
208
|
if (!suiteStats) {
|
|
180
209
|
return 'skip'
|
|
@@ -205,10 +234,13 @@ class CypressPlugin {
|
|
|
205
234
|
[GIT_BRANCH]: branch,
|
|
206
235
|
[CI_PROVIDER_NAME]: ciProviderName,
|
|
207
236
|
[CI_WORKSPACE_PATH]: repositoryRoot,
|
|
208
|
-
[GIT_COMMIT_MESSAGE]: commitMessage
|
|
237
|
+
[GIT_COMMIT_MESSAGE]: commitMessage,
|
|
238
|
+
[GIT_TAG]: tag,
|
|
239
|
+
[GIT_PULL_REQUEST_BASE_BRANCH_SHA]: pullRequestBaseSha,
|
|
240
|
+
[GIT_COMMIT_HEAD_SHA]: commitHeadSha
|
|
209
241
|
} = this.testEnvironmentMetadata
|
|
210
242
|
|
|
211
|
-
this.repositoryRoot = repositoryRoot
|
|
243
|
+
this.repositoryRoot = repositoryRoot || process.cwd()
|
|
212
244
|
this.ciProviderName = ciProviderName
|
|
213
245
|
this.codeOwnersEntries = getCodeOwnersFileEntries(repositoryRoot)
|
|
214
246
|
|
|
@@ -222,7 +254,10 @@ class CypressPlugin {
|
|
|
222
254
|
runtimeVersion,
|
|
223
255
|
branch,
|
|
224
256
|
testLevel: 'test',
|
|
225
|
-
commitMessage
|
|
257
|
+
commitMessage,
|
|
258
|
+
tag,
|
|
259
|
+
pullRequestBaseSha,
|
|
260
|
+
commitHeadSha
|
|
226
261
|
}
|
|
227
262
|
this.finishedTestsByFile = {}
|
|
228
263
|
this.testStatuses = {}
|
|
@@ -242,6 +277,8 @@ class CypressPlugin {
|
|
|
242
277
|
this.knownTests = []
|
|
243
278
|
this.isTestManagementTestsEnabled = false
|
|
244
279
|
this.testManagementAttemptToFixRetries = 0
|
|
280
|
+
this.isImpactedTestsEnabled = false
|
|
281
|
+
this.modifiedTests = []
|
|
245
282
|
}
|
|
246
283
|
|
|
247
284
|
// Init function returns a promise that resolves with the Cypress configuration
|
|
@@ -271,7 +308,8 @@ class CypressPlugin {
|
|
|
271
308
|
flakyTestRetriesCount,
|
|
272
309
|
isKnownTestsEnabled,
|
|
273
310
|
isTestManagementEnabled,
|
|
274
|
-
testManagementAttemptToFixRetries
|
|
311
|
+
testManagementAttemptToFixRetries,
|
|
312
|
+
isImpactedTestsEnabled
|
|
275
313
|
}
|
|
276
314
|
} = libraryConfigurationResponse
|
|
277
315
|
this.isSuitesSkippingEnabled = isSuitesSkippingEnabled
|
|
@@ -285,12 +323,25 @@ class CypressPlugin {
|
|
|
285
323
|
}
|
|
286
324
|
this.isTestManagementTestsEnabled = isTestManagementEnabled
|
|
287
325
|
this.testManagementAttemptToFixRetries = testManagementAttemptToFixRetries
|
|
326
|
+
this.isImpactedTestsEnabled = isImpactedTestsEnabled
|
|
288
327
|
}
|
|
289
328
|
return this.cypressConfig
|
|
290
329
|
})
|
|
291
330
|
return this.libraryConfigurationPromise
|
|
292
331
|
}
|
|
293
332
|
|
|
333
|
+
getIsTestModified (testSuiteAbsolutePath) {
|
|
334
|
+
const relativeTestSuitePath = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
|
|
335
|
+
if (!this.modifiedTests) {
|
|
336
|
+
return false
|
|
337
|
+
}
|
|
338
|
+
const lines = this.modifiedTests[relativeTestSuitePath]
|
|
339
|
+
if (!lines) {
|
|
340
|
+
return false
|
|
341
|
+
}
|
|
342
|
+
return lines.length > 0
|
|
343
|
+
}
|
|
344
|
+
|
|
294
345
|
getTestSuiteProperties (testSuite) {
|
|
295
346
|
return this.testManagementTests?.cypress?.suites?.[testSuite]?.tests || {}
|
|
296
347
|
}
|
|
@@ -455,6 +506,15 @@ class CypressPlugin {
|
|
|
455
506
|
}
|
|
456
507
|
}
|
|
457
508
|
|
|
509
|
+
if (this.isImpactedTestsEnabled) {
|
|
510
|
+
try {
|
|
511
|
+
this.modifiedTests = getModifiedTests(this.testEnvironmentMetadata)
|
|
512
|
+
} catch (error) {
|
|
513
|
+
log.error(error)
|
|
514
|
+
this.isImpactedTestsEnabled = false
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
458
518
|
// `details.specs` are test files
|
|
459
519
|
details.specs?.forEach(({ absolute, relative }) => {
|
|
460
520
|
const isUnskippableSuite = isMarkedAsUnskippable({ path: absolute })
|
|
@@ -474,7 +534,13 @@ class CypressPlugin {
|
|
|
474
534
|
testSessionSpanMetadata[TEST_EARLY_FLAKE_ENABLED] = 'true'
|
|
475
535
|
}
|
|
476
536
|
|
|
477
|
-
const
|
|
537
|
+
const trimmedCommand = DD_MAJOR < 6 ? this.command : 'cypress run'
|
|
538
|
+
|
|
539
|
+
const testSessionName = getTestSessionName(
|
|
540
|
+
this.tracer._tracer._config,
|
|
541
|
+
trimmedCommand,
|
|
542
|
+
this.testEnvironmentMetadata
|
|
543
|
+
)
|
|
478
544
|
|
|
479
545
|
if (this.tracer._tracer._exporter?.addMetadataTags) {
|
|
480
546
|
const metadataTags = {}
|
|
@@ -601,13 +667,9 @@ class CypressPlugin {
|
|
|
601
667
|
const isSkippedByItr = this.testsToSkip.find(test =>
|
|
602
668
|
cypressTestName === test.name && spec.relative === test.suite
|
|
603
669
|
)
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
testSourceFile = getTestSuitePath(spec.absolute, this.repositoryRoot)
|
|
608
|
-
} else {
|
|
609
|
-
testSourceFile = spec.relative
|
|
610
|
-
}
|
|
670
|
+
const testSourceFile = spec.absolute && this.repositoryRoot
|
|
671
|
+
? getTestSuitePath(spec.absolute, this.repositoryRoot)
|
|
672
|
+
: spec.relative
|
|
611
673
|
|
|
612
674
|
const skippedTestSpan = this.getTestSpan({ testName: cypressTestName, testSuite: spec.relative, testSourceFile })
|
|
613
675
|
|
|
@@ -683,12 +745,9 @@ class CypressPlugin {
|
|
|
683
745
|
if (this.itrCorrelationId) {
|
|
684
746
|
finishedTest.testSpan.setTag(ITR_CORRELATION_ID, this.itrCorrelationId)
|
|
685
747
|
}
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
} else {
|
|
690
|
-
testSourceFile = spec.relative
|
|
691
|
-
}
|
|
748
|
+
const testSourceFile = spec.absolute && this.repositoryRoot
|
|
749
|
+
? getTestSuitePath(spec.absolute, this.repositoryRoot)
|
|
750
|
+
: spec.relative
|
|
692
751
|
if (testSourceFile) {
|
|
693
752
|
finishedTest.testSpan.setTag(TEST_SOURCE_FILE, testSourceFile)
|
|
694
753
|
}
|
|
@@ -725,7 +784,10 @@ class CypressPlugin {
|
|
|
725
784
|
isKnownTestsEnabled: this.isKnownTestsEnabled,
|
|
726
785
|
isTestManagementEnabled: this.isTestManagementTestsEnabled,
|
|
727
786
|
testManagementAttemptToFixRetries: this.testManagementAttemptToFixRetries,
|
|
728
|
-
testManagementTests: this.getTestSuiteProperties(testSuite)
|
|
787
|
+
testManagementTests: this.getTestSuiteProperties(testSuite),
|
|
788
|
+
isImpactedTestsEnabled: this.isImpactedTestsEnabled,
|
|
789
|
+
isModifiedTest: this.getIsTestModified(testSuiteAbsolutePath),
|
|
790
|
+
repositoryRoot: this.repositoryRoot
|
|
729
791
|
}
|
|
730
792
|
|
|
731
793
|
if (this.testSuiteSpan) {
|
|
@@ -736,7 +798,7 @@ class CypressPlugin {
|
|
|
736
798
|
},
|
|
737
799
|
'dd:beforeEach': (test) => {
|
|
738
800
|
const { testName, testSuite } = test
|
|
739
|
-
const shouldSkip =
|
|
801
|
+
const shouldSkip = this.testsToSkip.some(test => {
|
|
740
802
|
return testName === test.name && testSuite === test.suite
|
|
741
803
|
})
|
|
742
804
|
const isUnskippable = this.unskippableSuites.includes(testSuite)
|
|
@@ -783,7 +845,8 @@ class CypressPlugin {
|
|
|
783
845
|
testName,
|
|
784
846
|
isNew,
|
|
785
847
|
isEfdRetry,
|
|
786
|
-
isAttemptToFix
|
|
848
|
+
isAttemptToFix,
|
|
849
|
+
isModified
|
|
787
850
|
} = test
|
|
788
851
|
if (coverage && this.isCodeCoverageEnabled && this.tracer._tracer._exporter?.exportCoverage) {
|
|
789
852
|
const coverageFiles = getCoveredFilenamesFromCoverage(coverage)
|
|
@@ -807,10 +870,10 @@ class CypressPlugin {
|
|
|
807
870
|
this.activeTestSpan.setTag(TEST_STATUS, testStatus)
|
|
808
871
|
|
|
809
872
|
// Save the test status to know if it has passed all retries
|
|
810
|
-
if (
|
|
811
|
-
this.testStatuses[testName] = [testStatus]
|
|
812
|
-
} else {
|
|
873
|
+
if (this.testStatuses[testName]) {
|
|
813
874
|
this.testStatuses[testName].push(testStatus)
|
|
875
|
+
} else {
|
|
876
|
+
this.testStatuses[testName] = [testStatus]
|
|
814
877
|
}
|
|
815
878
|
const testStatuses = this.testStatuses[testName]
|
|
816
879
|
|
|
@@ -830,6 +893,13 @@ class CypressPlugin {
|
|
|
830
893
|
this.activeTestSpan.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
|
|
831
894
|
}
|
|
832
895
|
}
|
|
896
|
+
if (isModified) {
|
|
897
|
+
this.activeTestSpan.setTag(TEST_IS_MODIFIED, 'true')
|
|
898
|
+
if (isEfdRetry) {
|
|
899
|
+
this.activeTestSpan.setTag(TEST_IS_RETRY, 'true')
|
|
900
|
+
this.activeTestSpan.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
|
|
901
|
+
}
|
|
902
|
+
}
|
|
833
903
|
if (isAttemptToFix) {
|
|
834
904
|
this.activeTestSpan.setTag(TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX, 'true')
|
|
835
905
|
if (testStatuses.length > 1) {
|
|
@@ -838,7 +908,7 @@ class CypressPlugin {
|
|
|
838
908
|
}
|
|
839
909
|
const isLastAttempt = testStatuses.length === this.testManagementAttemptToFixRetries + 1
|
|
840
910
|
if (isLastAttempt) {
|
|
841
|
-
if (testStatuses.
|
|
911
|
+
if (testStatuses.includes('fail')) {
|
|
842
912
|
this.activeTestSpan.setTag(TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED, 'false')
|
|
843
913
|
}
|
|
844
914
|
if (testStatuses.every(status => status === 'fail')) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const NoopTracer = require('../../dd-trace/src/noop/tracer')
|
|
2
2
|
const cypressPlugin = require('./cypress-plugin')
|
|
3
3
|
const satisfies = require('semifies')
|
|
4
|
+
const { DD_MAJOR } = require('../../../version')
|
|
4
5
|
|
|
5
6
|
const noopTask = {
|
|
6
7
|
'dd:testSuiteStart': () => {
|
|
@@ -17,10 +18,19 @@ const noopTask = {
|
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
|
|
20
|
-
module.exports = (on, config)
|
|
21
|
+
module.exports = function CypressPlugin (on, config) {
|
|
21
22
|
const tracer = require('../../dd-trace')
|
|
22
23
|
|
|
23
24
|
if (satisfies(config.version, '<10.2.0')) {
|
|
25
|
+
if (DD_MAJOR >= 6) {
|
|
26
|
+
// eslint-disable-next-line no-console
|
|
27
|
+
console.error(
|
|
28
|
+
'ERROR: dd-trace v6 has deleted support for Cypress<10.2.0.'
|
|
29
|
+
)
|
|
30
|
+
on('task', noopTask)
|
|
31
|
+
return config
|
|
32
|
+
}
|
|
33
|
+
|
|
24
34
|
// console.warn does not seem to work in cypress, so using console.log instead
|
|
25
35
|
// eslint-disable-next-line no-console
|
|
26
36
|
console.log(
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
/* eslint-disable unicorn/no-abusive-eslint-disable */
|
|
1
2
|
/* eslint-disable */
|
|
2
3
|
let isEarlyFlakeDetectionEnabled = false
|
|
3
4
|
let isKnownTestsEnabled = false
|
|
4
5
|
let knownTestsForSuite = []
|
|
5
|
-
let suiteTests = []
|
|
6
6
|
let earlyFlakeDetectionNumRetries = 0
|
|
7
7
|
let isTestManagementEnabled = false
|
|
8
8
|
let testManagementAttemptToFixRetries = 0
|
|
9
9
|
let testManagementTests = {}
|
|
10
|
+
let isImpactedTestsEnabled = false
|
|
11
|
+
let isModifiedTest = false
|
|
12
|
+
|
|
10
13
|
// We need to grab the original window as soon as possible,
|
|
11
14
|
// in case the test changes the origin. If the test does change the origin,
|
|
12
15
|
// any call to `cy.window()` will result in a cross origin error.
|
|
@@ -48,10 +51,9 @@ function retryTest (test, suiteTests, numRetries, tags) {
|
|
|
48
51
|
}
|
|
49
52
|
}
|
|
50
53
|
|
|
51
|
-
|
|
52
54
|
const oldRunTests = Cypress.mocha.getRunner().runTests
|
|
53
55
|
Cypress.mocha.getRunner().runTests = function (suite, fn) {
|
|
54
|
-
if (!isKnownTestsEnabled && !isTestManagementEnabled) {
|
|
56
|
+
if (!isKnownTestsEnabled && !isTestManagementEnabled && !isImpactedTestsEnabled) {
|
|
55
57
|
return oldRunTests.apply(this, arguments)
|
|
56
58
|
}
|
|
57
59
|
// We copy the new tests at the beginning of the suite run (runTests), so that they're run
|
|
@@ -67,10 +69,24 @@ Cypress.mocha.getRunner().runTests = function (suite, fn) {
|
|
|
67
69
|
retryTest(test, suite.tests, testManagementAttemptToFixRetries, ['_ddIsAttemptToFix'])
|
|
68
70
|
}
|
|
69
71
|
}
|
|
72
|
+
if (isImpactedTestsEnabled && isModifiedTest) {
|
|
73
|
+
test._ddIsModified = true
|
|
74
|
+
if (isEarlyFlakeDetectionEnabled && !isAttemptToFix) {
|
|
75
|
+
retryTest(
|
|
76
|
+
test,
|
|
77
|
+
suite.tests,
|
|
78
|
+
earlyFlakeDetectionNumRetries,
|
|
79
|
+
['_ddIsModified', '_ddIsEfdRetry', isKnownTestsEnabled && isNewTest(test) && '_ddIsNew']
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
}
|
|
70
83
|
if (isKnownTestsEnabled) {
|
|
71
84
|
if (!test._ddIsNew && !test.isPending() && isNewTest(test)) {
|
|
72
85
|
test._ddIsNew = true
|
|
73
|
-
if (
|
|
86
|
+
if (isImpactedTestsEnabled && isModifiedTest) {
|
|
87
|
+
test._ddIsModified = true
|
|
88
|
+
}
|
|
89
|
+
if (isEarlyFlakeDetectionEnabled && !isAttemptToFix && !isModifiedTest) {
|
|
74
90
|
retryTest(test, suite.tests, earlyFlakeDetectionNumRetries, ['_ddIsNew', '_ddIsEfdRetry'])
|
|
75
91
|
}
|
|
76
92
|
}
|
|
@@ -108,6 +124,8 @@ before(function () {
|
|
|
108
124
|
isTestManagementEnabled = suiteConfig.isTestManagementEnabled
|
|
109
125
|
testManagementAttemptToFixRetries = suiteConfig.testManagementAttemptToFixRetries
|
|
110
126
|
testManagementTests = suiteConfig.testManagementTests
|
|
127
|
+
isImpactedTestsEnabled = suiteConfig.isImpactedTestsEnabled
|
|
128
|
+
isModifiedTest = suiteConfig.isModifiedTest
|
|
111
129
|
}
|
|
112
130
|
})
|
|
113
131
|
})
|
|
@@ -133,7 +151,8 @@ afterEach(function () {
|
|
|
133
151
|
error: currentTest.err,
|
|
134
152
|
isNew: currentTest._ddIsNew,
|
|
135
153
|
isEfdRetry: currentTest._ddIsEfdRetry,
|
|
136
|
-
isAttemptToFix: currentTest._ddIsAttemptToFix
|
|
154
|
+
isAttemptToFix: currentTest._ddIsAttemptToFix,
|
|
155
|
+
isModified: currentTest._ddIsModified
|
|
137
156
|
}
|
|
138
157
|
try {
|
|
139
158
|
testInfo.testSourceLine = Cypress.mocha.getRunner().currentRunnable.invocationDetails.line
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const { entryTags } = require('../../datadog-code-origin')
|
|
4
|
+
const Plugin = require('../../dd-trace/src/plugins/plugin')
|
|
5
|
+
const web = require('../../dd-trace/src/plugins/util/web')
|
|
6
|
+
|
|
7
|
+
class ExpressCodeOriginForSpansPlugin extends Plugin {
|
|
8
|
+
static get id () {
|
|
9
|
+
return 'express'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
constructor (...args) {
|
|
13
|
+
super(...args)
|
|
14
|
+
|
|
15
|
+
const layerTags = new WeakMap()
|
|
16
|
+
|
|
17
|
+
this.addSub('apm:express:middleware:enter', ({ req, layer }) => {
|
|
18
|
+
const tags = layerTags.get(layer)
|
|
19
|
+
if (!tags) return
|
|
20
|
+
web.getContext(req).span?.addTags(tags)
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
this.addSub('apm:express:route:added', ({ topOfStackFunc, layer }) => {
|
|
24
|
+
if (layerTags.has(layer)) return
|
|
25
|
+
layerTags.set(layer, entryTags(topOfStackFunc))
|
|
26
|
+
})
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
module.exports = ExpressCodeOriginForSpansPlugin
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const ExpressTracingPlugin = require('./tracing')
|
|
4
|
+
const ExpressCodeOriginForSpansPlugin = require('./code_origin')
|
|
5
|
+
const CompositePlugin = require('../../dd-trace/src/plugins/composite')
|
|
4
6
|
|
|
5
|
-
class ExpressPlugin extends
|
|
6
|
-
static get id () {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
this.addSub('apm:express:request:handle', ({ req }) => {
|
|
14
|
-
this.setFramework(req, 'express', this.config)
|
|
15
|
-
})
|
|
7
|
+
class ExpressPlugin extends CompositePlugin {
|
|
8
|
+
static get id () { return 'express' }
|
|
9
|
+
static get plugins () {
|
|
10
|
+
return {
|
|
11
|
+
tracing: ExpressTracingPlugin,
|
|
12
|
+
codeOriginForSpans: ExpressCodeOriginForSpansPlugin
|
|
13
|
+
}
|
|
16
14
|
}
|
|
17
15
|
}
|
|
18
16
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const RouterPlugin = require('../../datadog-plugin-router/src')
|
|
4
|
+
|
|
5
|
+
class ExpressTracingPlugin extends RouterPlugin {
|
|
6
|
+
static get id () {
|
|
7
|
+
return 'express'
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
constructor (...args) {
|
|
11
|
+
super(...args)
|
|
12
|
+
|
|
13
|
+
this.addSub('apm:express:request:handle', ({ req }) => {
|
|
14
|
+
this.setFramework(req, 'express', this.config)
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = ExpressTracingPlugin
|
|
@@ -7,18 +7,22 @@ class GoogleCloudPubsubClientPlugin extends ClientPlugin {
|
|
|
7
7
|
static get type () { return 'messaging' }
|
|
8
8
|
static get operation () { return 'request' }
|
|
9
9
|
|
|
10
|
-
start (
|
|
10
|
+
start (ctx) {
|
|
11
|
+
const { request, api, projectId } = ctx
|
|
12
|
+
|
|
11
13
|
if (api === 'publish') return
|
|
12
14
|
|
|
13
15
|
this.startSpan(this.operationName(), {
|
|
14
16
|
service: this.config.service || this.serviceName(),
|
|
15
|
-
resource: [api, request.name].filter(
|
|
17
|
+
resource: [api, request.name].filter(Boolean).join(' '),
|
|
16
18
|
kind: this.constructor.kind,
|
|
17
19
|
meta: {
|
|
18
20
|
'pubsub.method': api,
|
|
19
21
|
'gcloud.project_id': projectId
|
|
20
22
|
}
|
|
21
|
-
})
|
|
23
|
+
}, ctx)
|
|
24
|
+
|
|
25
|
+
return ctx.currentStore
|
|
22
26
|
}
|
|
23
27
|
}
|
|
24
28
|
|