Skip to content

Commit 708c95c

Browse files
Azure Monitor Exporter - Refactor to avoid sampleRate on Exception. (Azure#31153)
* Refactor to avoid sampleRate on Exception. * Remove changes from demo * Remove changes from Demo * Missed changes
1 parent 1935fc3 commit 708c95c

File tree

6 files changed

+57
-66
lines changed

6 files changed

+57
-66
lines changed

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,10 @@ internal partial class TelemetryItem
1717
{
1818
private const string DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffffffZ";
1919

20-
public TelemetryItem(string name, Activity activity, ref TagEnumerationState monitorTags, string roleName, string roleInstance, string instrumentationKey) :
21-
this(name, FormatUtcTimestamp(activity.StartTimeUtc))
20+
public TelemetryItem(Activity activity, ref TagEnumerationState monitorTags, string roleName, string roleInstance, string instrumentationKey) :
21+
this(activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency", FormatUtcTimestamp(activity.StartTimeUtc))
2222
{
23-
// TODO: Move "Exception" to const/enum.
24-
if (name == "Exception")
25-
{
26-
Tags[ContextTagKeys.AiOperationParentId.ToString()] = activity.SpanId.ToHexString();
27-
}
28-
else if (activity.ParentSpanId != default)
23+
if (activity.ParentSpanId != default)
2924
{
3025
Tags[ContextTagKeys.AiOperationParentId.ToString()] = activity.ParentSpanId.ToHexString();
3126
}
@@ -49,6 +44,29 @@ public TelemetryItem(string name, Activity activity, ref TagEnumerationState mon
4944
}
5045
}
5146

47+
public TelemetryItem(TelemetryItem telemetryItem, ActivitySpanId activitySpanId, ActivityKind kind, DateTimeOffset activityEventTimeStamp) :
48+
this("Exception", FormatUtcTimestamp(activityEventTimeStamp.DateTime))
49+
{
50+
Tags[ContextTagKeys.AiOperationParentId.ToString()] = activitySpanId.ToHexString();
51+
Tags[ContextTagKeys.AiOperationId.ToString()] = telemetryItem.Tags[ContextTagKeys.AiOperationId.ToString()];
52+
53+
// todo: update swagger to include this key.
54+
Tags["ai.user.userAgent"] = telemetryItem.Tags["ai.user.userAgent"];
55+
56+
// we only have mapping for server spans
57+
// todo: non-server spans
58+
if (kind == ActivityKind.Server)
59+
{
60+
Tags[ContextTagKeys.AiOperationName.ToString()] = telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()];
61+
Tags[ContextTagKeys.AiLocationIp.ToString()] = telemetryItem.Tags[ContextTagKeys.AiLocationIp.ToString()];
62+
}
63+
64+
Tags[ContextTagKeys.AiCloudRole.ToString()] = telemetryItem.Tags[ContextTagKeys.AiCloudRole.ToString()];
65+
Tags[ContextTagKeys.AiCloudRoleInstance.ToString()] = telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()];
66+
Tags[ContextTagKeys.AiInternalSdkVersion.ToString()] = SdkVersionUtils.s_sdkVersion;
67+
InstrumentationKey = telemetryItem.InstrumentationKey;
68+
}
69+
5270
public TelemetryItem (LogRecord logRecord, string roleName, string roleInstance, string instrumentationKey) :
5371
this(logRecord.Exception != null ? "Exception" : "Message", FormatUtcTimestamp(logRecord.Timestamp))
5472
{

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,13 @@ internal static List<TelemetryItem> OtelToAzureMonitorTrace(Batch<Activity> batc
2727
foreach (var activity in batchActivity)
2828
{
2929
var monitorTags = EnumerateActivityTags(activity);
30-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
31-
telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, roleName, roleInstance, instrumentationKey);
30+
telemetryItem = new TelemetryItem(activity, ref monitorTags, roleName, roleInstance, instrumentationKey);
31+
32+
// Check for Exceptions events
33+
if (activity.Events.Any())
34+
{
35+
AddExceptionTelemetryFromActivityExceptionEvents(activity, telemetryItem, telemetryItems);
36+
}
3237

3338
switch (activity.GetTelemetryType())
3439
{
@@ -50,12 +55,6 @@ internal static List<TelemetryItem> OtelToAzureMonitorTrace(Batch<Activity> batc
5055

5156
monitorTags.Return();
5257
telemetryItems.Add(telemetryItem);
53-
54-
// Check for Exceptions events
55-
if (activity.Events.Any())
56-
{
57-
AddExceptionTelemetryFromActivityExceptionEvents(activity, ref monitorTags, roleName, roleInstance, instrumentationKey, telemetryItems);
58-
}
5958
}
6059

6160
return telemetryItems;
@@ -176,7 +175,7 @@ internal static string GetOperationName(Activity activity, ref AzMonList MappedT
176175
return activity.DisplayName;
177176
}
178177

179-
private static void AddExceptionTelemetryFromActivityExceptionEvents(Activity activity, ref TagEnumerationState monitorTags, string roleName, string roleInstance, string instrumentationKey, List<TelemetryItem> telemetryItems)
178+
private static void AddExceptionTelemetryFromActivityExceptionEvents(Activity activity, TelemetryItem telemetryItem, List<TelemetryItem> telemetryItems)
180179
{
181180
foreach (var evnt in activity.Events)
182181
{
@@ -187,7 +186,7 @@ private static void AddExceptionTelemetryFromActivityExceptionEvents(Activity ac
187186
var exceptionData = GetExceptionDataDetailsOnTelemetryItem(evnt.Tags);
188187
if (exceptionData != null)
189188
{
190-
var exceptionTelemetryItem = new TelemetryItem("Exception", activity, ref monitorTags, roleName, roleInstance, instrumentationKey);
189+
var exceptionTelemetryItem = new TelemetryItem(telemetryItem, activity.SpanId, activity.Kind, evnt.Timestamp);
191190
exceptionTelemetryItem.Data = exceptionData;
192191
telemetryItems.Add(exceptionTelemetryItem);
193192
}

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/OfflineStorageTests.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,7 @@ private static Activity CreateActivity(string activityName)
189189
private static TelemetryItem CreateTelemetryItem(Activity activity)
190190
{
191191
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
192-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
193-
return new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
192+
return new TelemetryItem(activity, ref monitorTags, null, null, null);
194193
}
195194

196195
private class MockFileProvider : PersistentBlobProvider

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/SampleRateTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public void ValidateSampleRateInTelemetry(object SampleRate)
5252
tags: new Dictionary<string, object>() { ["sampleRate"] = SampleRate });
5353

5454
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
55-
var telemetryItem = new TelemetryItem("Request", activity, ref monitorTags, "RoleName", "RoleInstance", "00000000-0000-0000-0000-000000000000");
55+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, "RoleName", "RoleInstance", "00000000-0000-0000-0000-000000000000");
5656

5757
if (SampleRate is float)
5858
{

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryItemTests.cs

Lines changed: 14 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@ public void ValidateTelemetryItem_DefaultActivity_DefaultResource()
4646
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
4747
var resourceParser = new ResourceParser();
4848
resourceParser.UpdateRoleNameAndInstance(resource);
49-
50-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
51-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
49+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
5250

5351
Assert.Equal("RemoteDependency", telemetryItem.Name);
5452
Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time);
@@ -75,8 +73,7 @@ public void ValidateTelemetryItem_Activity_WithResource()
7573

7674
var resourceParser = new ResourceParser();
7775
resourceParser.UpdateRoleNameAndInstance(resource);
78-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
79-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
76+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
8077

8178
Assert.Equal("RemoteDependency", telemetryItem.Name);
8279
Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time);
@@ -102,9 +99,7 @@ public void ValidateTelemetryItem_Activity_WithParentSpanId()
10299

103100
var resourceParser = new ResourceParser();
104101
resourceParser.UpdateRoleNameAndInstance(resource);
105-
106-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
107-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
102+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
108103

109104
Assert.Equal("RemoteDependency", telemetryItem.Name);
110105
Assert.Equal(TelemetryItem.FormatUtcTimestamp(activity.StartTimeUtc), telemetryItem.Time);
@@ -146,9 +141,7 @@ public void HttpMethodAndHttpRouteIsUsedForHttpRequestOperationName(string route
146141
}
147142

148143
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
149-
150-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
151-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
144+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
152145

153146
Assert.Equal(expectedOperationName, telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()]);
154147
}
@@ -170,9 +163,7 @@ public void HttpMethodAndHttpUrlPathIsUsedForHttpRequestOperationName()
170163
activity.SetTag(SemanticConventions.AttributeHttpUrl, "https://www.foo.bar/path?id=1");
171164

172165
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
173-
174-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
175-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
166+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
176167

177168
Assert.Equal("GET /path", telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()]);
178169
}
@@ -191,9 +182,7 @@ public void ActivityNameIsUsedByDefaultForRequestOperationName()
191182
activity.DisplayName = "displayname";
192183

193184
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
194-
195-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
196-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
185+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
197186

198187
Assert.Equal("displayname", telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()]);
199188
}
@@ -211,9 +200,7 @@ public void AiLocationIpisSetAsHttpClientIpforHttpServerSpans()
211200
activity.SetTag(SemanticConventions.AttributeHttpClientIP, "127.0.0.1");
212201

213202
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
214-
215-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
216-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
203+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
217204

218205
Assert.Equal("127.0.0.1", telemetryItem.Tags[ContextTagKeys.AiLocationIp.ToString()]);
219206
}
@@ -231,9 +218,7 @@ public void AiLocationIpisSetAsNetPeerIpForServerSpans()
231218
activity.SetTag(SemanticConventions.AttributeNetPeerIp, "127.0.0.1");
232219

233220
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
234-
235-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
236-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
221+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
237222

238223
Assert.Equal("127.0.0.1", telemetryItem.Tags[ContextTagKeys.AiLocationIp.ToString()]);
239224
}
@@ -252,9 +237,7 @@ public void AiUserAgentisSetAsHttpUserAgent()
252237
activity.SetTag(SemanticConventions.AttributeHttpUserAgent, userAgent);
253238

254239
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
255-
256-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
257-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
240+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
258241

259242
Assert.Equal(userAgent, telemetryItem.Tags["ai.user.userAgent"]);
260243
}
@@ -270,9 +253,7 @@ public void AiLocationIpIsNullByDefault()
270253
startTime: DateTime.UtcNow);
271254

272255
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
273-
274-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
275-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
256+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
276257

277258
Assert.Null(telemetryItem.Tags[ContextTagKeys.AiLocationIp.ToString()]);
278259
}
@@ -288,9 +269,7 @@ public void AiUserAgentIsNullByDefault()
288269
startTime: DateTime.UtcNow);
289270

290271
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
291-
292-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
293-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
272+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
294273

295274
Assert.Null(telemetryItem.Tags["ai.user.userAgent"]);
296275
}
@@ -310,8 +289,7 @@ public void RoleInstanceIsSetToHostNameByDefault()
310289

311290
var resourceParser = new ResourceParser();
312291
resourceParser.UpdateRoleNameAndInstance(resource);
313-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
314-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
292+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
315293

316294
Assert.Equal(Dns.GetHostName(), telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()]);
317295
}
@@ -331,8 +309,7 @@ public void RoleInstanceIsNotOverwrittenIfSetViaServiceInstanceId()
331309

332310
var resourceParser = new ResourceParser();
333311
resourceParser.UpdateRoleNameAndInstance(resource);
334-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
335-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
312+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, resourceParser.RoleName, resourceParser.RoleInstance, "00000000-0000-0000-0000-000000000000");
336313

337314
Assert.Equal("serviceinstance", telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()]);
338315
}
@@ -355,9 +332,7 @@ public void RequestNameMatchesOperationName(string httpMethod)
355332
activity.SetTag(SemanticConventions.AttributeHttpMethod, httpMethod);
356333
}
357334
var monitorTags = TraceHelper.EnumerateActivityTags(activity);
358-
359-
var telemetryName = activity.GetTelemetryType() == TelemetryType.Request ? "Request" : "RemoteDependency";
360-
var telemetryItem = new TelemetryItem(telemetryName, activity, ref monitorTags, null, null, null);
335+
var telemetryItem = new TelemetryItem(activity, ref monitorTags, null, null, null);
361336
var requestData = new RequestData(2, activity, ref monitorTags);
362337

363338
Assert.Equal(requestData.Name, telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()]);

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TraceHelperTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,14 +233,14 @@ public void ActivityWithExceptionEventCreatesExceptionTelemetry()
233233
activityList[0] = activity;
234234
Batch<Activity> batch = new Batch<Activity>(activityList, 1);
235235

236-
var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, "roleName", "roleInstance", "00000000 - 0000 - 0000 - 0000 - 000000000000");
236+
var telemetryItems = TraceHelper.OtelToAzureMonitorTrace(batch, "roleName", "roleInstance", "00000000-0000-0000-0000-000000000000");
237237

238238
Assert.Equal(2, telemetryItems.Count());
239-
Assert.Equal("Request", (IEnumerable<char>)telemetryItems[0].Name);
240-
Assert.Equal("Exception", (IEnumerable<char>)telemetryItems[1].Name);
241-
Assert.Equal(exceptionMessage, (IEnumerable<char>)(telemetryItems[1].Data.BaseData as TelemetryExceptionData).Exceptions.First().Message);
242-
Assert.Equal("System.Exception", (IEnumerable<char>)(telemetryItems[1].Data.BaseData as TelemetryExceptionData).Exceptions.First().TypeName);
243-
Assert.Equal("System.Exception: Exception Message", (IEnumerable<char>)(telemetryItems[1].Data.BaseData as TelemetryExceptionData).Exceptions.First().Stack);
239+
Assert.Equal("Exception", (IEnumerable<char>)telemetryItems[0].Name);
240+
Assert.Equal("Request", (IEnumerable<char>)telemetryItems[1].Name);
241+
Assert.Equal(exceptionMessage, (IEnumerable<char>)(telemetryItems[0].Data.BaseData as TelemetryExceptionData).Exceptions.First().Message);
242+
Assert.Equal("System.Exception", (IEnumerable<char>)(telemetryItems[0].Data.BaseData as TelemetryExceptionData).Exceptions.First().TypeName);
243+
Assert.Equal("System.Exception: Exception Message", (IEnumerable<char>)(telemetryItems[0].Data.BaseData as TelemetryExceptionData).Exceptions.First().Stack);
244244
}
245245

246246
[Fact]

0 commit comments

Comments
 (0)