From 1c0de44e6463e561988b038eec1deade084184f3 Mon Sep 17 00:00:00 2001 From: Andrea Marziali Date: Fri, 16 May 2025 11:50:25 +0200 Subject: [PATCH] Surface process tags on telemetry payloads --- .../telemetry/TelemetryRequestBody.java | 5 ++ .../TelemetryRequestBodySpecification.groovy | 48 ++++++++++++++++--- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/telemetry/src/main/java/datadog/telemetry/TelemetryRequestBody.java b/telemetry/src/main/java/datadog/telemetry/TelemetryRequestBody.java index 83cddd3555a..a8538f6b04a 100644 --- a/telemetry/src/main/java/datadog/telemetry/TelemetryRequestBody.java +++ b/telemetry/src/main/java/datadog/telemetry/TelemetryRequestBody.java @@ -12,6 +12,7 @@ import datadog.trace.api.ConfigSetting; import datadog.trace.api.DDTags; import datadog.trace.api.Platform; +import datadog.trace.api.ProcessTags; import datadog.trace.api.telemetry.Endpoint; import datadog.trace.api.telemetry.ProductChange.ProductType; import java.io.IOException; @@ -87,6 +88,10 @@ public void beginRequest(boolean debug) { bodyWriter.name("runtime_name").value(commonData.runtimeName); bodyWriter.name("runtime_version").value(commonData.runtimeVersion); bodyWriter.name("runtime_patches").value(commonData.runtimePatches); // optional + final CharSequence processTags = ProcessTags.getTagsForSerialization(); + if (processTags != null) { + bodyWriter.name("process_tags").value(processTags.toString()); + } bodyWriter.endObject(); if (debug) { diff --git a/telemetry/src/test/groovy/datadog/telemetry/TelemetryRequestBodySpecification.groovy b/telemetry/src/test/groovy/datadog/telemetry/TelemetryRequestBodySpecification.groovy index 6030f8f94ea..d0f7832da20 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/TelemetryRequestBodySpecification.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/TelemetryRequestBodySpecification.groovy @@ -1,13 +1,18 @@ package datadog.telemetry + +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types import datadog.telemetry.api.RequestType import datadog.trace.api.ConfigOrigin import datadog.trace.api.ConfigSetting +import datadog.trace.api.ProcessTags import datadog.trace.api.telemetry.ProductChange -import okio.Buffer +import datadog.trace.test.util.DDSpecification import okhttp3.RequestBody -import spock.lang.Specification +import okio.Buffer +import static datadog.trace.api.config.GeneralConfig.EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED import static datadog.trace.api.telemetry.ProductChange.ProductType.APPSEC import static datadog.trace.api.telemetry.ProductChange.ProductType.DYNAMIC_INSTRUMENTATION import static datadog.trace.api.telemetry.ProductChange.ProductType.PROFILER @@ -15,7 +20,7 @@ import static datadog.trace.api.telemetry.ProductChange.ProductType.PROFILER /** * This test only verifies non-functional specifics that are not covered in TelemetryServiceSpecification */ -class TelemetryRequestBodySpecification extends Specification { +class TelemetryRequestBodySpecification extends DDSpecification { def 'throw SerializationException in case of JSON nesting problem'() { setup: @@ -112,17 +117,17 @@ class TelemetryRequestBodySpecification extends Specification { drainToString(req).contains("\"debug\":true") } - void 'test writeProducts'(){ + void 'test writeProducts'() { setup: TelemetryRequestBody req = new TelemetryRequestBody(RequestType.APP_PRODUCT_CHANGE) final products = new HashMap() - if(appsecChange) { + if (appsecChange) { products.put(APPSEC, appsecEnabled) } - if(profilerChange) { + if (profilerChange) { products.put(PROFILER, profilerEnabled) } - if(dynamicInstrumentationChange) { + if (dynamicInstrumentationChange) { products.put(DYNAMIC_INSTRUMENTATION, dynamicInstrumentationEnabled) } @@ -154,4 +159,33 @@ class TelemetryRequestBodySpecification extends Specification { buf.read(bytes) return new String(bytes) } + + def 'Should propagate process tags when enabled #processTagsEnabled'() { + setup: + injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "$processTagsEnabled") + ProcessTags.reset() + TelemetryRequestBody req = new TelemetryRequestBody(RequestType.APP_STARTED) + + when: + req.beginRequest(true) + req.endRequest() + + then: + def type = Types.newParameterizedType(Map, String, Object) + def adapter = new Moshi.Builder().build().adapter(type) + def parsed = (Map)adapter.fromJson(drainToString(req)) + def parsedTags = ((Map)parsed.get("application")).get("process_tags") + if (processTagsEnabled) { + assert parsedTags == ProcessTags.tagsForSerialization.toString() + } else { + assert parsedTags == null + } + + cleanup: + injectSysConfig(EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED, "false") + ProcessTags.reset() + + where: + processTagsEnabled << [true, false] + } }