Skip to content

Commit 80bd458

Browse files
Add 'enduser.pseudo.id' as ai.user.id (Azure#52722)
1 parent 3cc9fbf commit 80bd458

File tree

7 files changed

+31
-4
lines changed

7 files changed

+31
-4
lines changed

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
### Features Added
66

7+
* Added mapping for `enduser.pseudo.id` attribute to `user_Id`
8+
79
### Breaking Changes
810

911
### Bugs Fixed

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/TelemetryItem.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public TelemetryItem(Activity activity, ref ActivityTagsProcessor activityTagsPr
6868
Tags["ai.user.userAgent"] = userAgent;
6969
}
7070

71-
SetAuthenticatedUserId(ref activityTagsProcessor);
71+
SetUserIdAndAuthenticatedUserId(ref activityTagsProcessor);
7272
SetResourceSdkVersionAndIkey(resource, instrumentationKey);
7373

7474
if (sampleRate != 100f)
@@ -149,12 +149,17 @@ internal static DateTimeOffset FormatUtcTimestamp(System.DateTime utcTimestamp)
149149
}
150150

151151
[MethodImpl(MethodImplOptions.AggressiveInlining)]
152-
private void SetAuthenticatedUserId(ref ActivityTagsProcessor activityTagsProcessor)
152+
private void SetUserIdAndAuthenticatedUserId(ref ActivityTagsProcessor activityTagsProcessor)
153153
{
154154
if (activityTagsProcessor.EndUserId != null)
155155
{
156156
Tags[ContextTagKeys.AiUserAuthUserId.ToString()] = activityTagsProcessor.EndUserId.Truncate(SchemaConstants.Tags_AiUserAuthUserId_MaxLength);
157157
}
158+
159+
if (activityTagsProcessor.EndUserPseudoId != null)
160+
{
161+
Tags[ContextTagKeys.AiUserId.ToString()] = activityTagsProcessor.EndUserPseudoId.Truncate(SchemaConstants.Tags_AiUserId_MaxLength);
162+
}
158163
}
159164
}
160165
}

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/ActivityTagsProcessor.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ internal struct ActivityTagsProcessor
5555

5656
// Others
5757
SemanticConventions.AttributeEnduserId,
58+
SemanticConventions.AttributeEnduserPseudoId,
5859
"microsoft.client.ip"
5960
};
6061

@@ -69,6 +70,8 @@ internal struct ActivityTagsProcessor
6970

7071
public string? EndUserId { get; private set; } = null;
7172

73+
public string? EndUserPseudoId { get; private set; } = null;
74+
7275
public ActivityTagsProcessor()
7376
{
7477
MappedTags = AzMonList.Initialize();
@@ -106,6 +109,9 @@ public void CategorizeTags(Activity activity)
106109
case SemanticConventions.AttributeEnduserId:
107110
EndUserId = tag.Value.ToString();
108111
continue;
112+
case SemanticConventions.AttributeEnduserPseudoId:
113+
EndUserPseudoId = tag.Value.ToString();
114+
continue;
109115
}
110116

111117
AzMonList.Add(ref MappedTags, tag);

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/SchemaConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ internal static class SchemaConstants
121121
public const int Tags_AiOperationName_MaxLength = 1024;
122122
public const int Tags_AiOperationParentId_MaxLength = 512;
123123
public const int Tags_AiUserAuthUserId_MaxLength = 1024;
124+
public const int Tags_AiUserId_MaxLength = 1024;
124125
public const int Tags_AiApplicationVer_MaxLength = 1024;
125126
public const int Tags_AiCloudRole_MaxLength = 256;
126127
public const int Tags_AiCloudRoleInstance_MaxLength = 256;

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/SemanticConventions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ internal static class SemanticConventions
6969
public const string AttributeNetHostName = "net.host.name";
7070

7171
public const string AttributeEnduserId = "enduser.id";
72+
public const string AttributeEnduserPseudoId = "enduser.pseudo.id";
7273
public const string AttributeEnduserRole = "enduser.role";
7374
public const string AttributeEnduserScope = "enduser.scope";
7475

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/CommonTestFramework/TelemetryItemValidationHelper.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ public static void AssertActivity_As_DependencyTelemetry(
165165
string? expectedSpanId,
166166
IDictionary<string, string>? expectedProperties,
167167
string expectedAuthUserId,
168+
string expectedUserId,
168169
bool expectedSuccess = true,
169170
string expectedCloudRole = "[testNamespace]/testName",
170171
string expectedCloudInstance = "testInstance",
@@ -175,9 +176,10 @@ public static void AssertActivity_As_DependencyTelemetry(
175176
Assert.Equal(2, telemetryItem.Data.BaseData.Version); // telemetry api version
176177
Assert.Equal("00000000-0000-0000-0000-000000000000", telemetryItem.InstrumentationKey);
177178

178-
Assert.Equal(6, telemetryItem.Tags.Count);
179+
Assert.Equal(7, telemetryItem.Tags.Count);
179180
Assert.Equal(expectedTraceId, telemetryItem.Tags["ai.operation.id"]);
180181
Assert.Equal(expectedAuthUserId, telemetryItem.Tags["ai.user.authUserId"]);
182+
Assert.Equal(expectedUserId, telemetryItem.Tags["ai.user.id"]);
181183
Assert.Equal(expectedApplicationVersion, telemetryItem.Tags["ai.application.ver"]);
182184
Assert.Equal(expectedCloudRole, telemetryItem.Tags["ai.cloud.role"]);
183185
Assert.Equal(expectedCloudInstance, telemetryItem.Tags["ai.cloud.roleInstance"]);
@@ -209,6 +211,7 @@ public static void AssertActivity_As_RequestTelemetry(
209211
IDictionary<string, string> expectedProperties,
210212
string? expectedSpanId,
211213
string expectedAuthUserId,
214+
string expectedUserId,
212215
bool expectedSuccess = true,
213216
string expectedCloudRole = "[testNamespace]/testName",
214217
string expectedCloudInstance = "testInstance",
@@ -219,11 +222,12 @@ public static void AssertActivity_As_RequestTelemetry(
219222
Assert.Equal(2, telemetryItem.Data.BaseData.Version); // telemetry api version
220223
Assert.Equal("00000000-0000-0000-0000-000000000000", telemetryItem.InstrumentationKey);
221224

222-
var expectedTagsCount = 7;
225+
var expectedTagsCount = 8;
223226

224227
Assert.Equal(expectedTagsCount, telemetryItem.Tags.Count);
225228
Assert.Equal(expectedTraceId, telemetryItem.Tags["ai.operation.id"]);
226229
Assert.Equal(expectedAuthUserId, telemetryItem.Tags["ai.user.authUserId"]);
230+
Assert.Equal(expectedUserId, telemetryItem.Tags["ai.user.id"]);
227231
Assert.Equal(expectedApplicationVersion, telemetryItem.Tags["ai.application.ver"]);
228232
Assert.Equal(expectedCloudRole, telemetryItem.Tags["ai.cloud.role"]);
229233
Assert.Equal(expectedCloudInstance, telemetryItem.Tags["ai.cloud.roleInstance"]);

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/E2ETelemetryItemValidation/TracesTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public void VerifyTrace_CreatesDependency(ActivityKind activityKind)
6565
spanId = activity.SpanId.ToHexString();
6666

6767
activity.SetTag("enduser.id", "TestUser"); //authenticated user
68+
activity.SetTag("enduser.pseudo.id", "TestPseudoUser"); // anonymous/pseudo user id
6869
activity.SetTag("integer", 1);
6970
activity.SetTag("message", "Hello World!");
7071
activity.SetTag("intArray", new int[] { 1, 2, 3 });
@@ -85,6 +86,7 @@ public void VerifyTrace_CreatesDependency(ActivityKind activityKind)
8586
expectedTraceId: traceId,
8687
expectedSpanId: spanId,
8788
expectedAuthUserId: "TestUser",
89+
expectedUserId: "TestPseudoUser",
8890
expectedProperties: new Dictionary<string, string> { { "integer", "1" }, { "message", "Hello World!" }, { "intArray", "1,2,3" } });
8991
}
9092

@@ -114,6 +116,7 @@ public void VerifyTrace_CreatesRequest(ActivityKind activityKind)
114116
spanId = activity.SpanId.ToHexString();
115117

116118
activity.SetTag("enduser.id", "TestUser"); //authenticated user
119+
activity.SetTag("enduser.pseudo.id", "TestPseudoUser"); // anonymous/pseudo user id
117120
activity.SetTag("integer", 1);
118121
activity.SetTag("message", "Hello World!");
119122
activity.SetTag("intArray", new int[] { 1, 2, 3 });
@@ -135,6 +138,7 @@ public void VerifyTrace_CreatesRequest(ActivityKind activityKind)
135138
expectedTraceId: traceId,
136139
expectedSpanId: spanId,
137140
expectedAuthUserId: "TestUser",
141+
expectedUserId: "TestPseudoUser",
138142
expectedProperties: new Dictionary<string, string> { { "integer", "1" }, { "message", "Hello World!" }, { "intArray", "1,2,3" } });
139143
}
140144

@@ -163,6 +167,7 @@ public void VerifyExceptionWithinActivity()
163167
spanId = activity.SpanId.ToHexString();
164168

165169
activity.SetTag("enduser.id", "TestUser"); //authenticated user
170+
activity.SetTag("enduser.pseudo.id", "TestPseudoUser"); // anonymous/pseudo user id
166171

167172
try
168173
{
@@ -192,6 +197,7 @@ public void VerifyExceptionWithinActivity()
192197
expectedTraceId: traceId,
193198
expectedSpanId: spanId,
194199
expectedAuthUserId: "TestUser",
200+
expectedUserId: "TestPseudoUser",
195201
expectedProperties: null,
196202
expectedSuccess: false);
197203

@@ -259,6 +265,7 @@ public void VerifyLogWithinActivity(LogLevel logLevel, string expectedSeverityLe
259265
traceId = activity.TraceId.ToHexString();
260266

261267
activity.SetTag("enduser.id", "TestUser"); //authenticated user
268+
activity.SetTag("enduser.pseudo.id", "TestPseudoUser"); // anonymous/pseudo user id
262269

263270
var logger = loggerFactory.CreateLogger(logCategoryName);
264271

@@ -285,6 +292,7 @@ public void VerifyLogWithinActivity(LogLevel logLevel, string expectedSeverityLe
285292
expectedTraceId: traceId,
286293
expectedSpanId: spanId,
287294
expectedAuthUserId: "TestUser",
295+
expectedUserId: "TestPseudoUser",
288296
expectedProperties: null);
289297

290298
Assert.True(logTelemetryItems?.Any(), "Unit test failed to collect telemetry.");

0 commit comments

Comments
 (0)