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..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 @@ -71,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") 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..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 @@ -10,14 +10,38 @@ 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 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 @@ -31,8 +55,7 @@ class HeadlessTestModuleTest extends DDSpecification { def executionStrategy = new ExecutionStrategy(config, executionSettings, Stub(SourcePathResolver), Stub(LinesResolver)) - given: - def headlessTestModule = new HeadlessTestModule( + new HeadlessTestModule( Stub(AgentSpanContext), "test-module", null, @@ -46,27 +69,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/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 b2ed0bffebf..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 @@ -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); @@ -240,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()); @@ -268,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 0e209201158..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 @@ -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 @@ -47,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) @@ -94,7 +95,7 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { def span = generateRandomSpan(InternalSpanTypes.TEST, [ (Tags.TEST_SESSION_ID): DDTraceId.from(123), (Tags.TEST_MODULE_ID) : 456, - (Tags.TEST_SUITE_ID) : 789 + (Tags.TEST_SUITE_ID) : 789, ]) when: @@ -114,7 +115,7 @@ class CiTestCycleMapperV1PayloadTest extends DDSpecification { 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_SUITE_ID) : 789, ]) when: @@ -186,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() @@ -251,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()) @@ -270,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; + } }