From 7d655865d4feba2ad9a61a5c6dd72e3e601b0e9e Mon Sep 17 00:00:00 2001 From: Nikita Tkachenko Date: Fri, 30 May 2025 11:40:09 +0200 Subject: [PATCH 1/2] Ensure auto-detected service name is the same for every process in the same build --- .../buildsystem/BuildSystemModuleImpl.java | 5 + .../datadog/smoketest/MavenSmokeTest.groovy | 38 +- .../coverages.ftl | 10 + .../events.ftl | 334 ++++++++++++++++++ .../pom.xml | 62 ++++ .../main/java/datadog/smoke/Calculator.java | 11 + .../test/java/datadog/smoke/TestSucceed.java | 14 + 7 files changed, 464 insertions(+), 10 deletions(-) create mode 100644 dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/coverages.ftl create mode 100644 dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl create mode 100644 dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/pom.xml create mode 100644 dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/src/main/java/datadog/smoke/Calculator.java create mode 100644 dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/src/test/java/datadog/smoke/TestSucceed.java diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java index d38fc439408..e029c5f09ab 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java @@ -12,6 +12,7 @@ import datadog.trace.api.civisibility.domain.JavaAgent; import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.config.CiVisibilityConfig; +import datadog.trace.api.config.GeneralConfig; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext; import datadog.trace.bootstrap.instrumentation.api.Tags; @@ -99,6 +100,7 @@ public BuildSystemModuleImpl( settings = new BuildModuleSettings( getPropertiesPropagatedToChildProcess( + config.getServiceName(), moduleName, startCommand, classpath, @@ -125,6 +127,7 @@ public void set(Map carrier, String key, String value) { } private Map getPropertiesPropagatedToChildProcess( + String serviceName, String moduleName, String startCommand, @Nullable Collection classpath, @@ -190,6 +193,8 @@ private Map getPropertiesPropagatedToChildProcess( CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION), TracerVersion.TRACER_VERSION); + propagatedSystemProperties.put( + Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME), serviceName); propagatedSystemProperties.put( Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_MODULE_NAME), moduleName); diff --git a/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy b/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy index 7458883ca32..6985de4b31e 100644 --- a/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy +++ b/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy @@ -75,7 +75,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { def agentArgs = jacocoCoverage ? [ "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_JACOCO_PLUGIN_VERSION)}=${JACOCO_PLUGIN_VERSION}" as String ] : [] - def exitCode = whenRunningMavenBuild(agentArgs, commandLineParams) + def exitCode = whenRunningMavenBuild(agentArgs, commandLineParams, [:]) if (expectSuccess) { assert exitCode == 0 @@ -118,7 +118,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { def exitCode = whenRunningMavenBuild([ "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_GIT_CLIENT_ENABLED)}=false" as String, "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_IMPACTED_TESTS_BACKEND_REQUEST_ENABLED)}=true" as String - ], []) + ], [], [:]) assert exitCode == 0 verifyEventsAndCoverages(projectName, "maven", mavenVersion, mockBackend.waitForEvents(5), mockBackend.waitForCoverages(1)) @@ -143,7 +143,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { mockBackend.givenAttemptToFixTests("Maven Smoke Tests Project maven-surefire-plugin default-test", "datadog.smoke.TestFailed", "test_another_failed") - def exitCode = whenRunningMavenBuild([], []) + def exitCode = whenRunningMavenBuild([], [], [:]) assert exitCode == 0 verifyEventsAndCoverages(projectName, "maven", mavenVersion, mockBackend.waitForEvents(15), mockBackend.waitForCoverages(6)) @@ -228,6 +228,21 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { ] | 12 } + def "test service name is propagated to child processes"() { + givenWrapperPropertiesFile(mavenVersion) + givenMavenProjectFiles(projectName) + givenMavenDependenciesAreLoaded(projectName, mavenVersion) + + def exitCode = whenRunningMavenBuild([], [], [:], false) + assert exitCode == 0 + + verifyEventsAndCoverages(projectName, "maven", mavenVersion, mockBackend.waitForEvents(5), mockBackend.waitForCoverages(1)) + + where: + projectName | mavenVersion + "test_successful_maven_run_child_service_propagation" | "3.9.9" + } + private void givenWrapperPropertiesFile(String mavenVersion) { def distributionUrl = "https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/${mavenVersion}/apache-maven-${mavenVersion}-bin.zip" @@ -291,7 +306,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { private static final Collection LOADED_DEPENDENCIES = new HashSet<>() private void retryUntilSuccessfulOrNoAttemptsLeft(List mvnCommand, Map additionalEnvVars = [:]) { - def processBuilder = createProcessBuilder(mvnCommand, false, [], additionalEnvVars) + def processBuilder = createProcessBuilder(mvnCommand, false, false, [], additionalEnvVars) for (int attempt = 0; attempt < DEPENDENCIES_DOWNLOAD_RETRIES; attempt++) { def exitCode = runProcess(processBuilder.start()) if (exitCode == 0) { @@ -301,8 +316,8 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { throw new AssertionError((Object) "Tried $DEPENDENCIES_DOWNLOAD_RETRIES times to execute $mvnCommand and failed") } - private int whenRunningMavenBuild(List additionalAgentArgs, List additionalCommandLineParams, Map additionalEnvVars = [:]) { - def processBuilder = createProcessBuilder(["-B", "test"] + additionalCommandLineParams, true, additionalAgentArgs, additionalEnvVars) + private int whenRunningMavenBuild(List additionalAgentArgs, List additionalCommandLineParams, Map additionalEnvVars, boolean setServiceName = true) { + def processBuilder = createProcessBuilder(["-B", "test"] + additionalCommandLineParams, true, setServiceName, additionalAgentArgs, additionalEnvVars) processBuilder.environment().put("DD_API_KEY", "01234567890abcdef123456789ABCDEF") @@ -323,13 +338,13 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { return p.exitValue() } - ProcessBuilder createProcessBuilder(List mvnCommand, boolean runWithAgent, List additionalAgentArgs, Map additionalEnvVars) { + ProcessBuilder createProcessBuilder(List mvnCommand, boolean runWithAgent, boolean setServiceName, List additionalAgentArgs, Map additionalEnvVars) { String mavenRunnerShadowJar = System.getProperty("datadog.smoketest.maven.jar.path") assert new File(mavenRunnerShadowJar).isFile() List command = new ArrayList<>() command.add(javaPath()) - command.addAll(jvmArguments(runWithAgent, additionalAgentArgs)) + command.addAll(jvmArguments(runWithAgent, setServiceName, additionalAgentArgs)) command.addAll((String[]) ["-jar", mavenRunnerShadowJar]) command.addAll(programArguments()) command.addAll(mvnCommand) @@ -350,7 +365,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { return System.getProperty("java.home") + separator + "bin" + separator + "java" } - List jvmArguments(boolean runWithAgent, List additionalAgentArgs) { + List jvmArguments(boolean runWithAgent, boolean setServiceName, List additionalAgentArgs) { def arguments = [ "-D${MavenWrapperMain.MVNW_VERBOSE}=true".toString(), "-Duser.dir=${projectHome.toAbsolutePath()}".toString(), @@ -368,7 +383,6 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { (System.getenv("DD_CIVISIBILITY_SMOKETEST_DEBUG_CHILD") != null ? "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_DEBUG_PORT)}=5055," : "") + "${Strings.propertyNameToSystemPropertyName(GeneralConfig.TRACE_DEBUG)}=true," + "${Strings.propertyNameToSystemPropertyName(GeneralConfig.ENV)}=${TEST_ENVIRONMENT_NAME}," + - "${Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME)}=${TEST_SERVICE_NAME}," + "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_ENABLED)}=true," + "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_AGENTLESS_ENABLED)}=true," + "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_CIPROVIDER_INTEGRATION_ENABLED)}=false," + @@ -377,6 +391,10 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_AGENTLESS_URL)}=${mockBackend.intakeUrl}," + "${Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_FLAKY_RETRY_ONLY_KNOWN_FLAKES)}=true," + if (setServiceName) { + agentArgument += "${Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME)}=${TEST_SERVICE_NAME}," + } + agentArgument += additionalAgentArgs.join(",") arguments += agentArgument.toString() diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/coverages.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/coverages.ftl new file mode 100644 index 00000000000..4b68a5e11fc --- /dev/null +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/coverages.ftl @@ -0,0 +1,10 @@ +[ { + "files" : [ { + "filename" : "src/test/java/datadog/smoke/TestSucceed.java" + }, { + "filename" : "src/main/java/datadog/smoke/Calculator.java" + } ], + "span_id" : ${content_span_id_5}, + "test_session_id" : ${content_test_session_id}, + "test_suite_id" : ${content_test_suite_id} +} ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl new file mode 100644 index 00000000000..b35b3d086ed --- /dev/null +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl @@ -0,0 +1,334 @@ +[ { + "content" : { + "duration" : ${content_duration}, + "error" : 0, + "meta" : { + "_dd.integration" : "maven", + "_dd.p.tid" : ${content_meta__dd_p_tid}, + "_dd.test.is_user_provided_service" : "false", + "_dd.tracer_host" : ${content_meta__dd_tracer_host}, + "ci.workspace_path" : ${content_meta_ci_workspace_path}, + "component" : "maven", + "env" : "integration-test", + "language" : "jvm", + "library_version" : ${content_meta_library_version}, + "os.architecture" : ${content_meta_os_architecture}, + "os.platform" : ${content_meta_os_platform}, + "os.version" : ${content_meta_os_version}, + "runtime-id" : ${content_meta_runtime_id}, + "runtime.name" : ${content_meta_runtime_name}, + "runtime.vendor" : ${content_meta_runtime_vendor}, + "runtime.version" : ${content_meta_runtime_version}, + "span.kind" : "test_session_end", + "test.code_coverage.enabled" : "true", + "test.command" : "mvn -B test", + "test.framework" : "junit4", + "test.framework_version" : "4.13.2", + "test.itr.tests_skipping.enabled" : "true", + "test.itr.tests_skipping.type" : "test", + "test.status" : "pass", + "test.toolchain" : ${content_meta_test_toolchain}, + "test.type" : "test", + "test_session.name" : "mvn -B test" + }, + "metrics" : { + "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count}, + "_dd.profiling.enabled" : 0, + "_dd.trace_span_attribute_schema" : 0, + "process_id" : ${content_metrics_process_id}, + "test.itr.tests_skipping.count" : 0 + }, + "name" : "maven.test_session", + "resource" : "Maven Smoke Tests Project", + "service" : "maven-1.50.0-snapshot-all", + "start" : ${content_start}, + "test_session_id" : ${content_test_session_id} + }, + "type" : "test_session_end", + "version" : 1 +}, { + "content" : { + "duration" : ${content_duration_2}, + "error" : 0, + "meta" : { + "_dd.integration" : "maven", + "_dd.p.tid" : ${content_meta__dd_p_tid_2}, + "_dd.test.is_user_provided_service" : "false", + "ci.workspace_path" : ${content_meta_ci_workspace_path}, + "component" : "maven", + "env" : "integration-test", + "language" : "jvm", + "library_version" : ${content_meta_library_version}, + "os.architecture" : ${content_meta_os_architecture}, + "os.platform" : ${content_meta_os_platform}, + "os.version" : ${content_meta_os_version}, + "runtime-id" : ${content_meta_runtime_id}, + "runtime.name" : ${content_meta_runtime_name}, + "runtime.vendor" : ${content_meta_runtime_vendor}, + "runtime.version" : ${content_meta_runtime_version}, + "span.kind" : "test_module_end", + "test.code_coverage.enabled" : "true", + "test.command" : "mvn -B test", + "test.execution" : "maven-surefire-plugin:test:default-test", + "test.framework" : "junit4", + "test.framework_version" : "4.13.2", + "test.itr.tests_skipping.enabled" : "true", + "test.itr.tests_skipping.type" : "test", + "test.module" : "Maven Smoke Tests Project maven-surefire-plugin default-test", + "test.status" : "pass", + "test.type" : "test", + "test_session.name" : "mvn -B test" + }, + "metrics" : { + "_dd.host.vcpu_count" : ${content_metrics__dd_host_vcpu_count_2}, + "test.itr.tests_skipping.count" : 0 + }, + "name" : "maven.test_module", + "resource" : "Maven Smoke Tests Project maven-surefire-plugin default-test", + "service" : "maven-1.50.0-snapshot-all", + "start" : ${content_start_2}, + "test_module_id" : ${content_test_module_id}, + "test_session_id" : ${content_test_session_id} + }, + "type" : "test_module_end", + "version" : 1 +}, { + "content" : { + "duration" : ${content_duration_3}, + "error" : 0, + "meta" : { + "_dd.p.tid" : ${content_meta__dd_p_tid_3}, + "_dd.test.is_user_provided_service" : "false", + "env" : "integration-test", + "execution" : "default-compile", + "language" : "jvm", + "library_version" : ${content_meta_library_version}, + "os.architecture" : ${content_meta_os_architecture}, + "os.platform" : ${content_meta_os_platform}, + "os.version" : ${content_meta_os_version}, + "plugin" : "maven-compiler-plugin", + "project" : "Maven Smoke Tests Project", + "runtime-id" : ${content_meta_runtime_id}, + "runtime.name" : ${content_meta_runtime_name}, + "runtime.vendor" : ${content_meta_runtime_vendor}, + "runtime.version" : ${content_meta_runtime_version} + }, + "metrics" : { }, + "name" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_compile", + "parent_id" : ${content_test_session_id}, + "resource" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_compile", + "service" : "maven-1.50.0-snapshot-all", + "span_id" : ${content_span_id}, + "start" : ${content_start_3}, + "trace_id" : ${content_test_session_id} + }, + "type" : "span", + "version" : 1 +}, { + "content" : { + "duration" : ${content_duration_4}, + "error" : 0, + "meta" : { + "_dd.p.tid" : ${content_meta__dd_p_tid_4}, + "_dd.test.is_user_provided_service" : "false", + "env" : "integration-test", + "execution" : "default-testCompile", + "language" : "jvm", + "library_version" : ${content_meta_library_version}, + "os.architecture" : ${content_meta_os_architecture}, + "os.platform" : ${content_meta_os_platform}, + "os.version" : ${content_meta_os_version}, + "plugin" : "maven-compiler-plugin", + "project" : "Maven Smoke Tests Project", + "runtime-id" : ${content_meta_runtime_id}, + "runtime.name" : ${content_meta_runtime_name}, + "runtime.vendor" : ${content_meta_runtime_vendor}, + "runtime.version" : ${content_meta_runtime_version} + }, + "metrics" : { }, + "name" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_testCompile", + "parent_id" : ${content_test_session_id}, + "resource" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_testCompile", + "service" : "maven-1.50.0-snapshot-all", + "span_id" : ${content_span_id_2}, + "start" : ${content_start_4}, + "trace_id" : ${content_test_session_id} + }, + "type" : "span", + "version" : 1 +}, { + "content" : { + "duration" : ${content_duration_5}, + "error" : 0, + "meta" : { + "_dd.p.tid" : ${content_meta__dd_p_tid_5}, + "_dd.test.is_user_provided_service" : "false", + "env" : "integration-test", + "execution" : "default-resources", + "language" : "jvm", + "library_version" : ${content_meta_library_version}, + "os.architecture" : ${content_meta_os_architecture}, + "os.platform" : ${content_meta_os_platform}, + "os.version" : ${content_meta_os_version}, + "plugin" : "maven-resources-plugin", + "project" : "Maven Smoke Tests Project", + "runtime-id" : ${content_meta_runtime_id}, + "runtime.name" : ${content_meta_runtime_name}, + "runtime.vendor" : ${content_meta_runtime_vendor}, + "runtime.version" : ${content_meta_runtime_version} + }, + "metrics" : { }, + "name" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_resources", + "parent_id" : ${content_test_session_id}, + "resource" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_resources", + "service" : "maven-1.50.0-snapshot-all", + "span_id" : ${content_span_id_3}, + "start" : ${content_start_5}, + "trace_id" : ${content_test_session_id} + }, + "type" : "span", + "version" : 1 +}, { + "content" : { + "duration" : ${content_duration_6}, + "error" : 0, + "meta" : { + "_dd.p.tid" : ${content_meta__dd_p_tid_6}, + "_dd.test.is_user_provided_service" : "false", + "env" : "integration-test", + "execution" : "default-testResources", + "language" : "jvm", + "library_version" : ${content_meta_library_version}, + "os.architecture" : ${content_meta_os_architecture}, + "os.platform" : ${content_meta_os_platform}, + "os.version" : ${content_meta_os_version}, + "plugin" : "maven-resources-plugin", + "project" : "Maven Smoke Tests Project", + "runtime-id" : ${content_meta_runtime_id}, + "runtime.name" : ${content_meta_runtime_name}, + "runtime.vendor" : ${content_meta_runtime_vendor}, + "runtime.version" : ${content_meta_runtime_version} + }, + "metrics" : { }, + "name" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_testResources", + "parent_id" : ${content_test_session_id}, + "resource" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_testResources", + "service" : "maven-1.50.0-snapshot-all", + "span_id" : ${content_span_id_4}, + "start" : ${content_start_6}, + "trace_id" : ${content_test_session_id} + }, + "type" : "span", + "version" : 1 +}, { + "content" : { + "duration" : ${content_duration_7}, + "error" : 0, + "meta" : { + "_dd.integration" : "junit4", + "_dd.p.tid" : ${content_meta__dd_p_tid_7}, + "_dd.test.is_user_provided_service" : "true", + "_dd.tracer_host" : ${content_meta__dd_tracer_host}, + "ci.workspace_path" : ${content_meta_ci_workspace_path}, + "component" : "junit4", + "env" : "integration-test", + "language" : "jvm", + "library_version" : ${content_meta_library_version}, + "os.architecture" : ${content_meta_os_architecture}, + "os.platform" : ${content_meta_os_platform}, + "os.version" : ${content_meta_os_version}, + "runtime-id" : ${content_meta_runtime_id_2}, + "runtime.name" : ${content_meta_runtime_name}, + "runtime.vendor" : ${content_meta_runtime_vendor}, + "runtime.version" : ${content_meta_runtime_version}, + "span.kind" : "test_suite_end", + "test.framework" : "junit4", + "test.framework_version" : "4.13.2", + "test.module" : "Maven Smoke Tests Project maven-surefire-plugin default-test", + "test.source.file" : "src/test/java/datadog/smoke/TestSucceed.java", + "test.status" : "pass", + "test.suite" : "datadog.smoke.TestSucceed", + "test.type" : "test", + "test_session.name" : "mvn -B test" + }, + "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_2}, + "test.source.end" : 14, + "test.source.start" : 7 + }, + "name" : "junit4.test_suite", + "resource" : "datadog.smoke.TestSucceed", + "service" : "maven-1.50.0-snapshot-all", + "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.integration" : "junit4", + "_dd.library_capabilities.auto_test_retries" : "1", + "_dd.library_capabilities.early_flake_detection" : "1", + "_dd.library_capabilities.fail_fast_test_order" : "1", + "_dd.library_capabilities.impacted_tests" : "1", + "_dd.library_capabilities.test_impact_analysis" : "1", + "_dd.library_capabilities.test_management.attempt_to_fix" : "2", + "_dd.library_capabilities.test_management.disable" : "1", + "_dd.library_capabilities.test_management.quarantine" : "1", + "_dd.p.tid" : ${content_meta__dd_p_tid_8}, + "_dd.test.is_user_provided_service" : "true", + "_dd.tracer_host" : ${content_meta__dd_tracer_host}, + "ci.workspace_path" : ${content_meta_ci_workspace_path}, + "component" : "junit4", + "env" : "integration-test", + "language" : "jvm", + "library_version" : ${content_meta_library_version}, + "os.architecture" : ${content_meta_os_architecture}, + "os.platform" : ${content_meta_os_platform}, + "os.version" : ${content_meta_os_version}, + "runtime-id" : ${content_meta_runtime_id_2}, + "runtime.name" : ${content_meta_runtime_name}, + "runtime.vendor" : ${content_meta_runtime_vendor}, + "runtime.version" : ${content_meta_runtime_version}, + "span.kind" : "test", + "test.framework" : "junit4", + "test.framework_version" : "4.13.2", + "test.module" : "Maven Smoke Tests Project maven-surefire-plugin default-test", + "test.name" : "test_succeed", + "test.source.file" : "src/test/java/datadog/smoke/TestSucceed.java", + "test.source.method" : "test_succeed()V", + "test.status" : "pass", + "test.suite" : "datadog.smoke.TestSucceed", + "test.type" : "test", + "test_session.name" : "mvn -B test" + }, + "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_2}, + "test.source.end" : 12, + "test.source.start" : 9 + }, + "name" : "junit4.test", + "parent_id" : ${content_parent_id}, + "resource" : "datadog.smoke.TestSucceed.test_succeed", + "service" : "maven-1.50.0-snapshot-all", + "span_id" : ${content_span_id_5}, + "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 +} ] \ No newline at end of file diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/pom.xml b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/pom.xml new file mode 100644 index 00000000000..1680265ee15 --- /dev/null +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/pom.xml @@ -0,0 +1,62 @@ + + + + 4.0.0 + com.datadog.ci.test + maven-smoke-test + 1.0-SNAPSHOT + Maven Smoke Tests Project + + + 8 + 8 + UTF-8 + + + + + + + false + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + + + + never + + + false + + central + Central Repository + https://repo.maven.apache.org/maven2 + + + + + + junit + junit + 4.13.2 + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.17 + + + + + diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/src/main/java/datadog/smoke/Calculator.java b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/src/main/java/datadog/smoke/Calculator.java new file mode 100644 index 00000000000..2f4461a279d --- /dev/null +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/src/main/java/datadog/smoke/Calculator.java @@ -0,0 +1,11 @@ +package datadog.smoke; + +public class Calculator { + public static int add(int a, int b) { + return a + b; + } + + public static int subtract(int a, int b) { + return a - b; + } +} diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/src/test/java/datadog/smoke/TestSucceed.java b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/src/test/java/datadog/smoke/TestSucceed.java new file mode 100644 index 00000000000..916a37742c7 --- /dev/null +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/src/test/java/datadog/smoke/TestSucceed.java @@ -0,0 +1,14 @@ +package datadog.smoke; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class TestSucceed { + + @Test + public void test_succeed() { + assertTrue(Calculator.add(2, 2) == 4); + } + +} From 2a2204324c0c2e6638d3cf570f5a75a38d660ecc Mon Sep 17 00:00:00 2001 From: Nikita Tkachenko Date: Fri, 30 May 2025 13:21:48 +0200 Subject: [PATCH 2/2] Fix service name provided by user tagging --- .../buildsystem/BuildSystemModuleImpl.java | 5 ++++ .../CiVisibilityInstrumentationTest.groovy | 4 +-- .../civisibility/CiVisibilitySmokeTest.groovy | 6 ++--- .../civisibility/CiVisibilityTestUtils.groovy | 8 +++--- .../datadog/smoketest/MavenSmokeTest.groovy | 3 ++- .../events.ftl | 26 ++++++++----------- .../trace/api/config/GeneralConfig.java | 1 + .../main/java/datadog/trace/api/Config.java | 3 ++- 8 files changed, 30 insertions(+), 26 deletions(-) diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java index e029c5f09ab..4fc0c27f59a 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/buildsystem/BuildSystemModuleImpl.java @@ -101,6 +101,7 @@ public BuildSystemModuleImpl( new BuildModuleSettings( getPropertiesPropagatedToChildProcess( config.getServiceName(), + config.isServiceNameSetByUser(), moduleName, startCommand, classpath, @@ -128,6 +129,7 @@ public void set(Map carrier, String key, String value) { private Map getPropertiesPropagatedToChildProcess( String serviceName, + boolean userProvidedServiceName, String moduleName, String startCommand, @Nullable Collection classpath, @@ -195,6 +197,9 @@ private Map getPropertiesPropagatedToChildProcess( propagatedSystemProperties.put( Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME), serviceName); + propagatedSystemProperties.put( + Strings.propertyNameToSystemPropertyName(GeneralConfig.SERVICE_NAME_SET_BY_USER), + String.valueOf(userProvidedServiceName)); propagatedSystemProperties.put( Strings.propertyNameToSystemPropertyName(CiVisibilityConfig.CIVISIBILITY_MODULE_NAME), moduleName); diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy index 609f1e41728..e4031ecdf30 100644 --- a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy @@ -368,7 +368,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner { } } - def generateTestFixtures(testcaseName, events, coverages, additionalReplacements, additionalIgnoredTags) { + def generateTestFixtures(String testcaseName, List events, List coverages, Map additionalReplacements, List additionalIgnoredTags) { def clazz = this.getClass() def resourceName = "/" + clazz.name.replace('.', '/') + ".class" def classfilePath = clazz.getResource(resourceName).toURI().schemeSpecificPart @@ -380,7 +380,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner { submoduleName = "test" } def baseTemplatesPath = modulePath + "/src/" + submoduleName + "/resources/" + testcaseName - CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements, additionalIgnoredTags) + CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements.keySet(), additionalIgnoredTags) return [:] } diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy index 654a6018db7..4251f586597 100644 --- a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy @@ -6,14 +6,14 @@ import spock.lang.Specification abstract class CiVisibilitySmokeTest extends Specification { static final List SMOKE_IGNORED_TAGS = ["content.meta.['_dd.integration']"] - protected verifyEventsAndCoverages(String projectName, String toolchain, String toolchainVersion, List> events, List> coverages) { + protected verifyEventsAndCoverages(String projectName, String toolchain, String toolchainVersion, List> events, List> coverages, List additionalDynamicTags = []) { def additionalReplacements = ["content.meta.['test.toolchain']": "$toolchain:$toolchainVersion"] if (System.getenv().get("GENERATE_TEST_FIXTURES") != null) { def baseTemplatesPath = CiVisibilitySmokeTest.classLoader.getResource(projectName).toURI().schemeSpecificPart.replace('build/resources/test', 'src/test/resources') - CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements, SMOKE_IGNORED_TAGS) + CiVisibilityTestUtils.generateTemplates(baseTemplatesPath, events, coverages, additionalReplacements.keySet() + additionalDynamicTags, SMOKE_IGNORED_TAGS) } else { - CiVisibilityTestUtils.assertData(projectName, events, coverages, additionalReplacements, SMOKE_IGNORED_TAGS) + CiVisibilityTestUtils.assertData(projectName, events, coverages, additionalReplacements, SMOKE_IGNORED_TAGS, additionalDynamicTags) } } diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy index dea0be4fa61..86848aa6d29 100644 --- a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy +++ b/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy @@ -71,28 +71,28 @@ abstract class CiVisibilityTestUtils { /** * Use this method to generate expected data templates */ - static void generateTemplates(String baseTemplatesPath, List> events, List> coverages, Map additionalReplacements, List ignoredTags = []) { + static void generateTemplates(String baseTemplatesPath, List> events, List> coverages, Collection additionalDynamicPaths, List ignoredTags = []) { if (!ignoredTags.empty) { events = removeTags(events, ignoredTags) } events.sort(EVENT_RESOURCE_COMPARATOR) def templateGenerator = new TemplateGenerator(new LabelGenerator()) - def compiledAdditionalReplacements = compile(additionalReplacements.keySet()) + def compiledAdditionalReplacements = compile(additionalDynamicPaths) Files.createDirectories(Paths.get(baseTemplatesPath)) Files.write(Paths.get(baseTemplatesPath, "events.ftl"), templateGenerator.generateTemplate(events, EVENT_DYNAMIC_PATHS + compiledAdditionalReplacements).bytes) Files.write(Paths.get(baseTemplatesPath, "coverages.ftl"), templateGenerator.generateTemplate(coverages, COVERAGE_DYNAMIC_PATHS + compiledAdditionalReplacements).bytes) } - static Map assertData(String baseTemplatesPath, List> events, List> coverages, Map additionalReplacements, List ignoredTags) { + static Map assertData(String baseTemplatesPath, List> events, List> coverages, Map additionalReplacements, List ignoredTags, List additionalDynamicPaths = []) { events.sort(EVENT_RESOURCE_COMPARATOR) def labelGenerator = new LabelGenerator() def templateGenerator = new TemplateGenerator(labelGenerator) def replacementMap - replacementMap = templateGenerator.generateReplacementMap(events, EVENT_DYNAMIC_PATHS) + replacementMap = templateGenerator.generateReplacementMap(events, EVENT_DYNAMIC_PATHS + compile(additionalDynamicPaths)) replacementMap = templateGenerator.generateReplacementMap(coverages, COVERAGE_DYNAMIC_PATHS) for (Map.Entry e : additionalReplacements.entrySet()) { diff --git a/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy b/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy index 6985de4b31e..927f1ce0440 100644 --- a/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy +++ b/dd-smoke-tests/maven/src/test/groovy/datadog/smoketest/MavenSmokeTest.groovy @@ -236,7 +236,8 @@ class MavenSmokeTest extends CiVisibilitySmokeTest { def exitCode = whenRunningMavenBuild([], [], [:], false) assert exitCode == 0 - verifyEventsAndCoverages(projectName, "maven", mavenVersion, mockBackend.waitForEvents(5), mockBackend.waitForCoverages(1)) + def additionalDynamicPaths = ["content.service"] + verifyEventsAndCoverages(projectName, "maven", mavenVersion, mockBackend.waitForEvents(5), mockBackend.waitForCoverages(1), additionalDynamicPaths) where: projectName | mavenVersion diff --git a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl index b35b3d086ed..5181b3975ea 100644 --- a/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl @@ -3,7 +3,6 @@ "duration" : ${content_duration}, "error" : 0, "meta" : { - "_dd.integration" : "maven", "_dd.p.tid" : ${content_meta__dd_p_tid}, "_dd.test.is_user_provided_service" : "false", "_dd.tracer_host" : ${content_meta__dd_tracer_host}, @@ -40,7 +39,7 @@ }, "name" : "maven.test_session", "resource" : "Maven Smoke Tests Project", - "service" : "maven-1.50.0-snapshot-all", + "service" : ${content_service}, "start" : ${content_start}, "test_session_id" : ${content_test_session_id} }, @@ -51,7 +50,6 @@ "duration" : ${content_duration_2}, "error" : 0, "meta" : { - "_dd.integration" : "maven", "_dd.p.tid" : ${content_meta__dd_p_tid_2}, "_dd.test.is_user_provided_service" : "false", "ci.workspace_path" : ${content_meta_ci_workspace_path}, @@ -85,7 +83,7 @@ }, "name" : "maven.test_module", "resource" : "Maven Smoke Tests Project maven-surefire-plugin default-test", - "service" : "maven-1.50.0-snapshot-all", + "service" : ${content_service}, "start" : ${content_start_2}, "test_module_id" : ${content_test_module_id}, "test_session_id" : ${content_test_session_id} @@ -117,7 +115,7 @@ "name" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_compile", "parent_id" : ${content_test_session_id}, "resource" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_compile", - "service" : "maven-1.50.0-snapshot-all", + "service" : ${content_service}, "span_id" : ${content_span_id}, "start" : ${content_start_3}, "trace_id" : ${content_test_session_id} @@ -149,7 +147,7 @@ "name" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_testCompile", "parent_id" : ${content_test_session_id}, "resource" : "Maven_Smoke_Tests_Project_maven_compiler_plugin_default_testCompile", - "service" : "maven-1.50.0-snapshot-all", + "service" : ${content_service}, "span_id" : ${content_span_id_2}, "start" : ${content_start_4}, "trace_id" : ${content_test_session_id} @@ -181,7 +179,7 @@ "name" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_resources", "parent_id" : ${content_test_session_id}, "resource" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_resources", - "service" : "maven-1.50.0-snapshot-all", + "service" : ${content_service}, "span_id" : ${content_span_id_3}, "start" : ${content_start_5}, "trace_id" : ${content_test_session_id} @@ -213,7 +211,7 @@ "name" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_testResources", "parent_id" : ${content_test_session_id}, "resource" : "Maven_Smoke_Tests_Project_maven_resources_plugin_default_testResources", - "service" : "maven-1.50.0-snapshot-all", + "service" : ${content_service}, "span_id" : ${content_span_id_4}, "start" : ${content_start_6}, "trace_id" : ${content_test_session_id} @@ -225,9 +223,8 @@ "duration" : ${content_duration_7}, "error" : 0, "meta" : { - "_dd.integration" : "junit4", "_dd.p.tid" : ${content_meta__dd_p_tid_7}, - "_dd.test.is_user_provided_service" : "true", + "_dd.test.is_user_provided_service" : "false", "_dd.tracer_host" : ${content_meta__dd_tracer_host}, "ci.workspace_path" : ${content_meta_ci_workspace_path}, "component" : "junit4", @@ -261,7 +258,7 @@ }, "name" : "junit4.test_suite", "resource" : "datadog.smoke.TestSucceed", - "service" : "maven-1.50.0-snapshot-all", + "service" : ${content_service}, "start" : ${content_start_7}, "test_module_id" : ${content_test_module_id}, "test_session_id" : ${content_test_session_id}, @@ -274,17 +271,16 @@ "duration" : ${content_duration_8}, "error" : 0, "meta" : { - "_dd.integration" : "junit4", "_dd.library_capabilities.auto_test_retries" : "1", "_dd.library_capabilities.early_flake_detection" : "1", "_dd.library_capabilities.fail_fast_test_order" : "1", "_dd.library_capabilities.impacted_tests" : "1", "_dd.library_capabilities.test_impact_analysis" : "1", - "_dd.library_capabilities.test_management.attempt_to_fix" : "2", + "_dd.library_capabilities.test_management.attempt_to_fix" : "4", "_dd.library_capabilities.test_management.disable" : "1", "_dd.library_capabilities.test_management.quarantine" : "1", "_dd.p.tid" : ${content_meta__dd_p_tid_8}, - "_dd.test.is_user_provided_service" : "true", + "_dd.test.is_user_provided_service" : "false", "_dd.tracer_host" : ${content_meta__dd_tracer_host}, "ci.workspace_path" : ${content_meta_ci_workspace_path}, "component" : "junit4", @@ -321,7 +317,7 @@ "name" : "junit4.test", "parent_id" : ${content_parent_id}, "resource" : "datadog.smoke.TestSucceed.test_succeed", - "service" : "maven-1.50.0-snapshot-all", + "service" : ${content_service}, "span_id" : ${content_span_id_5}, "start" : ${content_start_8}, "test_module_id" : ${content_test_module_id}, diff --git a/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java b/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java index cf0664b9403..8b70ca5455d 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/config/GeneralConfig.java @@ -21,6 +21,7 @@ public final class GeneralConfig { public static final String SITE = "site"; public static final String SERVICE_NAME = "service.name"; + public static final String SERVICE_NAME_SET_BY_USER = "service.name.set.by.user"; public static final String ENV = "env"; public static final String VERSION = "version"; public static final String PRIMARY_TAG = "primary.tag"; diff --git a/internal-api/src/main/java/datadog/trace/api/Config.java b/internal-api/src/main/java/datadog/trace/api/Config.java index b3e4c533cd9..9de6af8fd54 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -635,7 +635,8 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins serviceNameSetByUser = false; serviceName = configProvider.getString(SERVICE, DEFAULT_SERVICE_NAME, SERVICE_NAME); } else { - serviceNameSetByUser = true; + // might be an auto-detected name propagated from instrumented parent process + serviceNameSetByUser = configProvider.getBoolean(SERVICE_NAME_SET_BY_USER, true); serviceName = userProvidedServiceName; }