Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -99,6 +100,8 @@ public <T extends CoverageCalculator> BuildSystemModuleImpl(
settings =
new BuildModuleSettings(
getPropertiesPropagatedToChildProcess(
config.getServiceName(),
config.isServiceNameSetByUser(),
moduleName,
startCommand,
classpath,
Expand All @@ -125,6 +128,8 @@ public void set(Map<String, String> carrier, String key, String value) {
}

private Map<String, String> getPropertiesPropagatedToChildProcess(
String serviceName,
boolean userProvidedServiceName,
String moduleName,
String startCommand,
@Nullable Collection<Path> classpath,
Expand Down Expand Up @@ -190,6 +195,11 @@ private Map<String, String> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ abstract class CiVisibilityInstrumentationTest extends AgentTestRunner {
}
}

def generateTestFixtures(testcaseName, events, coverages, additionalReplacements, additionalIgnoredTags) {
def generateTestFixtures(String testcaseName, List<Map> events, List<Map> coverages, Map<String, String> additionalReplacements, List<String> additionalIgnoredTags) {
def clazz = this.getClass()
def resourceName = "/" + clazz.name.replace('.', '/') + ".class"
def classfilePath = clazz.getResource(resourceName).toURI().schemeSpecificPart
Expand All @@ -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 [:]
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@ import spock.lang.Specification
abstract class CiVisibilitySmokeTest extends Specification {
static final List<String> SMOKE_IGNORED_TAGS = ["content.meta.['_dd.integration']"]

protected verifyEventsAndCoverages(String projectName, String toolchain, String toolchainVersion, List<Map<String, Object>> events, List<Map<String, Object>> coverages) {
protected verifyEventsAndCoverages(String projectName, String toolchain, String toolchainVersion, List<Map<String, Object>> events, List<Map<String, Object>> coverages, List<String> 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)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,28 +71,28 @@ abstract class CiVisibilityTestUtils {
/**
* Use this method to generate expected data templates
*/
static void generateTemplates(String baseTemplatesPath, List<Map<?, ?>> events, List<Map<?, ?>> coverages, Map<String, String> additionalReplacements, List<String> ignoredTags = []) {
static void generateTemplates(String baseTemplatesPath, List<Map<?, ?>> events, List<Map<?, ?>> coverages, Collection<String> additionalDynamicPaths, List<String> 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<String, String> assertData(String baseTemplatesPath, List<Map<?, ?>> events, List<Map<?, ?>> coverages, Map<String, String> additionalReplacements, List<String> ignoredTags) {
static Map<String, String> assertData(String baseTemplatesPath, List<Map<?, ?>> events, List<Map<?, ?>> coverages, Map<String, String> additionalReplacements, List<String> ignoredTags, List<String> 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<String, String> e : additionalReplacements.entrySet()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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))
Expand All @@ -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))
Expand Down Expand Up @@ -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"

Expand Down Expand Up @@ -291,7 +307,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
private static final Collection<String> LOADED_DEPENDENCIES = new HashSet<>()

private void retryUntilSuccessfulOrNoAttemptsLeft(List<String> mvnCommand, Map<String, String> 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) {
Expand All @@ -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<String> additionalAgentArgs, List<String> additionalCommandLineParams, Map<String, String> additionalEnvVars = [:]) {
def processBuilder = createProcessBuilder(["-B", "test"] + additionalCommandLineParams, true, additionalAgentArgs, additionalEnvVars)
private int whenRunningMavenBuild(List<String> additionalAgentArgs, List<String> additionalCommandLineParams, Map<String, String> additionalEnvVars, boolean setServiceName = true) {
def processBuilder = createProcessBuilder(["-B", "test"] + additionalCommandLineParams, true, setServiceName, additionalAgentArgs, additionalEnvVars)

processBuilder.environment().put("DD_API_KEY", "01234567890abcdef123456789ABCDEF")

Expand All @@ -323,13 +339,13 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
return p.exitValue()
}

ProcessBuilder createProcessBuilder(List<String> mvnCommand, boolean runWithAgent, List<String> additionalAgentArgs, Map<String, String> additionalEnvVars) {
ProcessBuilder createProcessBuilder(List<String> mvnCommand, boolean runWithAgent, boolean setServiceName, List<String> additionalAgentArgs, Map<String, String> additionalEnvVars) {
String mavenRunnerShadowJar = System.getProperty("datadog.smoketest.maven.jar.path")
assert new File(mavenRunnerShadowJar).isFile()

List<String> 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)
Expand All @@ -350,7 +366,7 @@ class MavenSmokeTest extends CiVisibilitySmokeTest {
return System.getProperty("java.home") + separator + "bin" + separator + "java"
}

List<String> jvmArguments(boolean runWithAgent, List<String> additionalAgentArgs) {
List<String> jvmArguments(boolean runWithAgent, boolean setServiceName, List<String> additionalAgentArgs) {
def arguments = [
"-D${MavenWrapperMain.MVNW_VERBOSE}=true".toString(),
"-Duser.dir=${projectHome.toAbsolutePath()}".toString(),
Expand All @@ -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," +
Expand All @@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -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}
} ]
Loading