Skip to content

Commit 7aa356f

Browse files
Operation name mapping for server spans (Azure#23448)
* operation name mapping * update mapping as per CS
1 parent 3dfbbb1 commit 7aa356f

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TelemetryPartA.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ internal class TelemetryPartA
3131

3232
internal static string RoleInstance { get; set; }
3333

34-
#pragma warning disable CA1801 // Review unused parameters
3534
internal static TelemetryItem GetTelemetryItem(Activity activity, ref TagEnumerationState monitorTags, Resource resource, string instrumentationKey)
36-
#pragma warning restore CA1801 // Review unused parameters
3735
{
3836
TelemetryItem telemetryItem = new TelemetryItem(PartA_Name_Mapping[activity.GetTelemetryType()], FormatUtcTimestamp(activity.StartTimeUtc))
3937
{
@@ -45,6 +43,13 @@ internal static TelemetryItem GetTelemetryItem(Activity activity, ref TagEnumera
4543
telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()] = RoleInstance;
4644
telemetryItem.Tags[ContextTagKeys.AiOperationId.ToString()] = activity.TraceId.ToHexString();
4745

46+
// we only have mapping for server spans
47+
// todo: non-server spans
48+
if (activity.Kind == ActivityKind.Server)
49+
{
50+
telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()] = GetOperationName(activity, ref monitorTags.PartBTags);
51+
}
52+
4853
if (activity.ParentSpanId != default)
4954
{
5055
telemetryItem.Tags[ContextTagKeys.AiOperationParentId.ToString()] = activity.ParentSpanId.ToHexString();
@@ -55,6 +60,17 @@ internal static TelemetryItem GetTelemetryItem(Activity activity, ref TagEnumera
5560
return telemetryItem;
5661
}
5762

63+
private static string GetOperationName(Activity activity, ref AzMonList partBTags)
64+
{
65+
var httpMethod = AzMonList.GetTagValue(ref partBTags, SemanticConventions.AttributeHttpMethod)?.ToString();
66+
if (!string.IsNullOrWhiteSpace(httpMethod))
67+
{
68+
return $"{httpMethod} {activity.DisplayName}";
69+
}
70+
71+
return activity.DisplayName;
72+
}
73+
5874
internal static TelemetryItem GetTelemetryItem(LogRecord logRecord, string instrumentationKey)
5975
{
6076
var name = PartA_Name_Mapping[TelemetryType.Message];

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

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,47 @@ public void GeneratePartAEnvelope_Activity_WithParentSpanId()
183183
Assert.Equal(activity.ParentSpanId.ToHexString(), telemetryItem.Tags[ContextTagKeys.AiOperationParentId.ToString()]);
184184
}
185185

186-
// TODO: GeneratePartAEnvelope_WithActivityParent
186+
[Fact]
187+
public void HttpMethodAndActivityNameIsUsedForHttpRequestOperationName()
188+
{
189+
using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
190+
using var activity = activitySource.StartActivity(
191+
ActivityName,
192+
ActivityKind.Server,
193+
null,
194+
startTime: DateTime.UtcNow);
195+
var resource = CreateTestResource();
196+
197+
activity.DisplayName = "/getaction";
198+
199+
activity.SetTag(SemanticConventions.AttributeHttpMethod, "GET");
200+
201+
var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);
202+
203+
var telemetryItem = TelemetryPartA.GetTelemetryItem(activity, ref monitorTags, resource, null);
204+
205+
Assert.Equal("GET /getaction", telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()]);
206+
}
207+
208+
[Fact]
209+
public void ActivityNameIsUsedByDefaultForRequestOperationName()
210+
{
211+
using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
212+
using var activity = activitySource.StartActivity(
213+
ActivityName,
214+
ActivityKind.Server,
215+
null,
216+
startTime: DateTime.UtcNow);
217+
var resource = CreateTestResource();
218+
219+
activity.DisplayName = "displayname";
220+
221+
var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);
222+
223+
var telemetryItem = TelemetryPartA.GetTelemetryItem(activity, ref monitorTags, resource, null);
224+
225+
Assert.Equal("displayname", telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()]);
226+
}
187227

188228
/// <summary>
189229
/// If SERVICE.NAME is not defined, it will fall-back to "unknown_service".

0 commit comments

Comments
 (0)