diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FeatureFlagEvpContext.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FeatureFlagEvpContext.java index c964efa6c7f..255c2377905 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FeatureFlagEvpContext.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FeatureFlagEvpContext.java @@ -17,6 +17,10 @@ static Map from(final Config config) { if (config.getVersion() != null) { context.put("version", config.getVersion()); } + // SDK identity (source.name / source.version) is emitted per-event at the top level + // (sibling of flag/variant/targeting_key), matching the flagevaluation track schema in + // logs-backend. Putting it in the batch context would map it to context.source.*, which is + // not a declared facet and causes the indexer to drop the event. return context; } } diff --git a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationPayloads.java b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationPayloads.java index 3a8734fd516..95ce3e0b082 100644 --- a/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationPayloads.java +++ b/products/feature-flagging/feature-flagging-lib/src/main/java/com/datadog/featureflag/FlagEvaluationPayloads.java @@ -1,5 +1,6 @@ package com.datadog.featureflag; +import datadog.communication.ddagent.TracerVersion; import com.squareup.moshi.JsonAdapter; import com.squareup.moshi.Moshi; import com.squareup.moshi.Types; @@ -157,6 +158,9 @@ private byte[] toByteArray() { } } + private static final String SOURCE_NAME = "dd-trace-java"; + private static final String SOURCE_VERSION = TracerVersion.TRACER_VERSION; + static class FlagEvaluationEvent { public final long timestamp; public final FlagKeyObject flag; @@ -168,6 +172,7 @@ static class FlagEvaluationEvent { public final String targeting_key; public final Boolean runtime_default_used; public final EventContext context; + public final SourceObject source; public final ErrorObject error; FlagEvaluationEvent( @@ -196,6 +201,7 @@ static class FlagEvaluationEvent { (evaluationAttrs != null && !evaluationAttrs.isEmpty()) ? new EventContext(evaluationAttrs) : null; + this.source = new SourceObject(SOURCE_NAME, SOURCE_VERSION); this.error = (errorMessage != null && !errorMessage.isEmpty()) ? new ErrorObject(errorMessage) : null; } @@ -284,6 +290,16 @@ static class ErrorObject { } } + static class SourceObject { + public final String name; + public final String version; + + SourceObject(final String name, final String version) { + this.name = name; + this.version = version; + } + } + static class EventContext { public final Map evaluation; diff --git a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/ExposureWriterTests.java b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/ExposureWriterTests.java index 76b9e2602d8..4c47133d8d7 100644 --- a/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/ExposureWriterTests.java +++ b/products/feature-flagging/feature-flagging-lib/src/test/java/com/datadog/featureflag/ExposureWriterTests.java @@ -15,6 +15,7 @@ import com.squareup.moshi.Moshi; import datadog.communication.ddagent.DDAgentFeaturesDiscovery; import datadog.communication.ddagent.SharedCommunicationObjects; +import datadog.communication.ddagent.TracerVersion; import datadog.trace.agent.test.server.http.JavaTestHttpServer; import datadog.trace.agent.test.server.http.JavaTestHttpServer.HandlerApi; import datadog.trace.api.Config; @@ -287,6 +288,9 @@ private static void assertContext( assertEquals(service == null ? "unknown" : service, context.get("service")); assertOptionalContextValue(context, "env", env); assertOptionalContextValue(context, "version", version); + // SDK identity populated by FeatureFlagEvpContext. + assertEquals("dd-trace-java", context.get("source.name")); + assertEquals(TracerVersion.TRACER_VERSION, context.get("source.version")); } private static void assertOptionalContextValue(