From 56fd2ae39af57d8d32db27403f3a7913832f3904 Mon Sep 17 00:00:00 2001 From: Harsimar Kaur Date: Wed, 11 Mar 2026 13:46:42 -0700 Subject: [PATCH 1/3] initial draft --- .../builders/AbstractTelemetryBuilder.java | 22 +++++- .../AbstractTelemetryBuilderTest.java | 73 +++++++++++++++++++ 2 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilder.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilder.java index ac6ad701ac27..e52a4d671f15 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilder.java +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilder.java @@ -13,13 +13,29 @@ import java.time.OffsetDateTime; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; +import java.util.Set; + +import static java.util.Arrays.asList; public abstract class AbstractTelemetryBuilder { private static final int MAX_PROPERTY_KEY_LENGTH = 150; private static final int MAX_PROPERTY_VALUE_LENGTH = 8192; + // gen_ai properties can contain large payloads (e.g. full conversation messages, + // tool definitions) that should not be truncated + private static final Set TRUNCATION_EXEMPT_PROPERTY_KEYS = new HashSet<>(asList( + "gen_ai.input.messages", + "gen_ai.output.messages", + "gen_ai.system_instructions", + "gen_ai.tool.definitions", + "gen_ai.tool.call.arguments", + "gen_ai.tool.call.result", + "gen_ai.evaluation.explanation" + )); + protected static final int MAX_MEASUREMENT_KEY_LENGTH = 150; protected static final int MAX_NAME_LENGTH = 1024; @@ -79,7 +95,11 @@ public void addProperty(@Nullable String key, @Nullable String value) { // TODO (trask) log return; } - getProperties().put(key, TelemetryTruncation.truncatePropertyValue(value, MAX_PROPERTY_VALUE_LENGTH, key)); + if (TRUNCATION_EXEMPT_PROPERTY_KEYS.contains(key)) { + getProperties().put(key, value); + } else { + getProperties().put(key, TelemetryTruncation.truncatePropertyValue(value, MAX_PROPERTY_VALUE_LENGTH, key)); + } } public TelemetryItem build() { diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java new file mode 100644 index 000000000000..a3edcbe77353 --- /dev/null +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.monitor.opentelemetry.autoconfigure.implementation.builders; + +import com.azure.monitor.opentelemetry.autoconfigure.implementation.models.TelemetryItem; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +public class AbstractTelemetryBuilderTest { + + @Test + public void regularPropertyIsTruncatedAt8192() { + MessageTelemetryBuilder builder = MessageTelemetryBuilder.create(); + String longValue = repeat("a", 10000); + builder.addProperty("some.regular.property", longValue); + + TelemetryItem item = builder.build(); + Map properties = getProperties(item); + assertEquals(8192, properties.get("some.regular.property").length()); + } + + @ParameterizedTest + @ValueSource(strings = { + "gen_ai.input.messages", + "gen_ai.output.messages", + "gen_ai.system_instructions", + "gen_ai.tool.definitions", + "gen_ai.tool.call.arguments", + "gen_ai.tool.call.result", + "gen_ai.evaluation.explanation" + }) + public void genAiPropertyIsNotTruncated(String key) { + MessageTelemetryBuilder builder = MessageTelemetryBuilder.create(); + String longValue = repeat("a", 50000); + builder.addProperty(key, longValue); + + TelemetryItem item = builder.build(); + Map properties = getProperties(item); + assertEquals(50000, properties.get(key).length()); + assertEquals(longValue, properties.get(key)); + } + + + } + + @SuppressWarnings("unchecked") + private static Map getProperties(TelemetryItem item) { + if (item.getData() == null || item.getData().getBaseData() == null) { + return null; + } + Object baseData = item.getData().getBaseData(); + try { + return (Map) baseData.getClass().getMethod("getProperties").invoke(baseData); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static String repeat(String s, int count) { + StringBuilder sb = new StringBuilder(s.length() * count); + for (int i = 0; i < count; i++) { + sb.append(s); + } + return sb.toString(); + } +} From 32706fa9ddb810887524eaa8ea80b1c11553262d Mon Sep 17 00:00:00 2001 From: Harsimar Kaur Date: Wed, 11 Mar 2026 15:02:15 -0700 Subject: [PATCH 2/3] fix syntax error --- .../builders/AbstractTelemetryBuilder.java | 12 +++-------- .../AbstractTelemetryBuilderTest.java | 21 ++++++++----------- 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilder.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilder.java index e52a4d671f15..c0e7e7400fa1 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilder.java +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilder.java @@ -26,15 +26,9 @@ public abstract class AbstractTelemetryBuilder { // gen_ai properties can contain large payloads (e.g. full conversation messages, // tool definitions) that should not be truncated - private static final Set TRUNCATION_EXEMPT_PROPERTY_KEYS = new HashSet<>(asList( - "gen_ai.input.messages", - "gen_ai.output.messages", - "gen_ai.system_instructions", - "gen_ai.tool.definitions", - "gen_ai.tool.call.arguments", - "gen_ai.tool.call.result", - "gen_ai.evaluation.explanation" - )); + private static final Set TRUNCATION_EXEMPT_PROPERTY_KEYS = new HashSet<>(asList("gen_ai.input.messages", + "gen_ai.output.messages", "gen_ai.system_instructions", "gen_ai.tool.definitions", "gen_ai.tool.call.arguments", + "gen_ai.tool.call.result", "gen_ai.evaluation.explanation")); protected static final int MAX_MEASUREMENT_KEY_LENGTH = 150; diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java index a3edcbe77353..ba7f8cb14b09 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java @@ -27,15 +27,15 @@ public void regularPropertyIsTruncatedAt8192() { } @ParameterizedTest - @ValueSource(strings = { - "gen_ai.input.messages", - "gen_ai.output.messages", - "gen_ai.system_instructions", - "gen_ai.tool.definitions", - "gen_ai.tool.call.arguments", - "gen_ai.tool.call.result", - "gen_ai.evaluation.explanation" - }) + @ValueSource( + strings = { + "gen_ai.input.messages", + "gen_ai.output.messages", + "gen_ai.system_instructions", + "gen_ai.tool.definitions", + "gen_ai.tool.call.arguments", + "gen_ai.tool.call.result", + "gen_ai.evaluation.explanation" }) public void genAiPropertyIsNotTruncated(String key) { MessageTelemetryBuilder builder = MessageTelemetryBuilder.create(); String longValue = repeat("a", 50000); @@ -47,9 +47,6 @@ public void genAiPropertyIsNotTruncated(String key) { assertEquals(longValue, properties.get(key)); } - - } - @SuppressWarnings("unchecked") private static Map getProperties(TelemetryItem item) { if (item.getData() == null || item.getData().getBaseData() == null) { From 8056775a6a2f41670b5a4fd9685b1990d5fb450c Mon Sep 17 00:00:00 2001 From: Harsimar Kaur Date: Wed, 11 Mar 2026 15:22:08 -0700 Subject: [PATCH 3/3] Update sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../implementation/builders/AbstractTelemetryBuilderTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java index ba7f8cb14b09..63bbd6c45595 100644 --- a/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java +++ b/sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/builders/AbstractTelemetryBuilderTest.java @@ -11,7 +11,6 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; public class AbstractTelemetryBuilderTest {