diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index cce00af1d0d..703cec827ac 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -110,7 +110,7 @@
/dd-java-agent/instrumentation/cucumber-5.4/ @DataDog/ci-app-libraries
/dd-java-agent/instrumentation/jacoco-0.8.9/ @DataDog/ci-app-libraries
/dd-java-agent/instrumentation/junit @DataDog/ci-app-libraries
-/dd-java-agent/instrumentation/karate-1.0/ @DataDog/ci-app-libraries
+/dd-java-agent/instrumentation/karate/ @DataDog/ci-app-libraries
/dd-java-agent/instrumentation/scalatest-3.0.8/ @DataDog/ci-app-libraries
/dd-java-agent/instrumentation/selenium-3.13/ @DataDog/ci-app-libraries
/dd-java-agent/instrumentation/testng/ @DataDog/ci-app-libraries
diff --git a/dd-java-agent/instrumentation/karate-1.0/build.gradle b/dd-java-agent/instrumentation/karate/karate-1.0/build.gradle
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/build.gradle
rename to dd-java-agent/instrumentation/karate/karate-1.0/build.gradle
diff --git a/dd-java-agent/instrumentation/karate-1.0/gradle.lockfile b/dd-java-agent/instrumentation/karate/karate-1.0/gradle.lockfile
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/gradle.lockfile
rename to dd-java-agent/instrumentation/karate/karate-1.0/gradle.lockfile
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/ExecutionContext.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/ExecutionContext.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/ExecutionContext.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/ExecutionContext.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateExecutionInstrumentation.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateExecutionInstrumentation.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateExecutionInstrumentation.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateExecutionInstrumentation.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateInstrumentation.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateInstrumentation.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateInstrumentation.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateInstrumentation.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateTracingHook.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateUtils.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateUtils.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateUtils.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/KarateUtils.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/main/java/datadog/trace/instrumentation/karate/TestEventsHandlerHolder.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/groovy/KarateTest.groovy b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/groovy/KarateTest.groovy
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/groovy/KarateTest.groovy
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/groovy/KarateTest.groovy
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/Flaky.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/Flaky.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/Flaky.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/Flaky.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/Slow.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/Slow.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/Slow.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/Slow.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestContinueOnStepFailureKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestContinueOnStepFailureKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestContinueOnStepFailureKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestContinueOnStepFailureKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestFailedBuiltInRetryKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestFailedBuiltInRetryKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestFailedBuiltInRetryKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestFailedBuiltInRetryKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestFailedKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestFailedKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestFailedKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestFailedKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestFailedParameterizedKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestFailedParameterizedKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestFailedParameterizedKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestFailedParameterizedKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestFailedThenSucceedKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestFailedThenSucceedKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestFailedThenSucceedKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestFailedThenSucceedKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestParameterizedKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestParameterizedKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestParameterizedKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestParameterizedKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestParameterizedMoreCasesKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestParameterizedMoreCasesKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestParameterizedMoreCasesKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestParameterizedMoreCasesKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSkippedFeatureKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSkippedFeatureKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSkippedFeatureKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSkippedFeatureKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedKarateSkipEfd.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedKarateSkipEfd.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedKarateSkipEfd.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedKarateSkipEfd.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedKarateSlow.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedKarateSlow.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedKarateSlow.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedKarateSlow.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedOneCaseKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedOneCaseKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedOneCaseKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedOneCaseKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedParallelKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedParallelKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestSucceedParallelKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestSucceedParallelKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestUnskippableKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestUnskippableKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestUnskippableKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestUnskippableKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestWithSetupKarate.java b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestWithSetupKarate.java
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/TestWithSetupKarate.java
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/TestWithSetupKarate.java
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/karate-config.js b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/karate-config.js
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/karate-config.js
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/karate-config.js
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_continue_on_step_failure.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_continue_on_step_failure.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_continue_on_step_failure.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_continue_on_step_failure.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_failed.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_failed.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_failed.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_failed.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_failed_parameterized.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_failed_parameterized.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_failed_parameterized.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_failed_parameterized.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_failed_then_succeed.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_failed_then_succeed.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_failed_then_succeed.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_failed_then_succeed.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_parameterized.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_parameterized.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_parameterized.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_parameterized.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_parameterized_more_cases.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_parameterized_more_cases.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_parameterized_more_cases.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_parameterized_more_cases.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_succeed.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_succeed.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_succeed.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_succeed.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_succeed_one_case.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_succeed_one_case.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_succeed_one_case.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_succeed_one_case.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_succeed_skip_efd.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_succeed_skip_efd.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_succeed_skip_efd.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_succeed_skip_efd.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_succeed_slow.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_succeed_slow.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_succeed_slow.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_succeed_slow.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_unskippable.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_unskippable.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_unskippable.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_unskippable.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_with_setup.feature b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_with_setup.feature
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/java/org/example/test_with_setup.feature
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/java/org/example/test_with_setup.feature
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-failed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-failed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-failed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-failed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-failed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-failed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-failed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-failed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-succeeded/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-succeeded/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-succeeded/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-succeeded/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-succeeded/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-succeeded/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-succeeded/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-disabled-succeeded/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-failed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-failed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-failed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-failed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-failed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-failed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-failed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-failed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-failed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-failed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-failed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-failed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-failed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-failed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-failed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-failed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-succeeded/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-succeeded/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-succeeded/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-succeeded/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-succeeded/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-succeeded/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-succeeded/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-quarantined-succeeded/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-succeeded/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-succeeded/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-succeeded/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-succeeded/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-succeeded/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-succeeded/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-attempt-to-fix-succeeded/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-attempt-to-fix-succeeded/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-built-in-retry/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-built-in-retry/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-built-in-retry/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-built-in-retry/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-built-in-retry/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-built-in-retry/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-built-in-retry/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-built-in-retry/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-disabled-failed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-disabled-failed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-disabled-failed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-disabled-failed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-disabled-failed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-disabled-failed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-disabled-failed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-disabled-failed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-faulty-session-threshold/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-faulty-session-threshold/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-faulty-session-threshold/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-faulty-session-threshold/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-faulty-session-threshold/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-faulty-session-threshold/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-faulty-session-threshold/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-faulty-session-threshold/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-known-parameterized-test/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-known-parameterized-test/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-known-parameterized-test/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-known-parameterized-test/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-known-parameterized-test/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-known-parameterized-test/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-known-parameterized-test/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-known-parameterized-test/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-known-test/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-known-test/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-known-test/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-known-test/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-known-test/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-known-test/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-known-test/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-known-test/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-parameterized-test/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-parameterized-test/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-parameterized-test/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-parameterized-test/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-parameterized-test/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-parameterized-test/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-parameterized-test/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-parameterized-test/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-slow-test/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-slow-test/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-slow-test/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-slow-test/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-slow-test/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-slow-test/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-slow-test/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-slow-test/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-test/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-test/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-test/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-test/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-test/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-test/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-new-test/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-new-test/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-skip-new-test/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-skip-new-test/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-skip-new-test/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-skip-new-test/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-skip-new-test/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-skip-new-test/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-efd-skip-new-test/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-efd-skip-new-test/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-failed-then-succeed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-failed-then-succeed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-failed-then-succeed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-failed-then-succeed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-failed-then-succeed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-failed-then-succeed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-failed-then-succeed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-failed-then-succeed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-failed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-failed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-failed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-failed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-failed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-failed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-failed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-failed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-skipping-parameterized/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-skipping-parameterized/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-skipping-parameterized/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-skipping-parameterized/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-skipping-parameterized/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-skipping-parameterized/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-skipping-parameterized/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-skipping-parameterized/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-skipping/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-skipping/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-skipping/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-skipping/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-skipping/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-skipping/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-skipping/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-skipping/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-unskippable/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-unskippable/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-unskippable/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-unskippable/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-unskippable/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-unskippable/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-itr-unskippable/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-itr-unskippable/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-parameterized/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-parameterized/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-parameterized/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-parameterized/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-parameterized/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-parameterized/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-parameterized/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-parameterized/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-atr/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-atr/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-atr/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-atr/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-atr/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-atr/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-atr/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-atr/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-efd/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-efd/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-efd/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-efd/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-efd/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-efd/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-efd/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-efd/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-known/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-known/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-known/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-known/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-known/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-known/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed-known/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed-known/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-quarantined-failed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-quarantined-failed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-continue-on-step-failure/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-continue-on-step-failure/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-continue-on-step-failure/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-continue-on-step-failure/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-continue-on-step-failure/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-continue-on-step-failure/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-continue-on-step-failure/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-continue-on-step-failure/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-failed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-failed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-failed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-failed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-failed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-failed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-failed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-failed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-parameterized/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-parameterized/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-parameterized/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-parameterized/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-parameterized/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-parameterized/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-retry-parameterized/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-retry-parameterized/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-skipped-feature/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-skipped-feature/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-skipped-feature/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-skipped-feature/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-skipped-feature/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-skipped-feature/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-skipped-feature/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-skipped-feature/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-succeed-parallel/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-succeed-parallel/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-succeed-parallel/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-succeed-parallel/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-succeed-parallel/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-succeed-parallel/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-succeed-parallel/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-succeed-parallel/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-succeed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-succeed/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-succeed/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-succeed/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-succeed/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-succeed/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-succeed/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-succeed/events.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-with-setup/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-with-setup/coverages.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-with-setup/coverages.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-with-setup/coverages.ftl
diff --git a/dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-with-setup/events.ftl b/dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-with-setup/events.ftl
similarity index 100%
rename from dd-java-agent/instrumentation/karate-1.0/src/test/resources/test-with-setup/events.ftl
rename to dd-java-agent/instrumentation/karate/karate-1.0/src/test/resources/test-with-setup/events.ftl
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/build.gradle b/dd-java-agent/instrumentation/karate/karate-2.0/build.gradle
new file mode 100644
index 00000000000..d3f81242750
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/build.gradle
@@ -0,0 +1,52 @@
+plugins {
+ id 'dd-trace-java.instrumentation.testing-framework-tests'
+}
+
+apply from: "$rootDir/gradle/java.gradle"
+
+// Karate 2.x is compiled with Java 21 (uses virtual threads for parallelism)
+tracerJava {
+ addSourceSetFor(JavaVersion.VERSION_21)
+}
+
+muzzle {
+ pass {
+ group = 'io.karatelabs'
+ module = 'karate-core'
+ versions = '[2.0.0,)'
+ javaVersion = '21'
+ }
+}
+
+["compileMain_java21Java", "compileTestJava"].each {
+ tasks.named(it, JavaCompile) {
+ configureCompiler(it, 21, JavaVersion.VERSION_21)
+ }
+}
+
+tasks.withType(GroovyCompile).configureEach {
+ configureCompiler(it, 21)
+}
+
+dependencies {
+ main_java21CompileOnly group: 'io.karatelabs', name: 'karate-core', version: '2.0.9'
+
+ testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-instrumentation-test-fixtures')
+ testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: libs.versions.junit.platform.get()
+ testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: libs.versions.junit5.get()
+
+ testImplementation(group: 'io.karatelabs', name: 'karate-core', version: '2.0.9') {
+ // excluding logback to avoid conflicts with libs.bundles.test.logging
+ exclude group: 'ch.qos.logback', module: 'logback-classic'
+ }
+}
+
+// Using recommended Karate project layout where Karate feature files sit in same /test/java folders as their java counterparts
+sourceSets {
+ test {
+ resources {
+ srcDir file('src/test/java')
+ exclude '**/*.java'
+ }
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java/datadog/trace/instrumentation/karate2/KarateInstrumentation.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java/datadog/trace/instrumentation/karate2/KarateInstrumentation.java
new file mode 100644
index 00000000000..5b3b7ad8d54
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java/datadog/trace/instrumentation/karate2/KarateInstrumentation.java
@@ -0,0 +1,44 @@
+package datadog.trace.instrumentation.karate2;
+
+import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
+
+import com.google.auto.service.AutoService;
+import datadog.trace.agent.tooling.Instrumenter;
+import datadog.trace.agent.tooling.InstrumenterModule;
+
+/**
+ * Registers a {@code io.karatelabs.core.RunListener} on every {@code
+ * io.karatelabs.core.Runner.Builder}.
+ *
+ *
This module is compiled for Java 8 so the agent can enumerate it on any JVM; the advice and
+ * helper classes that reference the Java 21 {@code io.karatelabs} API live in the {@code java21}
+ * source set and are referenced by name.
+ */
+@AutoService(InstrumenterModule.class)
+public class KarateInstrumentation extends InstrumenterModule.CiVisibility
+ implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
+
+ public KarateInstrumentation() {
+ super("ci-visibility", "karate");
+ }
+
+ @Override
+ public String instrumentedType() {
+ return "io.karatelabs.core.Runner$Builder";
+ }
+
+ @Override
+ public String[] helperClassNames() {
+ return new String[] {
+ packageName + ".KarateUtils",
+ packageName + ".TestEventsHandlerHolder",
+ packageName + ".KarateTracingListener",
+ packageName + ".KarateBuilderAdvice"
+ };
+ }
+
+ @Override
+ public void methodAdvice(MethodTransformer transformer) {
+ transformer.applyAdvice(isConstructor(), packageName + ".KarateBuilderAdvice");
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateBuilderAdvice.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateBuilderAdvice.java
new file mode 100644
index 00000000000..3126c907eea
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateBuilderAdvice.java
@@ -0,0 +1,20 @@
+package datadog.trace.instrumentation.karate2;
+
+import io.karatelabs.core.RunEvent;
+import io.karatelabs.core.RunListener;
+import io.karatelabs.core.Runner;
+import net.bytebuddy.asm.Advice;
+
+/** Advice for the {@code io.karatelabs.core.Runner.Builder} constructor. */
+public class KarateBuilderAdvice {
+
+ @Advice.OnMethodExit
+ public static void onRunnerBuilderConstructorExit(@Advice.This Runner.Builder builder) {
+ builder.listener(new KarateTracingListener());
+ }
+
+ // Karate 2.0.0 and above
+ public static void muzzleCheck(RunListener runListener) {
+ runListener.onEvent((RunEvent) null);
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateTracingListener.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateTracingListener.java
new file mode 100644
index 00000000000..2fa59009dd8
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateTracingListener.java
@@ -0,0 +1,240 @@
+package datadog.trace.instrumentation.karate2;
+
+import datadog.trace.api.Config;
+import datadog.trace.api.civisibility.CIConstants;
+import datadog.trace.api.civisibility.config.TestIdentifier;
+import datadog.trace.api.civisibility.config.TestSourceData;
+import datadog.trace.api.civisibility.events.TestDescriptor;
+import datadog.trace.api.civisibility.events.TestSuiteDescriptor;
+import datadog.trace.api.civisibility.telemetry.tag.SkipReason;
+import datadog.trace.api.civisibility.telemetry.tag.TestFrameworkInstrumentation;
+import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
+import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
+import datadog.trace.bootstrap.instrumentation.api.Tags;
+import io.karatelabs.core.FeatureResult;
+import io.karatelabs.core.FeatureRunEvent;
+import io.karatelabs.core.FeatureRuntime;
+import io.karatelabs.core.RunEvent;
+import io.karatelabs.core.RunEventType;
+import io.karatelabs.core.RunListener;
+import io.karatelabs.core.ScenarioResult;
+import io.karatelabs.core.ScenarioRunEvent;
+import io.karatelabs.core.ScenarioRuntime;
+import io.karatelabs.core.StepResult;
+import io.karatelabs.core.StepRunEvent;
+import io.karatelabs.gherkin.Feature;
+import io.karatelabs.gherkin.Scenario;
+import io.karatelabs.gherkin.Step;
+import java.util.Collection;
+import java.util.List;
+
+public class KarateTracingListener implements RunListener {
+
+ private static final String FRAMEWORK_NAME = "karate";
+ public static final String FRAMEWORK_VERSION = KarateUtils.getKarateVersion();
+ public static final String KARATE_STEP_SPAN_NAME = "karate.step";
+
+ @Override
+ public boolean onEvent(RunEvent event) {
+ RunEventType type = event.getType();
+ if (type == RunEventType.FEATURE_ENTER) {
+ return beforeFeature((FeatureRunEvent) event);
+ } else if (type == RunEventType.FEATURE_EXIT) {
+ afterFeature((FeatureRunEvent) event);
+ } else if (type == RunEventType.SCENARIO_ENTER) {
+ return beforeScenario((ScenarioRunEvent) event);
+ } else if (type == RunEventType.SCENARIO_EXIT) {
+ afterScenario((ScenarioRunEvent) event);
+ } else if (type == RunEventType.STEP_ENTER) {
+ beforeStep((StepRunEvent) event);
+ } else if (type == RunEventType.STEP_EXIT) {
+ afterStep((StepRunEvent) event);
+ }
+ return true;
+ }
+
+ private boolean beforeFeature(FeatureRunEvent event) {
+ FeatureRuntime fr = event.source();
+ if (skipTracking(fr)) {
+ return true;
+ }
+ TestSuiteDescriptor suiteDescriptor = KarateUtils.toSuiteDescriptor(fr);
+ Feature feature = fr.getFeature();
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestSuiteStart(
+ suiteDescriptor,
+ KarateUtils.getFeatureNameForReport(feature),
+ FRAMEWORK_NAME,
+ FRAMEWORK_VERSION,
+ null,
+ KarateUtils.getCategories(feature.getTags()),
+ isParallel(fr),
+ TestFrameworkInstrumentation.KARATE,
+ null);
+ return true;
+ }
+
+ private void afterFeature(FeatureRunEvent event) {
+ FeatureRuntime fr = event.source();
+ if (skipTracking(fr)) {
+ return;
+ }
+ TestSuiteDescriptor suiteDescriptor = KarateUtils.toSuiteDescriptor(fr);
+ FeatureResult result = event.result();
+ if (result != null && result.isFailed()) {
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestSuiteFailure(
+ suiteDescriptor, suiteThrowable(result));
+ } else if (result != null && result.isEmpty()) {
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestSuiteSkip(suiteDescriptor, null);
+ }
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestSuiteFinish(suiteDescriptor, null);
+ }
+
+ private boolean beforeScenario(ScenarioRunEvent event) {
+ ScenarioRuntime sr = event.source();
+ if (skipTracking(sr)) {
+ return true;
+ }
+ Scenario scenario = sr.getScenario();
+ TestSuiteDescriptor suiteDescriptor = KarateUtils.toSuiteDescriptor(sr.getFeatureRuntime());
+ TestDescriptor testDescriptor = KarateUtils.toTestDescriptor(sr);
+ String scenarioName = KarateUtils.getScenarioName(scenario);
+ String parameters = KarateUtils.getParameters(scenario);
+ Collection categories = KarateUtils.getCategories(scenario.getTagsEffective());
+
+ if (Config.get().isCiVisibilityTestSkippingEnabled()
+ || Config.get().isCiVisibilityTestManagementEnabled()) {
+ TestIdentifier skippableTest = KarateUtils.toTestIdentifier(scenario);
+ SkipReason skipReason = TestEventsHandlerHolder.TEST_EVENTS_HANDLER.skipReason(skippableTest);
+
+ if (skipReason != null
+ && !(skipReason == SkipReason.ITR
+ && categories.contains(CIConstants.Tags.ITR_UNSKIPPABLE_TAG))) {
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestIgnore(
+ suiteDescriptor,
+ testDescriptor,
+ scenarioName,
+ FRAMEWORK_NAME,
+ FRAMEWORK_VERSION,
+ parameters,
+ categories,
+ TestSourceData.UNKNOWN,
+ skipReason.getDescription(),
+ null);
+ return false;
+ }
+ }
+
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestStart(
+ suiteDescriptor,
+ testDescriptor,
+ scenarioName,
+ FRAMEWORK_NAME,
+ FRAMEWORK_VERSION,
+ parameters,
+ categories,
+ TestSourceData.UNKNOWN,
+ null,
+ null);
+ return true;
+ }
+
+ private void afterScenario(ScenarioRunEvent event) {
+ ScenarioRuntime sr = event.source();
+ if (skipTracking(sr)) {
+ return;
+ }
+ ScenarioResult result = event.result();
+ TestDescriptor testDescriptor = KarateUtils.toTestDescriptor(sr);
+
+ Throwable failedReason = getFailedReason(result);
+ if ((result != null && result.isFailed()) || failedReason != null) {
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestFailure(testDescriptor, failedReason);
+ } else if (result == null || result.getStepResults().isEmpty()) {
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestSkip(testDescriptor, null);
+ }
+
+ TestEventsHandlerHolder.TEST_EVENTS_HANDLER.onTestFinish(testDescriptor, null, null);
+ }
+
+ private void beforeStep(StepRunEvent event) {
+ Step step = event.step();
+ if (skipTracking(step)) {
+ return;
+ }
+ AgentSpan span = AgentTracer.startSpan("karate", KARATE_STEP_SPAN_NAME);
+ AgentTracer.activateSpanWithoutScope(span);
+ String stepName = step.getPrefix() + " " + step.getText();
+ span.setResourceName(stepName);
+ span.setTag(Tags.COMPONENT, "karate");
+ span.spanContext().setIntegrationName("karate");
+ span.setTag("step.name", stepName);
+ span.setTag("step.startLine", step.getLine());
+ span.setTag("step.endLine", step.getEndLine());
+ span.setTag("step.docString", step.getDocString());
+ }
+
+ private void afterStep(StepRunEvent event) {
+ if (skipTracking(event.step())) {
+ return;
+ }
+
+ AgentSpan span = AgentTracer.activeSpan();
+ if (span == null) {
+ return;
+ }
+
+ AgentTracer.closeActive();
+ span.finish();
+ }
+
+ private static Throwable getFailedReason(ScenarioResult result) {
+ if (result == null) {
+ return null;
+ }
+ Throwable error = result.getError();
+ if (error != null) {
+ return error;
+ }
+ for (StepResult stepResult : result.getStepResults()) {
+ if (stepResult.getError() != null) {
+ return stepResult.getError();
+ }
+ }
+ return null;
+ }
+
+ private static Throwable suiteThrowable(FeatureResult result) {
+ List scenarioResults = result.getScenarioResults();
+ if (scenarioResults != null) {
+ for (ScenarioResult scenarioResult : scenarioResults) {
+ Throwable error = scenarioResult.getError();
+ if (error != null) {
+ return error;
+ }
+ }
+ }
+ return new RuntimeException(result.getFailureMessage());
+ }
+
+ private static boolean isParallel(FeatureRuntime fr) {
+ return fr.getSuite() != null && fr.getSuite().parallel;
+ }
+
+ private static boolean skipTracking(FeatureRuntime fr) {
+ // do not track nested (called) feature runs
+ return fr.getCaller() != null;
+ }
+
+ private static boolean skipTracking(ScenarioRuntime sr) {
+ // do not track nested (called) scenario runs and setup scenarios
+ return sr.getFeatureRuntime().getCaller() != null || sr.getScenario().isSetup();
+ }
+
+ private static boolean skipTracking(Step step) {
+ // do not track steps that are not children of a tracked scenario or another tracked step
+ AgentSpan activeSpan = AgentTracer.activeSpan();
+ return activeSpan == null
+ || (!KARATE_STEP_SPAN_NAME.contentEquals(activeSpan.getSpanName())
+ && !Tags.SPAN_KIND_TEST.contentEquals(activeSpan.getSpanType()));
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateUtils.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateUtils.java
new file mode 100644
index 00000000000..7a8b4bb4e7c
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/KarateUtils.java
@@ -0,0 +1,178 @@
+package datadog.trace.instrumentation.karate2;
+
+import static datadog.json.JsonMapper.toJson;
+
+import datadog.trace.api.civisibility.config.LibraryCapability;
+import datadog.trace.api.civisibility.config.TestIdentifier;
+import datadog.trace.api.civisibility.events.TestDescriptor;
+import datadog.trace.api.civisibility.events.TestSuiteDescriptor;
+import datadog.trace.util.Strings;
+import io.karatelabs.core.FeatureRuntime;
+import io.karatelabs.core.Globals;
+import io.karatelabs.core.ScenarioRuntime;
+import io.karatelabs.gherkin.Feature;
+import io.karatelabs.gherkin.Scenario;
+import io.karatelabs.gherkin.Tag;
+import java.net.URI;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+public abstract class KarateUtils {
+
+ private KarateUtils() {}
+
+ public static final List CAPABILITIES = Collections.emptyList();
+
+ private static final ConcurrentHashMap CLASSPATH_NAME_CACHE =
+ new ConcurrentHashMap<>();
+
+ public static Feature getFeature(FeatureRuntime featureRuntime) {
+ return featureRuntime.getFeature();
+ }
+
+ /**
+ * Produces the karate-1.0-compatible suite identifier {@code "[]
+ * "} (e.g. {@code "[org/example/test_succeed] test succeed"}).
+ *
+ * We can't use v2's {@code Feature.getNameForReport()} directly: it derives the path from
+ * {@code Resource.getRelativePath()}, which v2 relativizes against the JVM working directory and
+ * falls back to the absolute path when the file is outside it.
+ *
+ *
We recover that form by asking the classloader to resolve progressively longer suffixes of
+ * the feature's path; the shortest suffix that resolves back to the same file is the
+ * classpath-relative name. Falls back to Karate's working-directory-relative path if nothing
+ * resolves.
+ */
+ public static String getFeatureNameForReport(Feature feature) {
+ if (feature == null) {
+ return null;
+ }
+ String classpathPath = resolveClasspathRelativeName(feature);
+ String name = feature.getName();
+ if (name == null || name.isEmpty()) {
+ return "[" + classpathPath + "]";
+ }
+ return "[" + classpathPath + "] " + name;
+ }
+
+ private static String resolveClasspathRelativeName(Feature feature) {
+ URI uri = feature.getResource() != null ? feature.getResource().getUri() : null;
+ // use Karate's own relative path as fallback for anything the classloader can't resolve
+ String fallback = resourceRelativeName(feature);
+ if (uri == null) {
+ return fallback;
+ }
+ return CLASSPATH_NAME_CACHE.computeIfAbsent(
+ uri, u -> computeClasspathRelativeName(u, fallback));
+ }
+
+ private static String resourceRelativeName(Feature feature) {
+ String relativePath =
+ feature.getResource() != null ? feature.getResource().getRelativePath() : null;
+ if (relativePath != null && !relativePath.isEmpty()) {
+ return stripFeatureExtension(relativePath);
+ }
+ return feature.getName() != null ? feature.getName() : "";
+ }
+
+ private static String computeClasspathRelativeName(URI uri, String fallback) {
+ Path path;
+ try {
+ path = Paths.get(uri);
+ } catch (Exception e) {
+ // non-file URI (e.g. a feature packaged inside a jar): can't walk filesystem segments
+ return fallback;
+ }
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ if (cl == null) {
+ cl = Feature.class.getClassLoader();
+ }
+ int segments = path.getNameCount();
+ for (int start = segments - 1; start >= 0; start--) {
+ StringBuilder candidate = new StringBuilder();
+ for (int i = start; i < segments; i++) {
+ if (i > start) {
+ candidate.append('/');
+ }
+ candidate.append(path.getName(i).toString());
+ }
+ URL resolved = cl.getResource(candidate.toString());
+ if (resolved != null) {
+ try {
+ if (Paths.get(resolved.toURI()).equals(path)) {
+ return stripFeatureExtension(candidate.toString());
+ }
+ } catch (Exception ignored) {
+ // continue searching
+ }
+ }
+ }
+ return fallback;
+ }
+
+ private static String stripFeatureExtension(String path) {
+ return path.endsWith(".feature")
+ ? path.substring(0, path.length() - ".feature".length())
+ : path;
+ }
+
+ public static String getScenarioName(Scenario scenario) {
+ String scenarioName = scenario.getName();
+ if (Strings.isNotBlank(scenarioName)) {
+ return scenarioName;
+ } else {
+ return scenario.getRefId();
+ }
+ }
+
+ public static List getCategories(List tags) {
+ if (tags == null) {
+ return Collections.emptyList();
+ }
+
+ List categories = new ArrayList<>(tags.size());
+ for (Tag tag : tags) {
+ categories.add(tag.getName());
+ }
+ return categories;
+ }
+
+ public static String getParameters(Scenario scenario) {
+ return scenario.getExampleData() != null ? toJson(scenario.getExampleData()) : null;
+ }
+
+ public static TestIdentifier toTestIdentifier(Scenario scenario) {
+ Feature feature = scenario.getFeature();
+ String featureName = getFeatureNameForReport(feature);
+ String scenarioName = getScenarioName(scenario);
+ String parameters = getParameters(scenario);
+ return new TestIdentifier(featureName, scenarioName, parameters);
+ }
+
+ public static TestDescriptor toTestDescriptor(ScenarioRuntime scenarioRuntime) {
+ Scenario scenario = scenarioRuntime.getScenario();
+ Feature feature = scenario.getFeature();
+ String featureName = getFeatureNameForReport(feature);
+ String scenarioName = getScenarioName(scenario);
+ String parameters = getParameters(scenario);
+ return new TestDescriptor(featureName, null, scenarioName, parameters, scenarioRuntime);
+ }
+
+ public static TestSuiteDescriptor toSuiteDescriptor(FeatureRuntime featureRuntime) {
+ String featureName = getFeatureNameForReport(featureRuntime.getFeature());
+ return new TestSuiteDescriptor(featureName, null);
+ }
+
+ public static String getKarateVersion() {
+ return Globals.KARATE_VERSION;
+ }
+
+ public static List capabilities() {
+ return CAPABILITIES;
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/TestEventsHandlerHolder.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/TestEventsHandlerHolder.java
new file mode 100644
index 00000000000..d2c4c495cab
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/main/java21/datadog/trace/instrumentation/karate2/TestEventsHandlerHolder.java
@@ -0,0 +1,32 @@
+package datadog.trace.instrumentation.karate2;
+
+import datadog.trace.api.civisibility.InstrumentationBridge;
+import datadog.trace.api.civisibility.events.TestDescriptor;
+import datadog.trace.api.civisibility.events.TestEventsHandler;
+import datadog.trace.api.civisibility.events.TestSuiteDescriptor;
+import datadog.trace.api.internal.VisibleForTesting;
+
+public abstract class TestEventsHandlerHolder {
+
+ public static volatile TestEventsHandler TEST_EVENTS_HANDLER;
+
+ static {
+ start();
+ }
+
+ public static void start() {
+ TEST_EVENTS_HANDLER =
+ InstrumentationBridge.createTestEventsHandler(
+ "karate", null, null, KarateUtils.capabilities());
+ }
+
+ @VisibleForTesting
+ public static void stop() {
+ if (TEST_EVENTS_HANDLER != null) {
+ TEST_EVENTS_HANDLER.close();
+ TEST_EVENTS_HANDLER = null;
+ }
+ }
+
+ private TestEventsHandlerHolder() {}
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/groovy/KarateV2Test.groovy b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/groovy/KarateV2Test.groovy
new file mode 100644
index 00000000000..0d7b3d7e53f
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/groovy/KarateV2Test.groovy
@@ -0,0 +1,108 @@
+import datadog.trace.api.DisableTestTrace
+import datadog.trace.api.civisibility.config.TestIdentifier
+import datadog.trace.civisibility.CiVisibilityInstrumentationTest
+import datadog.trace.instrumentation.karate2.KarateUtils
+import datadog.trace.instrumentation.karate2.TestEventsHandlerHolder
+import org.example.TestFailedKarate
+import org.example.TestParameterizedKarate
+import org.example.TestSucceedKarate
+import org.junit.jupiter.engine.JupiterTestEngine
+import org.junit.platform.engine.DiscoverySelector
+import org.junit.platform.engine.TestExecutionResult
+import org.junit.platform.launcher.TestExecutionListener
+import org.junit.platform.launcher.core.LauncherConfig
+import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder
+import org.junit.platform.launcher.core.LauncherFactory
+
+import java.util.concurrent.ConcurrentHashMap
+import java.util.concurrent.CopyOnWriteArrayList
+
+import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass
+
+@DisableTestTrace(reason = "avoid self-tracing")
+class KarateV2Test extends CiVisibilityInstrumentationTest {
+
+ def "test #testcaseName"() {
+ runTests(tests, success)
+
+ assertSpansData(testcaseName)
+
+ where:
+ testcaseName | success | tests
+ "test-succeed" | true | [TestSucceedKarate]
+ "test-parameterized" | true | [TestParameterizedKarate]
+ "test-failed" | false | [TestFailedKarate]
+ }
+
+ def "test ITR #testcaseName"() {
+ givenSkippableTests(skippedTests)
+
+ runTests(tests)
+
+ assertSpansData(testcaseName)
+
+ where:
+ testcaseName | tests | skippedTests
+ "test-itr-skipping" | [TestSucceedKarate] | [new TestIdentifier("[org/example/test_succeed] test succeed", "first scenario", null)]
+ "test-itr-skipping-parameterized" | [TestParameterizedKarate] | [
+ new TestIdentifier("[org/example/test_parameterized] test parameterized", "first scenario as an outline", '{"param":"\'a\'","value":"aa"}')
+ ]
+ }
+
+ private void runTests(List> tests, boolean expectSuccess = true) {
+ TestEventsHandlerHolder.start()
+
+ DiscoverySelector[] selectors = new DiscoverySelector[tests.size()]
+ for (i in 0..> testsByStatus = new ConcurrentHashMap<>()
+
+ void executionFinished(org.junit.platform.launcher.TestIdentifier testIdentifier, TestExecutionResult testExecutionResult) {
+ testsByStatus.computeIfAbsent(testExecutionResult.status, k -> new CopyOnWriteArrayList<>()).add(testIdentifier)
+ }
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedKarate.java
new file mode 100644
index 00000000000..0aa667d0a7d
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestFailedKarate.java
@@ -0,0 +1,16 @@
+package org.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import com.intuit.karate.Results;
+import com.intuit.karate.Runner;
+import org.junit.jupiter.api.Test;
+
+public class TestFailedKarate {
+
+ @Test
+ public void test() {
+ Results results = Runner.path("classpath:org/example/test_failed.feature").parallel(1);
+ assertEquals(0, results.getFailCount(), results.getErrorMessages());
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedKarate.java
new file mode 100644
index 00000000000..3d849359504
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestParameterizedKarate.java
@@ -0,0 +1,16 @@
+package org.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import com.intuit.karate.Results;
+import com.intuit.karate.Runner;
+import org.junit.jupiter.api.Test;
+
+public class TestParameterizedKarate {
+
+ @Test
+ public void test() {
+ Results results = Runner.path("classpath:org/example/test_parameterized.feature").parallel(1);
+ assertEquals(0, results.getFailCount(), results.getErrorMessages());
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedKarate.java b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedKarate.java
new file mode 100644
index 00000000000..3c3ae82182d
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/TestSucceedKarate.java
@@ -0,0 +1,16 @@
+package org.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import com.intuit.karate.Results;
+import com.intuit.karate.Runner;
+import org.junit.jupiter.api.Test;
+
+public class TestSucceedKarate {
+
+ @Test
+ public void test() {
+ Results results = Runner.path("classpath:org/example/test_succeed.feature").parallel(1);
+ assertEquals(0, results.getFailCount(), results.getErrorMessages());
+ }
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/karate-config.js b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/karate-config.js
new file mode 100644
index 00000000000..7e70e8ac51b
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/karate-config.js
@@ -0,0 +1,2 @@
+function fn() {
+}
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_failed.feature b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_failed.feature
new file mode 100644
index 00000000000..534144ae715
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_failed.feature
@@ -0,0 +1,7 @@
+Feature: test failed
+
+ Scenario: first scenario
+ * print 'first'
+
+ Scenario: second scenario
+ * assert false
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_parameterized.feature b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_parameterized.feature
new file mode 100644
index 00000000000..62beb7ae198
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_parameterized.feature
@@ -0,0 +1,13 @@
+Feature: test parameterized
+
+ Scenario Outline: first scenario as an outline
+ (to prevent a particular bug from re-appearing)
+
+ Given def p =
+ When def response = p + p
+ Then match response == value
+
+ Examples:
+ | param | value |
+ | 'a' | aa |
+ | 'b' | bb |
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_succeed.feature b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_succeed.feature
new file mode 100644
index 00000000000..a82428ed0c6
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/java/org/example/test_succeed.feature
@@ -0,0 +1,9 @@
+@foo
+Feature: test succeed
+
+ @bar
+ Scenario: first scenario
+ * print 'first'
+
+ Scenario: second scenario
+ * print 'second'
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-failed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-failed/coverages.ftl
new file mode 100644
index 00000000000..8878e547a79
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-failed/coverages.ftl
@@ -0,0 +1 @@
+[ ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-failed/events.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-failed/events.ftl
new file mode 100644
index 00000000000..d1e680f8cfb
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-failed/events.ftl
@@ -0,0 +1,239 @@
+[ {
+ "content" : {
+ "duration" : ${content_duration},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "* 'first'"
+ },
+ "metrics" : {
+ "step.endLine" : 4,
+ "step.startLine" : 4
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "* 'first'",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id},
+ "start" : ${content_start},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_2},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "* false"
+ },
+ "metrics" : {
+ "step.endLine" : 7,
+ "step.startLine" : 7
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "* false",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_2},
+ "start" : ${content_start_2},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_3},
+ "error" : 1,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "error.message" : ${content_meta_error_message},
+ "error.stack" : ${content_meta_error_stack},
+ "error.type" : "java.lang.AssertionError",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_suite_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.status" : "fail",
+ "test.suite" : "[org/example/test_failed] test failed",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count}
+ },
+ "name" : "karate.test_suite",
+ "resource" : "[org/example/test_failed] test failed",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_3},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id}
+ },
+ "type" : "test_suite_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_4},
+ "error" : 0,
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "pass",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.name" : "first scenario",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_failed] test failed",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_3},
+ "resource" : "[org/example/test_failed] test failed.first scenario",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_parent_id},
+ "start" : ${content_start_4},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_5},
+ "error" : 1,
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "error.message" : ${content_meta_error_message},
+ "error.stack" : ${content_meta_error_stack_2},
+ "error.type" : "java.lang.AssertionError",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "fail",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.name" : "second scenario",
+ "test.status" : "fail",
+ "test.suite" : "[org/example/test_failed] test failed",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_3},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_3},
+ "resource" : "[org/example/test_failed] test failed.second scenario",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_parent_id_2},
+ "start" : ${content_start_5},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_6},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid_2},
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test_session_end",
+ "test.command" : "karate-2.0",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.status" : "fail",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_4},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test_session",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_6},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_session_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_7},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid_3},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_module_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.status" : "fail",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_5}
+ },
+ "name" : "karate.test_module",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_7},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_module_end",
+ "version" : 1
+} ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping-parameterized/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping-parameterized/coverages.ftl
new file mode 100644
index 00000000000..8878e547a79
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping-parameterized/coverages.ftl
@@ -0,0 +1 @@
+[ ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping-parameterized/events.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping-parameterized/events.ftl
new file mode 100644
index 00000000000..a2c029a9497
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping-parameterized/events.ftl
@@ -0,0 +1,274 @@
+[ {
+ "content" : {
+ "duration" : ${content_duration},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "Given p = 'b'"
+ },
+ "metrics" : {
+ "step.endLine" : 6,
+ "step.startLine" : 6
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "Given p = 'b'",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id},
+ "start" : ${content_start},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_2},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "Then response == value"
+ },
+ "metrics" : {
+ "step.endLine" : 8,
+ "step.startLine" : 8
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "Then response == value",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_2},
+ "start" : ${content_start_2},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_3},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "When response = p + p"
+ },
+ "metrics" : {
+ "step.endLine" : 7,
+ "step.startLine" : 7
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "When response = p + p",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_3},
+ "start" : ${content_start_3},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_4},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_suite_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.module" : "karate-2.0",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_parameterized] test parameterized",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count}
+ },
+ "name" : "karate.test_suite",
+ "resource" : "[org/example/test_parameterized] test parameterized",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_4},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id}
+ },
+ "type" : "test_suite_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_5},
+ "error" : 0,
+ "itr_correlation_id" : "itrCorrelationId",
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "skip",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.module" : "karate-2.0",
+ "test.name" : "first scenario as an outline",
+ "test.parameters" : "{\"param\":\"'a'\",\"value\":\"aa\"}",
+ "test.skip_reason" : "Skipped by Datadog Test Impact Analysis",
+ "test.skipped_by_itr" : "true",
+ "test.status" : "skip",
+ "test.suite" : "[org/example/test_parameterized] test parameterized",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "[org/example/test_parameterized] test parameterized.first scenario as an outline",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_4},
+ "start" : ${content_start_5},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_6},
+ "error" : 0,
+ "itr_correlation_id" : "itrCorrelationId",
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "pass",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.module" : "karate-2.0",
+ "test.name" : "first scenario as an outline",
+ "test.parameters" : "{\"param\":\"'b'\",\"value\":\"bb\"}",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_parameterized] test parameterized",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_3},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "[org/example/test_parameterized] test parameterized.first scenario as an outline",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_parent_id},
+ "start" : ${content_start_6},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_7},
+ "error" : 0,
+ "meta" : {
+ "_dd.ci.itr.tests_skipped" : "true",
+ "_dd.p.tid" : ${content_meta__dd_p_tid_2},
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test_session_end",
+ "test.command" : "karate-2.0",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.itr.tests_skipping.type" : "test",
+ "test.status" : "pass",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_4},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id},
+ "test.itr.tests_skipping.count" : 1
+ },
+ "name" : "karate.test_session",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_7},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_session_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_8},
+ "error" : 0,
+ "meta" : {
+ "_dd.ci.itr.tests_skipped" : "true",
+ "_dd.p.tid" : ${content_meta__dd_p_tid_3},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_module_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.itr.tests_skipping.type" : "test",
+ "test.module" : "karate-2.0",
+ "test.status" : "pass",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_5},
+ "test.itr.tests_skipping.count" : 1
+ },
+ "name" : "karate.test_module",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_8},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_module_end",
+ "version" : 1
+} ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping/coverages.ftl
new file mode 100644
index 00000000000..8878e547a79
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping/coverages.ftl
@@ -0,0 +1 @@
+[ ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping/events.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping/events.ftl
new file mode 100644
index 00000000000..a208d424c82
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-itr-skipping/events.ftl
@@ -0,0 +1,227 @@
+[ {
+ "content" : {
+ "duration" : ${content_duration},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "* 'second'"
+ },
+ "metrics" : {
+ "step.endLine" : 9,
+ "step.startLine" : 9
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "* 'second'",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id},
+ "start" : ${content_start},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_2},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_suite_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.module" : "karate-2.0",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_succeed] test succeed",
+ "test.traits" : "{\"category\":[\"foo\"]}",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count}
+ },
+ "name" : "karate.test_suite",
+ "resource" : "[org/example/test_succeed] test succeed",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_2},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id}
+ },
+ "type" : "test_suite_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_3},
+ "error" : 0,
+ "itr_correlation_id" : "itrCorrelationId",
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "skip",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.module" : "karate-2.0",
+ "test.name" : "first scenario",
+ "test.skip_reason" : "Skipped by Datadog Test Impact Analysis",
+ "test.skipped_by_itr" : "true",
+ "test.status" : "skip",
+ "test.suite" : "[org/example/test_succeed] test succeed",
+ "test.traits" : "{\"category\":[\"foo\",\"bar\"]}",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "[org/example/test_succeed] test succeed.first scenario",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_2},
+ "start" : ${content_start_3},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_4},
+ "error" : 0,
+ "itr_correlation_id" : "itrCorrelationId",
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "pass",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.module" : "karate-2.0",
+ "test.name" : "second scenario",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_succeed] test succeed",
+ "test.traits" : "{\"category\":[\"foo\"]}",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_3},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "[org/example/test_succeed] test succeed.second scenario",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_parent_id},
+ "start" : ${content_start_4},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_5},
+ "error" : 0,
+ "meta" : {
+ "_dd.ci.itr.tests_skipped" : "true",
+ "_dd.p.tid" : ${content_meta__dd_p_tid_2},
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test_session_end",
+ "test.command" : "karate-2.0",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.itr.tests_skipping.type" : "test",
+ "test.status" : "pass",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_4},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id},
+ "test.itr.tests_skipping.count" : 1
+ },
+ "name" : "karate.test_session",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_5},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_session_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_6},
+ "error" : 0,
+ "meta" : {
+ "_dd.ci.itr.tests_skipped" : "true",
+ "_dd.p.tid" : ${content_meta__dd_p_tid_3},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_module_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.itr.tests_skipping.enabled" : "true",
+ "test.itr.tests_skipping.type" : "test",
+ "test.module" : "karate-2.0",
+ "test.status" : "pass",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_5},
+ "test.itr.tests_skipping.count" : 1
+ },
+ "name" : "karate.test_module",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_6},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_module_end",
+ "version" : 1
+} ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-parameterized/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-parameterized/coverages.ftl
new file mode 100644
index 00000000000..8878e547a79
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-parameterized/coverages.ftl
@@ -0,0 +1 @@
+[ ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-parameterized/events.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-parameterized/events.ftl
new file mode 100644
index 00000000000..a4123cde6c5
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-parameterized/events.ftl
@@ -0,0 +1,331 @@
+[ {
+ "content" : {
+ "duration" : ${content_duration},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "Given p = 'a'"
+ },
+ "metrics" : {
+ "step.endLine" : 6,
+ "step.startLine" : 6
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "Given p = 'a'",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id},
+ "start" : ${content_start},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_2},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "Given p = 'b'"
+ },
+ "metrics" : {
+ "step.endLine" : 6,
+ "step.startLine" : 6
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "Given p = 'b'",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_2},
+ "start" : ${content_start_2},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_3},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "Then response == value"
+ },
+ "metrics" : {
+ "step.endLine" : 8,
+ "step.startLine" : 8
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "Then response == value",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_3},
+ "start" : ${content_start_3},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_4},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "Then response == value"
+ },
+ "metrics" : {
+ "step.endLine" : 8,
+ "step.startLine" : 8
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "Then response == value",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_4},
+ "start" : ${content_start_4},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_5},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "When response = p + p"
+ },
+ "metrics" : {
+ "step.endLine" : 7,
+ "step.startLine" : 7
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "When response = p + p",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_5},
+ "start" : ${content_start_5},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_6},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "When response = p + p"
+ },
+ "metrics" : {
+ "step.endLine" : 7,
+ "step.startLine" : 7
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "When response = p + p",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_6},
+ "start" : ${content_start_6},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_7},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_suite_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_parameterized] test parameterized",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count}
+ },
+ "name" : "karate.test_suite",
+ "resource" : "[org/example/test_parameterized] test parameterized",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_7},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id}
+ },
+ "type" : "test_suite_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_8},
+ "error" : 0,
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "pass",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.name" : "first scenario as an outline",
+ "test.parameters" : "{\"param\":\"'a'\",\"value\":\"aa\"}",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_parameterized] test parameterized",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_3},
+ "resource" : "[org/example/test_parameterized] test parameterized.first scenario as an outline",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_parent_id},
+ "start" : ${content_start_8},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_9},
+ "error" : 0,
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "pass",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.name" : "first scenario as an outline",
+ "test.parameters" : "{\"param\":\"'b'\",\"value\":\"bb\"}",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_parameterized] test parameterized",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_3},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_3},
+ "resource" : "[org/example/test_parameterized] test parameterized.first scenario as an outline",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_parent_id_2},
+ "start" : ${content_start_9},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_10},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid_2},
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test_session_end",
+ "test.command" : "karate-2.0",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.status" : "pass",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_4},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test_session",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_10},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_session_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_11},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid_3},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_module_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.status" : "pass",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_5}
+ },
+ "name" : "karate.test_module",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_11},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_module_end",
+ "version" : 1
+} ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-succeed/coverages.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-succeed/coverages.ftl
new file mode 100644
index 00000000000..8878e547a79
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-succeed/coverages.ftl
@@ -0,0 +1 @@
+[ ]
\ No newline at end of file
diff --git a/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-succeed/events.ftl b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-succeed/events.ftl
new file mode 100644
index 00000000000..c2acf214162
--- /dev/null
+++ b/dd-java-agent/instrumentation/karate/karate-2.0/src/test/resources/test-succeed/events.ftl
@@ -0,0 +1,236 @@
+[ {
+ "content" : {
+ "duration" : ${content_duration},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "* 'first'"
+ },
+ "metrics" : {
+ "step.endLine" : 6,
+ "step.startLine" : 6
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id},
+ "resource" : "* 'first'",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id},
+ "start" : ${content_start},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_2},
+ "error" : 0,
+ "meta" : {
+ "component" : "karate",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "step.name" : "* 'second'"
+ },
+ "metrics" : {
+ "step.endLine" : 9,
+ "step.startLine" : 9
+ },
+ "name" : "karate.step",
+ "parent_id" : ${content_parent_id_2},
+ "resource" : "* 'second'",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_span_id_2},
+ "start" : ${content_start_2},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "span",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_3},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_suite_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_succeed] test succeed",
+ "test.traits" : "{\"category\":[\"foo\"]}",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count}
+ },
+ "name" : "karate.test_suite",
+ "resource" : "[org/example/test_succeed] test succeed",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_3},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id}
+ },
+ "type" : "test_suite_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_4},
+ "error" : 0,
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "pass",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.name" : "first scenario",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_succeed] test succeed",
+ "test.traits" : "{\"category\":[\"foo\",\"bar\"]}",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_3},
+ "resource" : "[org/example/test_succeed] test succeed.first scenario",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_parent_id},
+ "start" : ${content_start_4},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_5},
+ "error" : 0,
+ "meta" : {
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test",
+ "test.final_status" : "pass",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.name" : "second scenario",
+ "test.status" : "pass",
+ "test.suite" : "[org/example/test_succeed] test succeed",
+ "test.traits" : "{\"category\":[\"foo\"]}",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_3},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test",
+ "parent_id" : ${content_parent_id_3},
+ "resource" : "[org/example/test_succeed] test succeed.second scenario",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "span_id" : ${content_parent_id_2},
+ "start" : ${content_start_5},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id},
+ "test_suite_id" : ${content_test_suite_id},
+ "trace_id" : ${content_trace_id_2}
+ },
+ "type" : "test",
+ "version" : 2
+}, {
+ "content" : {
+ "duration" : ${content_duration_6},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid_2},
+ "_dd.profiling.ctx" : "test",
+ "_dd.tracer_host" : ${content_meta__dd_tracer_host},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "language" : "jvm",
+ "library_version" : ${content_meta_library_version},
+ "runtime-id" : ${content_meta_runtime_id},
+ "span.kind" : "test_session_end",
+ "test.command" : "karate-2.0",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.status" : "pass",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_4},
+ "_dd.profiling.enabled" : 0,
+ "_dd.trace_span_attribute_schema" : 0,
+ "process_id" : ${content_metrics_process_id}
+ },
+ "name" : "karate.test_session",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_6},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_session_end",
+ "version" : 1
+}, {
+ "content" : {
+ "duration" : ${content_duration_7},
+ "error" : 0,
+ "meta" : {
+ "_dd.p.tid" : ${content_meta__dd_p_tid_3},
+ "component" : "karate",
+ "dummy_ci_tag" : "dummy_ci_tag_value",
+ "env" : "none",
+ "library_version" : ${content_meta_library_version},
+ "span.kind" : "test_module_end",
+ "test.framework" : "karate",
+ "test.framework_version" : ${content_meta_test_framework_version},
+ "test.module" : "karate-2.0",
+ "test.status" : "pass",
+ "test.type" : "test",
+ "test_session.name" : "session-name"
+ },
+ "metrics" : {
+ "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_5}
+ },
+ "name" : "karate.test_module",
+ "resource" : "karate-2.0",
+ "service" : "worker.org.gradle.process.internal.worker.gradleworkermain",
+ "start" : ${content_start_7},
+ "test_module_id" : ${content_test_module_id},
+ "test_session_id" : ${content_test_session_id}
+ },
+ "type" : "test_module_end",
+ "version" : 1
+} ]
\ No newline at end of file
diff --git a/settings.gradle.kts b/settings.gradle.kts
index 36b1d9b95df..231dffad538 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -464,7 +464,8 @@ include(
":dd-java-agent:instrumentation:kafka:kafka-connect-0.11",
":dd-java-agent:instrumentation:kafka:kafka-streams-0.11",
":dd-java-agent:instrumentation:kafka:kafka-streams-1.0",
- ":dd-java-agent:instrumentation:karate-1.0",
+ ":dd-java-agent:instrumentation:karate:karate-1.0",
+ ":dd-java-agent:instrumentation:karate:karate-2.0",
":dd-java-agent:instrumentation:kotlin-coroutines-1.3",
":dd-java-agent:instrumentation:lettuce:lettuce-4.0",
":dd-java-agent:instrumentation:lettuce:lettuce-5.0",