Skip to content

Commit 4133f2e

Browse files
SteveSandersonMSstephentoub
authored andcommitted
In telemetry, treat AdditionalProperties as sensitive (dotnet#6239)
1 parent a9aa283 commit 4133f2e

File tree

2 files changed

+11
-9
lines changed

2 files changed

+11
-9
lines changed

src/Libraries/Microsoft.Extensions.AI/ChatCompletion/OpenTelemetryChatClient.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,8 @@ public override async IAsyncEnumerable<ChatResponseUpdate> GetStreamingResponseA
302302

303303
if (_system is not null)
304304
{
305-
if (options.AdditionalProperties is { } props)
305+
// Since AdditionalProperties has undefined meaning, we treat it as potentially sensitive data
306+
if (EnableSensitiveData && options.AdditionalProperties is { } props)
306307
{
307308
// Log all additional request options as per-provider tags. This is non-normative, but it covers cases where
308309
// there's a per-provider specification in a best-effort manner (e.g. gen_ai.openai.request.service_tier),
@@ -404,11 +405,12 @@ private void TraceResponse(
404405

405406
if (_system is not null)
406407
{
407-
// Log all additional response properties as per-provider tags. This is non-normative, but it covers cases where
408-
// there's a per-provider specification in a best-effort manner (e.g. gen_ai.openai.response.system_fingerprint),
409-
// and more generally cases where there's additional useful information to be logged.
410-
if (response.AdditionalProperties is { } props)
408+
// Since AdditionalProperties has undefined meaning, we treat it as potentially sensitive data
409+
if (EnableSensitiveData && response.AdditionalProperties is { } props)
411410
{
411+
// Log all additional response properties as per-provider tags. This is non-normative, but it covers cases where
412+
// there's a per-provider specification in a best-effort manner (e.g. gen_ai.openai.response.system_fingerprint),
413+
// and more generally cases where there's additional useful information to be logged.
412414
foreach (KeyValuePair<string, object?> prop in props)
413415
{
414416
_ = activity.AddTag(

test/Libraries/Microsoft.Extensions.AI.Tests/ChatCompletion/OpenTelemetryChatClientTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,16 +165,16 @@ async static IAsyncEnumerable<ChatResponseUpdate> CallbackAsync(
165165
Assert.Equal(7, activity.GetTagItem("gen_ai.request.top_k"));
166166
Assert.Equal(123, activity.GetTagItem("gen_ai.request.max_tokens"));
167167
Assert.Equal("""["hello", "world"]""", activity.GetTagItem("gen_ai.request.stop_sequences"));
168-
Assert.Equal("value1", activity.GetTagItem("gen_ai.testservice.request.service_tier"));
169-
Assert.Equal("value2", activity.GetTagItem("gen_ai.testservice.request.something_else"));
168+
Assert.Equal(enableSensitiveData ? "value1" : null, activity.GetTagItem("gen_ai.testservice.request.service_tier"));
169+
Assert.Equal(enableSensitiveData ? "value2" : null, activity.GetTagItem("gen_ai.testservice.request.something_else"));
170170
Assert.Equal(42L, activity.GetTagItem("gen_ai.request.seed"));
171171

172172
Assert.Equal("id123", activity.GetTagItem("gen_ai.response.id"));
173173
Assert.Equal("""["stop"]""", activity.GetTagItem("gen_ai.response.finish_reasons"));
174174
Assert.Equal(10, activity.GetTagItem("gen_ai.response.input_tokens"));
175175
Assert.Equal(20, activity.GetTagItem("gen_ai.response.output_tokens"));
176-
Assert.Equal("abcdefgh", activity.GetTagItem("gen_ai.testservice.response.system_fingerprint"));
177-
Assert.Equal("value2", activity.GetTagItem("gen_ai.testservice.response.and_something_else"));
176+
Assert.Equal(enableSensitiveData ? "abcdefgh" : null, activity.GetTagItem("gen_ai.testservice.response.system_fingerprint"));
177+
Assert.Equal(enableSensitiveData ? "value2" : null, activity.GetTagItem("gen_ai.testservice.response.and_something_else"));
178178

179179
Assert.True(activity.Duration.TotalMilliseconds > 0);
180180

0 commit comments

Comments
 (0)