From 0ae4a239e2ef324869eb7459f6c0d76cef498808 Mon Sep 17 00:00:00 2001 From: Stephen Toub Date: Wed, 4 Jun 2025 09:39:41 -0700 Subject: [PATCH] Fix name of genai input/output tokens tag --- .../ChatCompletion/FunctionInvokingChatClient.cs | 6 +++--- .../ChatCompletion/OpenTelemetryChatClient.cs | 4 ++-- .../Embeddings/OpenTelemetryEmbeddingGenerator.cs | 2 +- .../Microsoft.Extensions.AI/OpenTelemetryConsts.cs | 9 +++++++-- .../ChatClientIntegrationTests.cs | 8 ++++---- .../EmbeddingGeneratorIntegrationTests.cs | 2 +- .../ChatCompletion/OpenTelemetryChatClientTests.cs | 4 ++-- .../Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs | 2 +- 8 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/FunctionInvokingChatClient.cs b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/FunctionInvokingChatClient.cs index d624ec63abb..293ff1d98f1 100644 --- a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/FunctionInvokingChatClient.cs +++ b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/FunctionInvokingChatClient.cs @@ -422,12 +422,12 @@ private static void AddUsageTags(Activity? activity, UsageDetails? usage) { if (usage.InputTokenCount is long inputTokens) { - _ = activity.AddTag(OpenTelemetryConsts.GenAI.Response.InputTokens, (int)inputTokens); + _ = activity.AddTag(OpenTelemetryConsts.GenAI.Usage.InputTokens, (int)inputTokens); } if (usage.OutputTokenCount is long outputTokens) { - _ = activity.AddTag(OpenTelemetryConsts.GenAI.Response.OutputTokens, (int)outputTokens); + _ = activity.AddTag(OpenTelemetryConsts.GenAI.Usage.OutputTokens, (int)outputTokens); } } } @@ -795,7 +795,7 @@ FunctionResultContent CreateFunctionResultContent(FunctionInvocationResult resul _ = Throw.IfNull(context); using Activity? activity = _activitySource?.StartActivity( - $"execute_tool {context.Function.Name}", + $"{OpenTelemetryConsts.GenAI.ExecuteTool} {context.Function.Name}", ActivityKind.Internal, default(ActivityContext), [ diff --git a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs index 98e231cf0e5..569b8b40d02 100644 --- a/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs +++ b/src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs @@ -400,12 +400,12 @@ private void TraceResponse( if (response.Usage?.InputTokenCount is long inputTokens) { - _ = activity.AddTag(OpenTelemetryConsts.GenAI.Response.InputTokens, (int)inputTokens); + _ = activity.AddTag(OpenTelemetryConsts.GenAI.Usage.InputTokens, (int)inputTokens); } if (response.Usage?.OutputTokenCount is long outputTokens) { - _ = activity.AddTag(OpenTelemetryConsts.GenAI.Response.OutputTokens, (int)outputTokens); + _ = activity.AddTag(OpenTelemetryConsts.GenAI.Usage.OutputTokens, (int)outputTokens); } if (_system is not null) diff --git a/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGenerator.cs b/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGenerator.cs index 7bac1b716f5..82f617d5bf6 100644 --- a/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGenerator.cs +++ b/src/Libraries/Microsoft.Extensions.AI/Embeddings/OpenTelemetryEmbeddingGenerator.cs @@ -249,7 +249,7 @@ private void TraceResponse( if (inputTokens.HasValue) { - _ = activity.AddTag(OpenTelemetryConsts.GenAI.Response.InputTokens, inputTokens); + _ = activity.AddTag(OpenTelemetryConsts.GenAI.Usage.InputTokens, inputTokens); } if (responseModelId is not null) diff --git a/src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs b/src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs index 7b15f2fc05c..e656a473ba2 100644 --- a/src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs +++ b/src/Libraries/Microsoft.Extensions.AI/OpenTelemetryConsts.cs @@ -31,6 +31,7 @@ public static class GenAI public const string Chat = "chat"; public const string Embeddings = "embeddings"; + public const string ExecuteTool = "execute_tool"; public static class Assistant { @@ -89,9 +90,7 @@ public static class Response { public const string FinishReasons = "gen_ai.response.finish_reasons"; public const string Id = "gen_ai.response.id"; - public const string InputTokens = "gen_ai.response.input_tokens"; public const string Model = "gen_ai.response.model"; - public const string OutputTokens = "gen_ai.response.output_tokens"; public static string PerProvider(string providerName, string parameterName) => $"gen_ai.{providerName}.response.{parameterName}"; } @@ -118,6 +117,12 @@ public static class Call } } + public static class Usage + { + public const string InputTokens = "gen_ai.usage.input_tokens"; + public const string OutputTokens = "gen_ai.usage.output_tokens"; + } + public static class User { public const string Message = "gen_ai.user.message"; diff --git a/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/ChatClientIntegrationTests.cs b/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/ChatClientIntegrationTests.cs index 994fef47517..f28374e7d79 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/ChatClientIntegrationTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/ChatClientIntegrationTests.cs @@ -342,8 +342,8 @@ private static void AssertUsageAgainstActivities(ChatResponse response, List (int?)a.GetTagItem("gen_ai.response.input_tokens")!); - var totalOutputTokens = activities.Sum(a => (int?)a.GetTagItem("gen_ai.response.output_tokens")!); + var totalInputTokens = activities.Sum(a => (int?)a.GetTagItem("gen_ai.usage.input_tokens")!); + var totalOutputTokens = activities.Sum(a => (int?)a.GetTagItem("gen_ai.usage.output_tokens")!); Assert.Equal(totalInputTokens, finalUsage.InputTokenCount * 2); Assert.Equal(totalOutputTokens, finalUsage.OutputTokenCount * 2); } @@ -785,8 +785,8 @@ public virtual async Task OpenTelemetry_CanEmitTracesAndMetrics() Assert.Equal(chatClient.GetService()?.ProviderUri?.Port, (int)activity.GetTagItem("server.port")!); Assert.NotNull(activity.Id); Assert.NotEmpty(activity.Id); - Assert.NotEqual(0, (int)activity.GetTagItem("gen_ai.response.input_tokens")!); - Assert.NotEqual(0, (int)activity.GetTagItem("gen_ai.response.output_tokens")!); + Assert.NotEqual(0, (int)activity.GetTagItem("gen_ai.usage.input_tokens")!); + Assert.NotEqual(0, (int)activity.GetTagItem("gen_ai.usage.output_tokens")!); Assert.True(activity.Duration.TotalMilliseconds > 0); } diff --git a/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/EmbeddingGeneratorIntegrationTests.cs b/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/EmbeddingGeneratorIntegrationTests.cs index 1504d0d2488..0f422d950b8 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/EmbeddingGeneratorIntegrationTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Integration.Tests/EmbeddingGeneratorIntegrationTests.cs @@ -128,7 +128,7 @@ public virtual async Task OpenTelemetry_CanEmitTracesAndMetrics() Assert.Equal(embeddingGenerator.GetService()?.ProviderUri?.Port, (int)activity.GetTagItem("server.port")!); Assert.NotNull(activity.Id); Assert.NotEmpty(activity.Id); - Assert.NotEqual(0, (int)activity.GetTagItem("gen_ai.response.input_tokens")!); + Assert.NotEqual(0, (int)activity.GetTagItem("gen_ai.usage.input_tokens")!); Assert.True(activity.Duration.TotalMilliseconds > 0); } diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs index 4d0122c7c92..b81a480e207 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs @@ -171,8 +171,8 @@ async static IAsyncEnumerable CallbackAsync( Assert.Equal("id123", activity.GetTagItem("gen_ai.response.id")); Assert.Equal("""["stop"]""", activity.GetTagItem("gen_ai.response.finish_reasons")); - Assert.Equal(10, activity.GetTagItem("gen_ai.response.input_tokens")); - Assert.Equal(20, activity.GetTagItem("gen_ai.response.output_tokens")); + Assert.Equal(10, activity.GetTagItem("gen_ai.usage.input_tokens")); + Assert.Equal(20, activity.GetTagItem("gen_ai.usage.output_tokens")); Assert.Equal(enableSensitiveData ? "abcdefgh" : null, activity.GetTagItem("gen_ai.testservice.response.system_fingerprint")); Assert.Equal(enableSensitiveData ? "value2" : null, activity.GetTagItem("gen_ai.testservice.response.and_something_else")); diff --git a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs index 25e01afb1df..418d11544a3 100644 --- a/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.Tests/Embeddings/OpenTelemetryEmbeddingGeneratorTests.cs @@ -89,7 +89,7 @@ public async Task ExpectedInformationLogged_Async(string? perRequestModelId, boo Assert.Equal(enableSensitiveData ? "value1" : null, activity.GetTagItem("gen_ai.testservice.request.service_tier")); Assert.Equal(enableSensitiveData ? "value2" : null, activity.GetTagItem("gen_ai.testservice.request.something_else")); - Assert.Equal(10, activity.GetTagItem("gen_ai.response.input_tokens")); + Assert.Equal(10, activity.GetTagItem("gen_ai.usage.input_tokens")); Assert.Equal(enableSensitiveData ? "abcdefgh" : null, activity.GetTagItem("gen_ai.testservice.response.system_fingerprint")); Assert.Equal(enableSensitiveData ? "value3" : null, activity.GetTagItem("gen_ai.testservice.response.and_something_else"));