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..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 @@ -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,8 @@ public BuildSystemModuleImpl( settings = new BuildModuleSettings( getPropertiesPropagatedToChildProcess( + config.getServiceName(), + config.isServiceNameSetByUser(), moduleName, startCommand, classpath, @@ -125,6 +128,8 @@ public void set(Map carrier, String key, String value) { } private Map getPropertiesPropagatedToChildProcess( + String serviceName, + boolean userProvidedServiceName, String moduleName, String startCommand, @Nullable Collection classpath, @@ -190,6 +195,11 @@ private Map getPropertiesPropagatedToChildProcess( CiVisibilityConfig.CIVISIBILITY_INJECTED_TRACER_VERSION), TracerVersion.TRACER_VERSION); + 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 7458883ca32..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 @@ -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,22 @@ 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 + + def additionalDynamicPaths = ["content.service"] + verifyEventsAndCoverages(projectName, "maven", mavenVersion, mockBackend.waitForEvents(5), mockBackend.waitForCoverages(1), additionalDynamicPaths) + + 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 +307,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 +317,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 +339,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 +366,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 +384,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 +392,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..5181b3975ea --- /dev/null +++ b/dd-smoke-tests/maven/src/test/resources/test_successful_maven_run_child_service_propagation/events.ftl @@ -0,0 +1,330 @@ +[ { + "content" : { + "duration" : ${content_duration}, + "error" : 0, + "meta" : { + "_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" : ${content_service}, + "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.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" : ${content_service}, + "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" : ${content_service}, + "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" : ${content_service}, + "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" : ${content_service}, + "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" : ${content_service}, + "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.p.tid" : ${content_meta__dd_p_tid_7}, + "_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", + "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" : ${content_service}, + "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.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" : "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" : "false", + "_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" : ${content_service}, + "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); + } + +} 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; }