diff --git a/sdk/monitor/Microsoft.Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorConverter.cs b/sdk/monitor/Microsoft.Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorConverter.cs index 5a6867b6be3a..e39517445723 100644 --- a/sdk/monitor/Microsoft.Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorConverter.cs +++ b/sdk/monitor/Microsoft.Azure.Monitor.OpenTelemetry.Exporter/src/AzureMonitorConverter.cs @@ -38,6 +38,10 @@ internal static class AzureMonitorConverter [TelemetryType.Event] = "Event", }; + internal static string RoleName { get; set; } = null; + + internal static string RoleInstance { get; set; } = null; + internal static List Convert(Batch batchActivity, string instrumentationKey) { List telemetryItems = new List(); @@ -57,9 +61,9 @@ internal static List Convert(Batch batchActivity, strin internal static TelemetryItem GeneratePartAEnvelope(Activity activity) { TelemetryItem telemetryItem = new TelemetryItem(PartA_Name_Mapping[activity.GetTelemetryType()], activity.StartTimeUtc.ToString(CultureInfo.InvariantCulture)); - ExtractRoleInfo(activity.GetResource(), out var roleName, out var roleInstance); - telemetryItem.Tags[ContextTagKeys.AiCloudRole.ToString()] = roleName; - telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()] = roleInstance; + InitRoleInfo(activity); + telemetryItem.Tags[ContextTagKeys.AiCloudRole.ToString()] = RoleName; + telemetryItem.Tags[ContextTagKeys.AiCloudRoleInstance.ToString()] = RoleInstance; telemetryItem.Tags[ContextTagKeys.AiOperationId.ToString()] = activity.TraceId.ToHexString(); if (activity.Parent != null) { @@ -71,18 +75,22 @@ internal static TelemetryItem GeneratePartAEnvelope(Activity activity) return telemetryItem; } - internal static void ExtractRoleInfo(Resource resource, out string roleName, out string roleInstance) + internal static void InitRoleInfo(Activity activity) { + if (RoleName != null || RoleInstance != null) + { + return; + } + + var resource = activity.GetResource(); + if (resource == null) { - roleName = null; - roleInstance = null; return; } string serviceName = null; string serviceNamespace = null; - roleInstance = null; foreach (var attribute in resource.Attributes) { @@ -96,17 +104,17 @@ internal static void ExtractRoleInfo(Resource resource, out string roleName, out } else if (attribute.Key == Resource.ServiceInstanceIdKey && attribute.Value is string) { - roleInstance = attribute.Value.ToString(); + RoleInstance = attribute.Value.ToString(); } } if (serviceName != null && serviceNamespace != null) { - roleName = string.Concat(serviceNamespace, ".", serviceName); + RoleName = string.Concat(serviceNamespace, ".", serviceName); } else { - roleName = serviceName; + RoleName = serviceName; } } diff --git a/sdk/monitor/Microsoft.Azure.Monitor.OpenTelemetry.Exporter/tests/Microsoft.Azure.Monitor.OpenTelemetry.Exporter.Tests/AzureMonitorConverterTests.cs b/sdk/monitor/Microsoft.Azure.Monitor.OpenTelemetry.Exporter/tests/Microsoft.Azure.Monitor.OpenTelemetry.Exporter.Tests/AzureMonitorConverterTests.cs index 8e68490b1cc9..5b3b4e01cb2b 100644 --- a/sdk/monitor/Microsoft.Azure.Monitor.OpenTelemetry.Exporter/tests/Microsoft.Azure.Monitor.OpenTelemetry.Exporter.Tests/AzureMonitorConverterTests.cs +++ b/sdk/monitor/Microsoft.Azure.Monitor.OpenTelemetry.Exporter/tests/Microsoft.Azure.Monitor.OpenTelemetry.Exporter.Tests/AzureMonitorConverterTests.cs @@ -30,68 +30,81 @@ static AzureMonitorConverterTests() ActivitySource.AddActivityListener(listener); } + public AzureMonitorConverterTests() + { + AzureMonitorConverter.RoleName = null; + AzureMonitorConverter.RoleInstance = null; + } + [Fact] - public void ExtractRoleInfo_NullResource() + public void InitRoleInfo_NullResource() { - AzureMonitorConverter.ExtractRoleInfo(null, out var roleName, out var roleInstance); - Assert.Null(roleName); - Assert.Null(roleInstance); + AzureMonitorConverter.InitRoleInfo(null); + + Assert.Null(AzureMonitorConverter.RoleName); + Assert.Null(AzureMonitorConverter.RoleInstance); } [Fact] - public void ExtractRoleInfo_Empty() + public void InitRoleInfo_Empty() { - var resource = Resources.CreateServiceResource(null); - AzureMonitorConverter.ExtractRoleInfo(resource, out var roleName, out var roleInstance); - Assert.Null(roleName); - Assert.Null(roleInstance); + using var activity = new Activity("InitRoleInfo_Empty"); + activity.SetCustomProperty(ResourcePropertyName, Resources.CreateServiceResource(null)); + + AzureMonitorConverter.InitRoleInfo(activity); + Assert.Null(AzureMonitorConverter.RoleName); + Assert.Null(AzureMonitorConverter.RoleInstance); } [Fact] - public void ExtractRoleInfo_ServiceName() + public void InitRoleInfo_ServiceName() { - var resource = Resources.CreateServiceResource("my-service"); - AzureMonitorConverter.ExtractRoleInfo(resource, out var roleName, out var roleInstance); - Assert.Equal("my-service", roleName); - Assert.True(Guid.TryParse(roleInstance, out var guid)); + using var activity = new Activity("InitRoleInfo_ServiceName"); + activity.SetCustomProperty(ResourcePropertyName, Resources.CreateServiceResource("my-service")); + AzureMonitorConverter.InitRoleInfo(activity); + Assert.Equal("my-service", AzureMonitorConverter.RoleName); + Assert.True(Guid.TryParse(AzureMonitorConverter.RoleInstance, out var guid)); } [Fact] - public void ExtractRoleInfo_ServiceInstance() + public void InitRoleInfo_ServiceInstance() { - var resource = Resources.CreateServiceResource(null, "roleInstance_1"); - AzureMonitorConverter.ExtractRoleInfo(resource, out var roleName, out var roleInstance); - Assert.Empty(resource.Attributes); - Assert.Null(roleName); - Assert.Null(roleInstance); + using var activity = new Activity("InitRoleInfo_ServiceInstance"); + activity.SetCustomProperty(ResourcePropertyName, Resources.CreateServiceResource(null, "roleInstance_1")); + AzureMonitorConverter.InitRoleInfo(activity); + + Assert.Null(AzureMonitorConverter.RoleName); + Assert.Null(AzureMonitorConverter.RoleInstance); } [Fact] - public void ExtractRoleInfo_ServiceNamespace() + public void InitRoleInfo_ServiceNamespace() { - var resource = Resources.CreateServiceResource(null, null, "my-namespace"); - AzureMonitorConverter.ExtractRoleInfo(resource, out var roleName, out var roleInstance); - Assert.Empty(resource.Attributes); - Assert.Null(roleName); - Assert.Null(roleInstance); + using var activity = new Activity("InitRoleInfo_ServiceNamespace"); + activity.SetCustomProperty(ResourcePropertyName, Resources.CreateServiceResource(null, null, "my-namespace")); + AzureMonitorConverter.InitRoleInfo(activity); + Assert.Null(AzureMonitorConverter.RoleName); + Assert.Null(AzureMonitorConverter.RoleInstance); } [Fact] - public void ExtractRoleInfo_ServiceNameAndInstance() + public void InitRoleInfo_ServiceNameAndInstance() { - var resource = Resources.CreateServiceResource("my-service", "roleInstance_1"); - AzureMonitorConverter.ExtractRoleInfo(resource, out var roleName, out var roleInstance); - Assert.Equal("my-service", roleName); - Assert.Equal("roleInstance_1", roleInstance); + using var activity = new Activity("InitRoleInfo_ServiceNameAndInstance"); + activity.SetCustomProperty(ResourcePropertyName, Resources.CreateServiceResource("my-service", "roleInstance_1")); + AzureMonitorConverter.InitRoleInfo(activity); + Assert.Equal("my-service", AzureMonitorConverter.RoleName); + Assert.Equal("roleInstance_1", AzureMonitorConverter.RoleInstance); } [Fact] - public void ExtractRoleInfo_ServiceNameAndInstanceAndNamespace() + public void InitRoleInfo_ServiceNameAndInstanceAndNamespace() { - var resource = Resources.CreateServiceResource("my-service", "roleInstance_1", "my-namespace"); - AzureMonitorConverter.ExtractRoleInfo(resource, out var roleName, out var roleInstance); - Assert.Equal("my-namespace.my-service", roleName); - Assert.Equal("roleInstance_1", roleInstance); + using var activity = new Activity("InitRoleInfo_ServiceNameAndInstanceAndNamespace"); + activity.SetCustomProperty(ResourcePropertyName, Resources.CreateServiceResource("my-service", "roleInstance_1", "my-namespace")); + AzureMonitorConverter.InitRoleInfo(activity); + Assert.Equal("my-namespace.my-service", AzureMonitorConverter.RoleName); + Assert.Equal("roleInstance_1", AzureMonitorConverter.RoleInstance); } [Fact]