From cb8f3a1a1e06885593dd88afffd15c7feb5174ab Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Fri, 31 Jan 2025 10:52:36 +0100 Subject: [PATCH 1/3] adds tag to specify if the user is setting DD_SERVICE --- .../domain/AbstractTestModule.java | 3 + .../domain/AbstractTestSession.java | 3 + .../trace/civisibility/domain/TestImpl.java | 3 + .../civisibility/domain/TestSuiteImpl.java | 3 + .../civisibility/domain/TestImplTest.groovy | 13 +++- .../domain/TestSuiteImplTest.groovy | 9 ++- .../headless/HeadlessTestModuleTest.groovy | 77 ++++++++++++------- .../main/java/datadog/trace/api/DDTags.java | 1 + .../writer/ddintake/CiTestCycleMapperV1.java | 13 ++++ .../CiTestCycleMapperV1PayloadTest.groovy | 38 +++++---- 10 files changed, 117 insertions(+), 46 deletions(-) diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java index 18f383106bd..a9ae2e6a582 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java @@ -3,6 +3,7 @@ import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME; import datadog.trace.api.Config; +import datadog.trace.api.DDTags; import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.civisibility.telemetry.tag.EventType; @@ -72,6 +73,8 @@ public AbstractTestModule( span.setTag(Tags.TEST_MODULE_ID, span.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, span.getTraceId()); + span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); + // setting status to skip initially, // as we do not know in advance whether the module will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java index 90681d6a02e..55b9a675dd8 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java @@ -4,6 +4,7 @@ import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME; import datadog.trace.api.Config; +import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.IdGenerationStrategy; import datadog.trace.api.civisibility.CIConstants; @@ -97,6 +98,8 @@ public AbstractTestSession( span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_TEST_SESSION); span.setTag(Tags.TEST_SESSION_ID, span.getTraceId()); + span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); + // setting status to skip initially, // as we do not know in advance whether the session will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java index 65dcfbfa04d..52a8f479990 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java @@ -5,6 +5,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import datadog.trace.api.Config; +import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.civisibility.CIConstants; import datadog.trace.api.civisibility.DDTest; @@ -124,6 +125,8 @@ public TestImpl( span.setTag(Tags.TEST_MODULE_ID, moduleSpanContext.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, moduleSpanContext.getTraceId()); + span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); + span.setTag(Tags.TEST_STATUS, TestStatus.pass); if (testClass != null && !testClass.getName().equals(testSuiteName)) { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java index 024f77f0b4d..e2681daace9 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java @@ -5,6 +5,7 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import datadog.trace.api.Config; +import datadog.trace.api.DDTags; import datadog.trace.api.civisibility.DDTestSuite; import datadog.trace.api.civisibility.coverage.CoverageStore; import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; @@ -113,6 +114,8 @@ public TestSuiteImpl( span.setTag(Tags.TEST_MODULE_ID, moduleSpanContext.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, moduleSpanContext.getTraceId()); + span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); + // setting status to skip initially, // as we do not know in advance whether the suite will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy index 6b7cf95617b..9c4580d5bdd 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy @@ -3,6 +3,7 @@ package datadog.trace.civisibility.domain import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config import datadog.trace.api.DDSpanTypes +import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.coverage.CoverageProbes @@ -20,7 +21,7 @@ import datadog.trace.civisibility.test.ExecutionResults import datadog.trace.civisibility.utils.SpanUtils class TestImplTest extends SpanWriterTest { - def "test span is generated"() { + def "test span is generated and tags populated"() { setup: def test = givenATest() @@ -33,6 +34,9 @@ class TestImplTest extends SpanWriterTest { span(0) { parent() spanType DDSpanTypes.TEST + tags(false) { + "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true + } } } }) @@ -84,8 +88,7 @@ class TestImplTest extends SpanWriterTest { 0 * coverageStore.report(_, _, _) } - private TestImpl givenATest( - CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { + private TestImpl givenATest(CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { def traceId = Stub(DDTraceId) traceId.toLong() >> 123 @@ -95,8 +98,10 @@ class TestImplTest extends SpanWriterTest { moduleSpanContext.getTraceId() >> traceId def suiteId = 789 + def config = Spy(Config.get()) + config.isServiceNameSetByUser() >> true + def testFramework = TestFrameworkInstrumentation.OTHER - def config = Config.get() def metricCollector = Stub(CiVisibilityMetricCollectorImpl) def executionResults = Stub(ExecutionResults) def testDecorator = new TestDecoratorImpl("component", "session-name", "test-command", [:]) diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy index 2acfcc0dc79..1ebbf52d95b 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy @@ -3,6 +3,7 @@ package datadog.trace.civisibility.domain import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config import datadog.trace.api.DDSpanTypes +import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.civisibility.coverage.CoverageStore import datadog.trace.api.civisibility.coverage.NoOpCoverageStore @@ -34,6 +35,7 @@ class TestSuiteImplTest extends SpanWriterTest { "$Tags.TEST_CODEOWNERS" "[\"@global-owner1\",\"@global-owner2\"]" "$Tags.TEST_SOURCE_START" 10 "$Tags.TEST_SOURCE_END" 20 + "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true } } } @@ -42,8 +44,7 @@ class TestSuiteImplTest extends SpanWriterTest { private static final class MyClass {} - private TestSuiteImpl givenATestSuite( - CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { + private TestSuiteImpl givenATestSuite(CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { def traceId = Stub(DDTraceId) traceId.toLong() >> 123 @@ -51,8 +52,10 @@ class TestSuiteImplTest extends SpanWriterTest { moduleSpanContext.getSpanId() >> 456 moduleSpanContext.getTraceId() >> traceId + def config = Spy(Config.get()) + config.isServiceNameSetByUser() >> true + def testFramework = TestFrameworkInstrumentation.OTHER - def config = Config.get() def metricCollector = Stub(CiVisibilityMetricCollectorImpl) def executionResults = Stub(ExecutionResults) def testDecorator = new TestDecoratorImpl("component", "session-name", "test-command", [:]) diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy index 4daf9dc7c44..b11ec288cf9 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy @@ -1,6 +1,9 @@ package datadog.trace.civisibility.domain.headless +import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config +import datadog.trace.api.DDSpanTypes +import datadog.trace.api.DDTags import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.config.TestSourceData import datadog.trace.api.civisibility.coverage.CoverageStore @@ -10,14 +13,58 @@ import datadog.trace.civisibility.codeowners.Codeowners import datadog.trace.civisibility.config.EarlyFlakeDetectionSettings import datadog.trace.civisibility.config.ExecutionSettings import datadog.trace.civisibility.decorator.TestDecorator +import datadog.trace.civisibility.domain.SpanWriterTest import datadog.trace.civisibility.source.LinesResolver import datadog.trace.civisibility.source.SourcePathResolver import datadog.trace.civisibility.test.ExecutionStrategy -import datadog.trace.test.util.DDSpecification -class HeadlessTestModuleTest extends DDSpecification { +class HeadlessTestModuleTest extends SpanWriterTest { + def "test module span is created and tags populated"() { + setup: + def headlessTestModule = givenAHeadlessTestModule() + + when: + headlessTestModule.end(null) + + then: + ListWriterAssert.assertTraces(TEST_WRITER, 1, false, { + trace(1) { + span(0) { + spanType DDSpanTypes.TEST_MODULE_END + tags(false) { + "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true + } + } + } + }) + } def "test total retries limit is applied across test cases"() { + given: + def headlessTestModule = givenAHeadlessTestModule() + + when: + def retryPolicy1 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-1", null), TestSourceData.UNKNOWN) + + then: + retryPolicy1.retry(false, 1L) // 2nd test execution, 1st retry globally + !retryPolicy1.retry(false, 1L) // asking for 3rd test execution - local limit reached + + when: + def retryPolicy2 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-2", null), TestSourceData.UNKNOWN) + + then: + retryPolicy2.retry(false, 1L) // 2nd test execution, 2nd retry globally (since previous test was retried too) + !retryPolicy2.retry(false, 1L) // asking for 3rd test execution - local limit reached + + when: + def retryPolicy3 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-3", null), TestSourceData.UNKNOWN) + + then: + !retryPolicy3.retry(false, 1L) // asking for 3rd retry globally - global limit reached + } + + private HeadlessTestModule givenAHeadlessTestModule() { def executionSettings = Stub(ExecutionSettings) executionSettings.getEarlyFlakeDetectionSettings() >> EarlyFlakeDetectionSettings.DEFAULT executionSettings.isFlakyTestRetriesEnabled() >> true @@ -28,11 +75,11 @@ class HeadlessTestModuleTest extends DDSpecification { // this counts all executions of a test case (first attempt is counted too) config.getCiVisibilityTotalFlakyRetryCount() >> 2 // this counts retries across all tests (first attempt is not a retry, so it is not counted) + config.isServiceNameSetByUser() >> true def executionStrategy = new ExecutionStrategy(config, executionSettings, Stub(SourcePathResolver), Stub(LinesResolver)) - given: - def headlessTestModule = new HeadlessTestModule( + new HeadlessTestModule( Stub(AgentSpanContext), "test-module", null, @@ -46,27 +93,5 @@ class HeadlessTestModuleTest extends DDSpecification { executionStrategy, (span) -> { } ) - - when: - def retryPolicy1 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-1", null), TestSourceData.UNKNOWN) - - then: - retryPolicy1.retry(false, 1L) // 2nd test execution, 1st retry globally - !retryPolicy1.retry(false, 1L) // asking for 3rd test execution - local limit reached - - when: - def retryPolicy2 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-2", null), TestSourceData.UNKNOWN) - - then: - retryPolicy2.retry(false, 1L) // 2nd test execution, 2nd retry globally (since previous test was retried too) - !retryPolicy2.retry(false, 1L) // asking for 3rd test execution - local limit reached - - when: - def retryPolicy3 = headlessTestModule.retryPolicy(new TestIdentifier("suite", "test-3", null), TestSourceData.UNKNOWN) - - then: - !retryPolicy3.retry(false, 1L) // asking for 3rd retry globally - global limit reached } - - } diff --git a/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java b/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java index 49dc624feb2..4f4ae6813c3 100644 --- a/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java +++ b/dd-trace-api/src/main/java/datadog/trace/api/DDTags.java @@ -58,6 +58,7 @@ public class DDTags { public static final String LIBRARY_VERSION_TAG_KEY = "library_version"; public static final String CI_ENV_VARS = "_dd.ci.env_vars"; public static final String CI_ITR_TESTS_SKIPPED = "_dd.ci.itr.tests_skipped"; + public static final String TEST_IS_USER_PROVIDED_SERVICE = "_dd.test.is_user_provided_service"; public static final String MEASURED = "_dd.measured"; public static final String PID_TAG = "process_id"; public static final String SCHEMA_VERSION_TAG_KEY = "_dd.trace_span_attribute_schema"; diff --git a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java index b2ed0bffebf..3e6a4ce3ab5 100644 --- a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java +++ b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java @@ -7,6 +7,7 @@ import datadog.communication.serialization.GrowableBuffer; import datadog.communication.serialization.Writable; import datadog.communication.serialization.msgpack.MsgPackWriter; +import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.civisibility.CiVisibilityWellKnownTags; import datadog.trace.api.civisibility.InstrumentationBridge; @@ -41,6 +42,8 @@ public class CiTestCycleMapperV1 implements RemoteMapper { Tags.TEST_SESSION_ID.getBytes(StandardCharsets.UTF_8); private static final byte[] TEST_MODULE_ID = Tags.TEST_MODULE_ID.getBytes(StandardCharsets.UTF_8); private static final byte[] TEST_SUITE_ID = Tags.TEST_SUITE_ID.getBytes(StandardCharsets.UTF_8); + private static final byte[] TEST_IS_USER_PROVIDED_SERVICE = + DDTags.TEST_IS_USER_PROVIDED_SERVICE.getBytes(StandardCharsets.UTF_8); private static final byte[] ITR_CORRELATION_ID = Tags.ITR_CORRELATION_ID.getBytes(StandardCharsets.UTF_8); @@ -89,6 +92,9 @@ public void map(List> trace, Writable writable) { Number testSuiteId = span.getTag(Tags.TEST_SUITE_ID); span.removeTag(Tags.TEST_SUITE_ID); + Boolean testIsUserProvidedService = span.getTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE); + span.removeTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE); + String itrCorrelationId = span.getTag(Tags.ITR_CORRELATION_ID); span.removeTag(Tags.ITR_CORRELATION_ID); @@ -102,6 +108,9 @@ public void map(List> trace, Writable writable) { if (testSuiteId != null) { topLevelTagsCount++; } + if (testIsUserProvidedService != null) { + topLevelTagsCount++; + } if (itrCorrelationId != null) { topLevelTagsCount++; } @@ -193,6 +202,10 @@ public void map(List> trace, Writable writable) { writable.writeUTF8(TEST_SUITE_ID); writable.writeObject(testSuiteId, null); } + if (testIsUserProvidedService != null) { + writable.writeUTF8(TEST_IS_USER_PROVIDED_SERVICE); + writable.writeObject(testIsUserProvidedService, null); + } if (itrCorrelationId != null) { writable.writeUTF8(ITR_CORRELATION_ID); writable.writeObjectString(itrCorrelationId, null); diff --git a/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy index 0e209201158..6716522253e 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import datadog.communication.serialization.ByteBufferConsumer import datadog.communication.serialization.FlushingBuffer import datadog.communication.serialization.msgpack.MsgPackWriter +import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.civisibility.CiVisibilityWellKnownTags import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes @@ -89,19 +90,20 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { 100 << 10 | 1000 | false } - def "verify test_suite_id, test_module_id, and test_session_id are written as top level tags in test event"() { + def "verify test_suite_id, test_module_id, test_session_id, and _dd.test.is_user_provided_service are written as top level tags in test event"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST, [ - (Tags.TEST_SESSION_ID): DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, - (Tags.TEST_SUITE_ID) : 789 + (Tags.TEST_SESSION_ID) : DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SUITE_ID) : 789, + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789, true) def spanContent = (Map) deserializedSpan.get("content") assert spanContent.containsKey("trace_id") @@ -112,16 +114,17 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def "verify test_suite_end event is written correctly"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST_SUITE_END, [ - (Tags.TEST_SESSION_ID): DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, - (Tags.TEST_SUITE_ID) : 789 + (Tags.TEST_SESSION_ID) : DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SUITE_ID) : 789, + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789, true) def spanContent = (Map) deserializedSpan.get("content") assert !spanContent.containsKey("trace_id") @@ -132,15 +135,16 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def "verify test_module_end event is written correctly"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST_MODULE_END, [ - (Tags.TEST_SESSION_ID): DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SESSION_ID) : DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, null) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, null, true) def spanContent = (Map) deserializedSpan.get("content") assert !spanContent.containsKey("trace_id") @@ -148,7 +152,7 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { assert !spanContent.containsKey("parent_id") } - private static void verifyTopLevelTags(Map deserializedSpan, DDTraceId testSessionId, Long testModuleId, Long testSuiteId) { + private static void verifyTopLevelTags(Map deserializedSpan, DDTraceId testSessionId, Long testModuleId, Long testSuiteId, Boolean testIsUserProvidedService) { Map deserializedSpanContent = (Map) deserializedSpan.get("content") Map deserializedMetrics = (Map) deserializedSpanContent.get("metrics") Map deserializedMeta = (Map) deserializedSpanContent.get("meta") @@ -171,13 +175,21 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { assert !deserializedSpanContent.containsKey(Tags.TEST_SUITE_ID) } + if (testIsUserProvidedService != null) { + assert deserializedSpanContent.get(DDTags.TEST_IS_USER_PROVIDED_SERVICE) == testIsUserProvidedService + } else { + assert !deserializedSpanContent.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) + } + assert !deserializedMetrics.containsKey(Tags.TEST_SESSION_ID) assert !deserializedMetrics.containsKey(Tags.TEST_MODULE_ID) assert !deserializedMetrics.containsKey(Tags.TEST_SUITE_ID) + assert !deserializedMetrics.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) assert !deserializedMeta.containsKey(Tags.TEST_SESSION_ID) assert !deserializedMeta.containsKey(Tags.TEST_MODULE_ID) assert !deserializedMeta.containsKey(Tags.TEST_SUITE_ID) + assert !deserializedMeta.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) } private static Map whenASpanIsWritten(TraceGenerator.PojoSpan span) { From 7c17def677a3ba7488d057210904da67fb062871 Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Fri, 31 Jan 2025 12:52:31 +0100 Subject: [PATCH 2/3] move is_user_provided_service tag to payload header --- .../domain/AbstractTestModule.java | 3 - .../domain/AbstractTestSession.java | 3 - .../trace/civisibility/domain/TestImpl.java | 3 - .../civisibility/domain/TestSuiteImpl.java | 3 - .../civisibility/domain/TestImplTest.groovy | 19 ++-- .../domain/TestSuiteImplTest.groovy | 9 +- .../headless/HeadlessTestModuleTest.groovy | 24 ----- .../CiVisibilityApmProtocolInterceptor.java | 4 + .../writer/ddintake/CiTestCycleMapperV1.java | 15 +--- .../CiTestCycleMapperV1PayloadTest.groovy | 29 +++--- .../writer/DDIntakeWriterCombinedTest.groovy | 2 +- .../writer/ddintake/DDEvpProxyApiTest.groovy | 89 ++++++++++--------- .../writer/ddintake/DDIntakeApiTest.groovy | 81 +++++++++-------- .../main/java/datadog/trace/api/Config.java | 3 +- .../CiVisibilityWellKnownTags.java | 9 +- 15 files changed, 128 insertions(+), 168 deletions(-) diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java index a9ae2e6a582..18f383106bd 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestModule.java @@ -3,7 +3,6 @@ import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME; import datadog.trace.api.Config; -import datadog.trace.api.DDTags; import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector; import datadog.trace.api.civisibility.telemetry.tag.EventType; @@ -73,8 +72,6 @@ public AbstractTestModule( span.setTag(Tags.TEST_MODULE_ID, span.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, span.getTraceId()); - span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); - // setting status to skip initially, // as we do not know in advance whether the module will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java index 55b9a675dd8..90681d6a02e 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/AbstractTestSession.java @@ -4,7 +4,6 @@ import static datadog.trace.api.civisibility.CIConstants.CI_VISIBILITY_INSTRUMENTATION_NAME; import datadog.trace.api.Config; -import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.IdGenerationStrategy; import datadog.trace.api.civisibility.CIConstants; @@ -98,8 +97,6 @@ public AbstractTestSession( span.setTag(Tags.SPAN_KIND, Tags.SPAN_KIND_TEST_SESSION); span.setTag(Tags.TEST_SESSION_ID, span.getTraceId()); - span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); - // setting status to skip initially, // as we do not know in advance whether the session will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java index 52a8f479990..65dcfbfa04d 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestImpl.java @@ -5,7 +5,6 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import datadog.trace.api.Config; -import datadog.trace.api.DDTags; import datadog.trace.api.DDTraceId; import datadog.trace.api.civisibility.CIConstants; import datadog.trace.api.civisibility.DDTest; @@ -125,8 +124,6 @@ public TestImpl( span.setTag(Tags.TEST_MODULE_ID, moduleSpanContext.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, moduleSpanContext.getTraceId()); - span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); - span.setTag(Tags.TEST_STATUS, TestStatus.pass); if (testClass != null && !testClass.getName().equals(testSuiteName)) { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java index e2681daace9..024f77f0b4d 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/domain/TestSuiteImpl.java @@ -5,7 +5,6 @@ import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import datadog.trace.api.Config; -import datadog.trace.api.DDTags; import datadog.trace.api.civisibility.DDTestSuite; import datadog.trace.api.civisibility.coverage.CoverageStore; import datadog.trace.api.civisibility.telemetry.CiVisibilityCountMetric; @@ -114,8 +113,6 @@ public TestSuiteImpl( span.setTag(Tags.TEST_MODULE_ID, moduleSpanContext.getSpanId()); span.setTag(Tags.TEST_SESSION_ID, moduleSpanContext.getTraceId()); - span.setTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE, config.isServiceNameSetByUser()); - // setting status to skip initially, // as we do not know in advance whether the suite will have any children span.setTag(Tags.TEST_STATUS, TestStatus.skip); diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy index 9c4580d5bdd..eed93706371 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestImplTest.groovy @@ -3,7 +3,6 @@ package datadog.trace.civisibility.domain import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config import datadog.trace.api.DDSpanTypes -import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.coverage.CoverageProbes @@ -21,7 +20,7 @@ import datadog.trace.civisibility.test.ExecutionResults import datadog.trace.civisibility.utils.SpanUtils class TestImplTest extends SpanWriterTest { - def "test span is generated and tags populated"() { + def "test span is generated"() { setup: def test = givenATest() @@ -34,9 +33,6 @@ class TestImplTest extends SpanWriterTest { span(0) { parent() spanType DDSpanTypes.TEST - tags(false) { - "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true - } } } }) @@ -75,10 +71,10 @@ class TestImplTest extends SpanWriterTest { def coverageStore = Mock(CoverageStore) coverageStore.getProbes() >> coverageProbes - def coveageStoreFactory = Stub(CoverageStore.Factory) - coveageStoreFactory.create((TestIdentifier) _) >> coverageStore + def coverageStoreFactory = Stub(CoverageStore.Factory) + coverageStoreFactory.create((TestIdentifier) _) >> coverageStore - def test = givenATest(coveageStoreFactory) + def test = givenATest(coverageStoreFactory) when: test.setSkipReason("skipped") @@ -88,7 +84,8 @@ class TestImplTest extends SpanWriterTest { 0 * coverageStore.report(_, _, _) } - private TestImpl givenATest(CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { + private TestImpl givenATest( + CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { def traceId = Stub(DDTraceId) traceId.toLong() >> 123 @@ -98,10 +95,8 @@ class TestImplTest extends SpanWriterTest { moduleSpanContext.getTraceId() >> traceId def suiteId = 789 - def config = Spy(Config.get()) - config.isServiceNameSetByUser() >> true - def testFramework = TestFrameworkInstrumentation.OTHER + def config = Config.get() def metricCollector = Stub(CiVisibilityMetricCollectorImpl) def executionResults = Stub(ExecutionResults) def testDecorator = new TestDecoratorImpl("component", "session-name", "test-command", [:]) diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy index 1ebbf52d95b..2acfcc0dc79 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/TestSuiteImplTest.groovy @@ -3,7 +3,6 @@ package datadog.trace.civisibility.domain import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config import datadog.trace.api.DDSpanTypes -import datadog.trace.api.DDTags import datadog.trace.api.DDTraceId import datadog.trace.api.civisibility.coverage.CoverageStore import datadog.trace.api.civisibility.coverage.NoOpCoverageStore @@ -35,7 +34,6 @@ class TestSuiteImplTest extends SpanWriterTest { "$Tags.TEST_CODEOWNERS" "[\"@global-owner1\",\"@global-owner2\"]" "$Tags.TEST_SOURCE_START" 10 "$Tags.TEST_SOURCE_END" 20 - "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true } } } @@ -44,7 +42,8 @@ class TestSuiteImplTest extends SpanWriterTest { private static final class MyClass {} - private TestSuiteImpl givenATestSuite(CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { + private TestSuiteImpl givenATestSuite( + CoverageStore.Factory coverageStoreFactory = new NoOpCoverageStore.Factory()) { def traceId = Stub(DDTraceId) traceId.toLong() >> 123 @@ -52,10 +51,8 @@ class TestSuiteImplTest extends SpanWriterTest { moduleSpanContext.getSpanId() >> 456 moduleSpanContext.getTraceId() >> traceId - def config = Spy(Config.get()) - config.isServiceNameSetByUser() >> true - def testFramework = TestFrameworkInstrumentation.OTHER + def config = Config.get() def metricCollector = Stub(CiVisibilityMetricCollectorImpl) def executionResults = Stub(ExecutionResults) def testDecorator = new TestDecoratorImpl("component", "session-name", "test-command", [:]) diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy index b11ec288cf9..2e2d9256fa0 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/domain/headless/HeadlessTestModuleTest.groovy @@ -1,9 +1,6 @@ package datadog.trace.civisibility.domain.headless -import datadog.trace.agent.test.asserts.ListWriterAssert import datadog.trace.api.Config -import datadog.trace.api.DDSpanTypes -import datadog.trace.api.DDTags import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.config.TestSourceData import datadog.trace.api.civisibility.coverage.CoverageStore @@ -19,26 +16,6 @@ import datadog.trace.civisibility.source.SourcePathResolver import datadog.trace.civisibility.test.ExecutionStrategy class HeadlessTestModuleTest extends SpanWriterTest { - def "test module span is created and tags populated"() { - setup: - def headlessTestModule = givenAHeadlessTestModule() - - when: - headlessTestModule.end(null) - - then: - ListWriterAssert.assertTraces(TEST_WRITER, 1, false, { - trace(1) { - span(0) { - spanType DDSpanTypes.TEST_MODULE_END - tags(false) { - "$DDTags.TEST_IS_USER_PROVIDED_SERVICE" true - } - } - } - }) - } - def "test total retries limit is applied across test cases"() { given: def headlessTestModule = givenAHeadlessTestModule() @@ -75,7 +52,6 @@ class HeadlessTestModuleTest extends SpanWriterTest { // this counts all executions of a test case (first attempt is counted too) config.getCiVisibilityTotalFlakyRetryCount() >> 2 // this counts retries across all tests (first attempt is not a retry, so it is not counted) - config.isServiceNameSetByUser() >> true def executionStrategy = new ExecutionStrategy(config, executionSettings, Stub(SourcePathResolver), Stub(LinesResolver)) diff --git a/dd-trace-core/src/main/java/datadog/trace/civisibility/interceptor/CiVisibilityApmProtocolInterceptor.java b/dd-trace-core/src/main/java/datadog/trace/civisibility/interceptor/CiVisibilityApmProtocolInterceptor.java index 2fa53ed0fd7..0481269895f 100644 --- a/dd-trace-core/src/main/java/datadog/trace/civisibility/interceptor/CiVisibilityApmProtocolInterceptor.java +++ b/dd-trace-core/src/main/java/datadog/trace/civisibility/interceptor/CiVisibilityApmProtocolInterceptor.java @@ -2,6 +2,7 @@ import datadog.trace.api.Config; import datadog.trace.api.DDSpanTypes; +import datadog.trace.api.DDTags; import datadog.trace.api.civisibility.CiVisibilityWellKnownTags; import datadog.trace.api.interceptor.AbstractTraceInterceptor; import datadog.trace.api.interceptor.MutableSpan; @@ -47,6 +48,9 @@ public Collection onTraceComplete( span.setTag(Tags.OS_ARCHITECTURE, wellKnownTags.getOsArch().toString()); span.setTag(Tags.OS_PLATFORM, wellKnownTags.getOsPlatform().toString()); span.setTag(Tags.OS_VERSION, wellKnownTags.getOsVersion().toString()); + span.setTag( + DDTags.TEST_IS_USER_PROVIDED_SERVICE, + wellKnownTags.getIsUserProvidedService().toString()); } } return filteredTrace; diff --git a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java index 3e6a4ce3ab5..534282701b7 100644 --- a/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java +++ b/dd-trace-core/src/main/java/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1.java @@ -92,9 +92,6 @@ public void map(List> trace, Writable writable) { Number testSuiteId = span.getTag(Tags.TEST_SUITE_ID); span.removeTag(Tags.TEST_SUITE_ID); - Boolean testIsUserProvidedService = span.getTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE); - span.removeTag(DDTags.TEST_IS_USER_PROVIDED_SERVICE); - String itrCorrelationId = span.getTag(Tags.ITR_CORRELATION_ID); span.removeTag(Tags.ITR_CORRELATION_ID); @@ -108,9 +105,6 @@ public void map(List> trace, Writable writable) { if (testSuiteId != null) { topLevelTagsCount++; } - if (testIsUserProvidedService != null) { - topLevelTagsCount++; - } if (itrCorrelationId != null) { topLevelTagsCount++; } @@ -202,10 +196,6 @@ public void map(List> trace, Writable writable) { writable.writeUTF8(TEST_SUITE_ID); writable.writeObject(testSuiteId, null); } - if (testIsUserProvidedService != null) { - writable.writeUTF8(TEST_IS_USER_PROVIDED_SERVICE); - writable.writeObject(testIsUserProvidedService, null); - } if (itrCorrelationId != null) { writable.writeUTF8(ITR_CORRELATION_ID); writable.writeObjectString(itrCorrelationId, null); @@ -253,7 +243,7 @@ private void writeHeader() { headerWriter.startMap(1); /* 2,1 */ headerWriter.writeUTF8(METADATA_ASTERISK); - headerWriter.startMap(9); + headerWriter.startMap(10); /* 2,1,1 */ headerWriter.writeUTF8(ENV); headerWriter.writeUTF8(wellKnownTags.getEnv()); @@ -281,6 +271,9 @@ private void writeHeader() { /* 2,1,9 */ headerWriter.writeUTF8(OS_VERSION); headerWriter.writeUTF8(wellKnownTags.getOsVersion()); + /* 2,1,10 */ + headerWriter.writeUTF8(TEST_IS_USER_PROVIDED_SERVICE); + headerWriter.writeUTF8(wellKnownTags.getIsUserProvidedService()); /* 3 */ headerWriter.writeUTF8(EVENTS); headerWriter.startArray(eventCount); diff --git a/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy index 6716522253e..87637720a23 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy @@ -48,7 +48,7 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { CiVisibilityWellKnownTags wellKnownTags = new CiVisibilityWellKnownTags( "runtimeid", "my-env", "language", "my-runtime-name", "my-runtime-version", "my-runtime-vendor", - "my-os-arch", "my-os-platform", "my-os-version") + "my-os-arch", "my-os-platform", "my-os-version", "false") CiTestCycleMapperV1 mapper = new CiTestCycleMapperV1(wellKnownTags, false) List> traces = generateRandomTraces(traceCount, lowCardinality) @@ -90,20 +90,19 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { 100 << 10 | 1000 | false } - def "verify test_suite_id, test_module_id, test_session_id, and _dd.test.is_user_provided_service are written as top level tags in test event"() { + def "verify test_suite_id, test_module_id, and test_session_id are written as top level tags in test event"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST, [ (Tags.TEST_SESSION_ID) : DDTraceId.from(123), (Tags.TEST_MODULE_ID) : 456, (Tags.TEST_SUITE_ID) : 789, - (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789, true) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789) def spanContent = (Map) deserializedSpan.get("content") assert spanContent.containsKey("trace_id") @@ -117,14 +116,13 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { (Tags.TEST_SESSION_ID) : DDTraceId.from(123), (Tags.TEST_MODULE_ID) : 456, (Tags.TEST_SUITE_ID) : 789, - (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789, true) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, 789) def spanContent = (Map) deserializedSpan.get("content") assert !spanContent.containsKey("trace_id") @@ -137,14 +135,13 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def span = generateRandomSpan(InternalSpanTypes.TEST_MODULE_END, [ (Tags.TEST_SESSION_ID) : DDTraceId.from(123), (Tags.TEST_MODULE_ID) : 456, - (DDTags.TEST_IS_USER_PROVIDED_SERVICE): true, ]) when: Map deserializedSpan = whenASpanIsWritten(span) then: - verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, null, true) + verifyTopLevelTags(deserializedSpan, DDTraceId.from(123), 456, null) def spanContent = (Map) deserializedSpan.get("content") assert !spanContent.containsKey("trace_id") @@ -152,7 +149,7 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { assert !spanContent.containsKey("parent_id") } - private static void verifyTopLevelTags(Map deserializedSpan, DDTraceId testSessionId, Long testModuleId, Long testSuiteId, Boolean testIsUserProvidedService) { + private static void verifyTopLevelTags(Map deserializedSpan, DDTraceId testSessionId, Long testModuleId, Long testSuiteId) { Map deserializedSpanContent = (Map) deserializedSpan.get("content") Map deserializedMetrics = (Map) deserializedSpanContent.get("metrics") Map deserializedMeta = (Map) deserializedSpanContent.get("meta") @@ -175,21 +172,13 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { assert !deserializedSpanContent.containsKey(Tags.TEST_SUITE_ID) } - if (testIsUserProvidedService != null) { - assert deserializedSpanContent.get(DDTags.TEST_IS_USER_PROVIDED_SERVICE) == testIsUserProvidedService - } else { - assert !deserializedSpanContent.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) - } - assert !deserializedMetrics.containsKey(Tags.TEST_SESSION_ID) assert !deserializedMetrics.containsKey(Tags.TEST_MODULE_ID) assert !deserializedMetrics.containsKey(Tags.TEST_SUITE_ID) - assert !deserializedMetrics.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) assert !deserializedMeta.containsKey(Tags.TEST_SESSION_ID) assert !deserializedMeta.containsKey(Tags.TEST_MODULE_ID) assert !deserializedMeta.containsKey(Tags.TEST_SUITE_ID) - assert !deserializedMeta.containsKey(DDTags.TEST_IS_USER_PROVIDED_SERVICE) } private static Map whenASpanIsWritten(TraceGenerator.PojoSpan span) { @@ -198,7 +187,7 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { CiVisibilityWellKnownTags wellKnownTags = new CiVisibilityWellKnownTags( "runtimeid", "my-env", "language", "my-runtime-name", "my-runtime-version", "my-runtime-vendor", - "my-os-arch", "my-os-platform", "my-os-version") + "my-os-arch", "my-os-platform", "my-os-version", "false") CiTestCycleMapperV1 mapper = new CiTestCycleMapperV1(wellKnownTags, false) ByteBufferConsumer consumer = new CaptureConsumer() @@ -263,7 +252,7 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { assertEquals(1, unpacker.unpackMapHeader()) assertEquals("*", unpacker.unpackString()) - assertEquals(9, unpacker.unpackMapHeader()) + assertEquals(10, unpacker.unpackMapHeader()) assertEquals("env", unpacker.unpackString()) assertEquals(wellKnownTags.env as String, unpacker.unpackString()) assertEquals("runtime-id", unpacker.unpackString()) @@ -282,6 +271,8 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { assertEquals(wellKnownTags.osPlatform as String, unpacker.unpackString()) assertEquals(Tags.OS_VERSION, unpacker.unpackString()) assertEquals(wellKnownTags.osVersion as String, unpacker.unpackString()) + assertEquals(DDTags.TEST_IS_USER_PROVIDED_SERVICE, unpacker.unpackString()) + assertEquals(wellKnownTags.isUserProvidedService as String, unpacker.unpackString()) assertEquals("events", unpacker.unpackString()) diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterCombinedTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterCombinedTest.groovy index e8cde931a4b..e47daa6919b 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterCombinedTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/DDIntakeWriterCombinedTest.groovy @@ -46,7 +46,7 @@ class DDIntakeWriterCombinedTest extends DDCoreSpecification { def wellKnownTags = new CiVisibilityWellKnownTags( "my-runtime-id", "my-env", "my-language", "my-runtime-name", "my-runtime-version", "my-runtime-vendor", - "my-os-arch", "my-os-platform", "my-os-version") + "my-os-arch", "my-os-platform", "my-os-version", "false") def conditions = new PollingConditions(timeout: 5, initialDelay: 0, factor: 1.25) def monitoring = new MonitoringImpl(StatsDClient.NO_OP, 1, TimeUnit.SECONDS) diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddintake/DDEvpProxyApiTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddintake/DDEvpProxyApiTest.groovy index bf8a07a5db8..4c9d64be2e6 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddintake/DDEvpProxyApiTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddintake/DDEvpProxyApiTest.groovy @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import datadog.communication.serialization.ByteBufferConsumer import datadog.communication.serialization.FlushingBuffer import datadog.communication.serialization.msgpack.MsgPackWriter +import datadog.trace.api.DDTags import datadog.trace.api.civisibility.CiVisibilityWellKnownTags import datadog.trace.api.intake.TrackType import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes @@ -30,7 +31,7 @@ class DDEvpProxyApiTest extends DDCoreSpecification { static CiVisibilityWellKnownTags wellKnownTags = new CiVisibilityWellKnownTags( "my-runtime-id", "my-env", "my-language", "my-runtime-name", "my-runtime-version", "my-runtime-vendor", - "my-os-arch", "my-os-platform", "my-os-version") + "my-os-arch", "my-os-platform", "my-os-version", "false") static String intakeSubdomain = "citestcycle-intake" static msgPackMapper = new ObjectMapper(new MessagePackFactory()) @@ -131,21 +132,22 @@ class DDEvpProxyApiTest extends DDCoreSpecification { where: // spotless:off trackType | apiVersion | evpProxyEndpoint | compressionEnabled | traces | expectedRequestBody - TrackType.CITESTCYCLE | "v2" | V2_EVP_PROXY_ENDPOINT | false | [] | [:] + TrackType.CITESTCYCLE | "v2" | V2_EVP_PROXY_ENDPOINT | false | [] | [:] - TrackType.CITESTCYCLE | "v2" | V2_EVP_PROXY_ENDPOINT | false | [[buildSpan(1L, "fakeType", ["service.name": "my-service"])]] | new TreeMap<>([ + TrackType.CITESTCYCLE | "v2" | V2_EVP_PROXY_ENDPOINT | false | [[buildSpan(1L, "fakeType", ["service.name": "my-service"])]] | new TreeMap<>([ "version" : 1, "metadata": new TreeMap<>([ "*": new TreeMap<>([ - "env" : "my-env", - "runtime-id" : "my-runtime-id", - "language" : "my-language", - (Tags.RUNTIME_NAME) : "my-runtime-name", - (Tags.RUNTIME_VERSION): "my-runtime-version", - (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", - (Tags.OS_ARCHITECTURE): "my-os-arch", - (Tags.OS_PLATFORM) : "my-os-platform", - (Tags.OS_VERSION) : "my-os-version" + "env" : "my-env", + "runtime-id" : "my-runtime-id", + "language" : "my-language", + (Tags.RUNTIME_NAME) : "my-runtime-name", + (Tags.RUNTIME_VERSION) : "my-runtime-version", + (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", + (Tags.OS_ARCHITECTURE) : "my-os-arch", + (Tags.OS_PLATFORM) : "my-os-platform", + (Tags.OS_VERSION) : "my-os-version", + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): "false" ])]), "events" : [new TreeMap<>([ "type" : "span", @@ -165,19 +167,20 @@ class DDEvpProxyApiTest extends DDCoreSpecification { ]) ])] ]) - TrackType.CITESTCYCLE | "v2" | V2_EVP_PROXY_ENDPOINT | false | [[buildSpan(1L, InternalSpanTypes.TEST, ["test_suite_id": 123L, "test_module_id": 456L])]] | new TreeMap<>([ + TrackType.CITESTCYCLE | "v2" | V2_EVP_PROXY_ENDPOINT | false | [[buildSpan(1L, InternalSpanTypes.TEST, ["test_suite_id": 123L, "test_module_id": 456L])]] | new TreeMap<>([ "version" : 1, "metadata": new TreeMap<>([ "*": new TreeMap<>([ - "env" : "my-env", - "runtime-id": "my-runtime-id", - "language" : "my-language", - (Tags.RUNTIME_NAME): "my-runtime-name", - (Tags.RUNTIME_VERSION): "my-runtime-version", - (Tags.RUNTIME_VENDOR): "my-runtime-vendor", - (Tags.OS_ARCHITECTURE): "my-os-arch", - (Tags.OS_PLATFORM): "my-os-platform", - (Tags.OS_VERSION): "my-os-version" + "env" : "my-env", + "runtime-id" : "my-runtime-id", + "language" : "my-language", + (Tags.RUNTIME_NAME) : "my-runtime-name", + (Tags.RUNTIME_VERSION) : "my-runtime-version", + (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", + (Tags.OS_ARCHITECTURE) : "my-os-arch", + (Tags.OS_PLATFORM) : "my-os-platform", + (Tags.OS_VERSION) : "my-os-version", + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): "false" ])]), "events" : [new TreeMap<>([ "type" : "test", @@ -199,19 +202,20 @@ class DDEvpProxyApiTest extends DDCoreSpecification { ]) ])] ]) - TrackType.CITESTCYCLE | "v2" | V2_EVP_PROXY_ENDPOINT | false | [[buildSpan(1L, InternalSpanTypes.TEST_SUITE_END, ["test_suite_id": 123L, "test_module_id": 456L])]] | new TreeMap<>([ + TrackType.CITESTCYCLE | "v2" | V2_EVP_PROXY_ENDPOINT | false | [[buildSpan(1L, InternalSpanTypes.TEST_SUITE_END, ["test_suite_id": 123L, "test_module_id": 456L])]] | new TreeMap<>([ "version" : 1, "metadata": new TreeMap<>([ "*": new TreeMap<>([ - "env" : "my-env", - "runtime-id": "my-runtime-id", - "language" : "my-language", - (Tags.RUNTIME_NAME): "my-runtime-name", - (Tags.RUNTIME_VERSION): "my-runtime-version", - (Tags.RUNTIME_VENDOR): "my-runtime-vendor", - (Tags.OS_ARCHITECTURE): "my-os-arch", - (Tags.OS_PLATFORM): "my-os-platform", - (Tags.OS_VERSION): "my-os-version" + "env" : "my-env", + "runtime-id" : "my-runtime-id", + "language" : "my-language", + (Tags.RUNTIME_NAME) : "my-runtime-name", + (Tags.RUNTIME_VERSION) : "my-runtime-version", + (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", + (Tags.OS_ARCHITECTURE) : "my-os-arch", + (Tags.OS_PLATFORM) : "my-os-platform", + (Tags.OS_VERSION) : "my-os-version", + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): "false" ])]), "events" : [new TreeMap<>([ "type" : "test_suite_end", @@ -230,19 +234,20 @@ class DDEvpProxyApiTest extends DDCoreSpecification { ]) ])] ]) - TrackType.CITESTCYCLE | "v2" | V4_EVP_PROXY_ENDPOINT | true | [[buildSpan(1L, InternalSpanTypes.TEST_MODULE_END, ["test_module_id": 456L])]] | new TreeMap<>([ + TrackType.CITESTCYCLE | "v2" | V4_EVP_PROXY_ENDPOINT | true | [[buildSpan(1L, InternalSpanTypes.TEST_MODULE_END, ["test_module_id": 456L])]] | new TreeMap<>([ "version" : 1, "metadata": new TreeMap<>([ "*": new TreeMap<>([ - "env" : "my-env", - "runtime-id": "my-runtime-id", - "language" : "my-language", - (Tags.RUNTIME_NAME): "my-runtime-name", - (Tags.RUNTIME_VERSION): "my-runtime-version", - (Tags.RUNTIME_VENDOR): "my-runtime-vendor", - (Tags.OS_ARCHITECTURE): "my-os-arch", - (Tags.OS_PLATFORM): "my-os-platform", - (Tags.OS_VERSION): "my-os-version" + "env" : "my-env", + "runtime-id" : "my-runtime-id", + "language" : "my-language", + (Tags.RUNTIME_NAME) : "my-runtime-name", + (Tags.RUNTIME_VERSION) : "my-runtime-version", + (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", + (Tags.OS_ARCHITECTURE) : "my-os-arch", + (Tags.OS_PLATFORM) : "my-os-platform", + (Tags.OS_VERSION) : "my-os-version", + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): "false" ])]), "events" : [new TreeMap<>([ "type" : "test_module_end", diff --git a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddintake/DDIntakeApiTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddintake/DDIntakeApiTest.groovy index cb7f70571ee..58a9956b46d 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddintake/DDIntakeApiTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/common/writer/ddintake/DDIntakeApiTest.groovy @@ -5,9 +5,8 @@ import com.fasterxml.jackson.databind.ObjectMapper import datadog.communication.serialization.ByteBufferConsumer import datadog.communication.serialization.FlushingBuffer import datadog.communication.serialization.msgpack.MsgPackWriter -import datadog.trace.api.WellKnownTags +import datadog.trace.api.DDTags import datadog.trace.api.civisibility.CiVisibilityWellKnownTags -import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector import datadog.trace.api.intake.TrackType import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes import datadog.trace.bootstrap.instrumentation.api.Tags @@ -30,7 +29,7 @@ class DDIntakeApiTest extends DDCoreSpecification { static CiVisibilityWellKnownTags wellKnownTags = new CiVisibilityWellKnownTags( "my-runtime-id", "my-env", "my-language", "my-runtime-name", "my-runtime-version", "my-runtime-vendor", - "my-os-arch", "my-os-platform", "my-os-version") + "my-os-arch", "my-os-platform", "my-os-version", "false") static String apiKey = "my-secret-apikey" static msgPackMapper = new ObjectMapper(new MessagePackFactory()) @@ -168,15 +167,16 @@ class DDIntakeApiTest extends DDCoreSpecification { "version" : 1, "metadata": new TreeMap<>([ "*": new TreeMap<>([ - "env" : "my-env", - "runtime-id": "my-runtime-id", - "language" : "my-language", - (Tags.RUNTIME_NAME): "my-runtime-name", - (Tags.RUNTIME_VERSION): "my-runtime-version", - (Tags.RUNTIME_VENDOR): "my-runtime-vendor", - (Tags.OS_ARCHITECTURE): "my-os-arch", - (Tags.OS_PLATFORM): "my-os-platform", - (Tags.OS_VERSION): "my-os-version" + "env" : "my-env", + "runtime-id" : "my-runtime-id", + "language" : "my-language", + (Tags.RUNTIME_NAME) : "my-runtime-name", + (Tags.RUNTIME_VERSION) : "my-runtime-version", + (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", + (Tags.OS_ARCHITECTURE) : "my-os-arch", + (Tags.OS_PLATFORM) : "my-os-platform", + (Tags.OS_VERSION) : "my-os-version", + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): "false" ])]), "events" : [new TreeMap<>([ "type" : "span", @@ -200,15 +200,16 @@ class DDIntakeApiTest extends DDCoreSpecification { "version" : 1, "metadata": new TreeMap<>([ "*": new TreeMap<>([ - "env" : "my-env", - "runtime-id": "my-runtime-id", - "language" : "my-language", - (Tags.RUNTIME_NAME): "my-runtime-name", - (Tags.RUNTIME_VERSION): "my-runtime-version", - (Tags.RUNTIME_VENDOR): "my-runtime-vendor", - (Tags.OS_ARCHITECTURE): "my-os-arch", - (Tags.OS_PLATFORM): "my-os-platform", - (Tags.OS_VERSION): "my-os-version" + "env" : "my-env", + "runtime-id" : "my-runtime-id", + "language" : "my-language", + (Tags.RUNTIME_NAME) : "my-runtime-name", + (Tags.RUNTIME_VERSION) : "my-runtime-version", + (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", + (Tags.OS_ARCHITECTURE) : "my-os-arch", + (Tags.OS_PLATFORM) : "my-os-platform", + (Tags.OS_VERSION) : "my-os-version", + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): "false" ])]), "events" : [new TreeMap<>([ "type" : "test", @@ -234,15 +235,16 @@ class DDIntakeApiTest extends DDCoreSpecification { "version" : 1, "metadata": new TreeMap<>([ "*": new TreeMap<>([ - "env" : "my-env", - "runtime-id": "my-runtime-id", - "language" : "my-language", - (Tags.RUNTIME_NAME): "my-runtime-name", - (Tags.RUNTIME_VERSION): "my-runtime-version", - (Tags.RUNTIME_VENDOR): "my-runtime-vendor", - (Tags.OS_ARCHITECTURE): "my-os-arch", - (Tags.OS_PLATFORM): "my-os-platform", - (Tags.OS_VERSION): "my-os-version" + "env" : "my-env", + "runtime-id" : "my-runtime-id", + "language" : "my-language", + (Tags.RUNTIME_NAME) : "my-runtime-name", + (Tags.RUNTIME_VERSION) : "my-runtime-version", + (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", + (Tags.OS_ARCHITECTURE) : "my-os-arch", + (Tags.OS_PLATFORM) : "my-os-platform", + (Tags.OS_VERSION) : "my-os-version", + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): "false" ])]), "events" : [new TreeMap<>([ "type" : "test_suite_end", @@ -265,15 +267,16 @@ class DDIntakeApiTest extends DDCoreSpecification { "version" : 1, "metadata": new TreeMap<>([ "*": new TreeMap<>([ - "env" : "my-env", - "runtime-id": "my-runtime-id", - "language" : "my-language", - (Tags.RUNTIME_NAME): "my-runtime-name", - (Tags.RUNTIME_VERSION): "my-runtime-version", - (Tags.RUNTIME_VENDOR): "my-runtime-vendor", - (Tags.OS_ARCHITECTURE): "my-os-arch", - (Tags.OS_PLATFORM): "my-os-platform", - (Tags.OS_VERSION): "my-os-version" + "env" : "my-env", + "runtime-id" : "my-runtime-id", + "language" : "my-language", + (Tags.RUNTIME_NAME) : "my-runtime-name", + (Tags.RUNTIME_VERSION) : "my-runtime-version", + (Tags.RUNTIME_VENDOR) : "my-runtime-vendor", + (Tags.OS_ARCHITECTURE) : "my-os-arch", + (Tags.OS_PLATFORM) : "my-os-platform", + (Tags.OS_VERSION) : "my-os-version", + (DDTags.TEST_IS_USER_PROVIDED_SERVICE): "false" ])]), "events" : [new TreeMap<>([ "type" : "test_module_end", 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 37da6f30c4a..c366021aa57 100644 --- a/internal-api/src/main/java/datadog/trace/api/Config.java +++ b/internal-api/src/main/java/datadog/trace/api/Config.java @@ -3450,7 +3450,8 @@ public CiVisibilityWellKnownTags getCiVisibilityWellKnownTags() { System.getProperty("java.vendor"), System.getProperty("os.arch"), System.getProperty("os.name"), - System.getProperty("os.version")); + System.getProperty("os.version"), + isServiceNameSetByUser() ? "true" : "false"); } public String getPrimaryTag() { diff --git a/internal-api/src/main/java/datadog/trace/api/civisibility/CiVisibilityWellKnownTags.java b/internal-api/src/main/java/datadog/trace/api/civisibility/CiVisibilityWellKnownTags.java index a5ae623cba2..c51b2a938a7 100644 --- a/internal-api/src/main/java/datadog/trace/api/civisibility/CiVisibilityWellKnownTags.java +++ b/internal-api/src/main/java/datadog/trace/api/civisibility/CiVisibilityWellKnownTags.java @@ -13,6 +13,7 @@ public class CiVisibilityWellKnownTags { private final UTF8BytesString osArch; private final UTF8BytesString osPlatform; private final UTF8BytesString osVersion; + private final UTF8BytesString isUserProvidedService; public CiVisibilityWellKnownTags( CharSequence runtimeId, @@ -23,7 +24,8 @@ public CiVisibilityWellKnownTags( CharSequence runtimeVendor, CharSequence osArch, CharSequence osPlatform, - CharSequence osVersion) { + CharSequence osVersion, + CharSequence isUserProvidedService) { this.runtimeId = UTF8BytesString.create(runtimeId); this.env = UTF8BytesString.create(env); this.language = UTF8BytesString.create(language); @@ -33,6 +35,7 @@ public CiVisibilityWellKnownTags( this.osArch = UTF8BytesString.create(osArch); this.osPlatform = UTF8BytesString.create(osPlatform); this.osVersion = UTF8BytesString.create(osVersion); + this.isUserProvidedService = UTF8BytesString.create(isUserProvidedService); } public UTF8BytesString getEnv() { @@ -70,4 +73,8 @@ public UTF8BytesString getRuntimeVersion() { public UTF8BytesString getRuntimeVendor() { return runtimeVendor; } + + public UTF8BytesString getIsUserProvidedService() { + return isUserProvidedService; + } } From c68fa9d79a6590ddc719b6f554200eb5ad873b7a Mon Sep 17 00:00:00 2001 From: Daniel Mohedano Date: Fri, 31 Jan 2025 12:57:17 +0100 Subject: [PATCH 3/3] format test --- .../CiTestCycleMapperV1PayloadTest.groovy | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy index 87637720a23..98b86f01b3f 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/civisibility/writer/ddintake/CiTestCycleMapperV1PayloadTest.groovy @@ -93,9 +93,9 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def "verify test_suite_id, test_module_id, and test_session_id are written as top level tags in test event"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST, [ - (Tags.TEST_SESSION_ID) : DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, - (Tags.TEST_SUITE_ID) : 789, + (Tags.TEST_SESSION_ID): DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SUITE_ID) : 789, ]) when: @@ -113,9 +113,9 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def "verify test_suite_end event is written correctly"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST_SUITE_END, [ - (Tags.TEST_SESSION_ID) : DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, - (Tags.TEST_SUITE_ID) : 789, + (Tags.TEST_SESSION_ID): DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SUITE_ID) : 789, ]) when: @@ -133,8 +133,8 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def "verify test_module_end event is written correctly"() { setup: def span = generateRandomSpan(InternalSpanTypes.TEST_MODULE_END, [ - (Tags.TEST_SESSION_ID) : DDTraceId.from(123), - (Tags.TEST_MODULE_ID) : 456, + (Tags.TEST_SESSION_ID): DDTraceId.from(123), + (Tags.TEST_MODULE_ID) : 456, ]) when: