diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md index 7d0c08c67eec..da959d33c89e 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/CHANGELOG.md @@ -8,6 +8,9 @@ ### Bugs Fixed +* Always set Dependency.Target to "server.address" and "server.port" if present. + ([#48317](https://github.com/Azure/azure-sdk-for-net/pull/48317)) + ### Other Changes ## 1.4.0-beta.2 (2024-10-11) diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/RemoteDependencyData.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/RemoteDependencyData.cs index 3c6767fad2e4..d09c636d9ed3 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/RemoteDependencyData.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Customizations/Models/RemoteDependencyData.cs @@ -3,7 +3,6 @@ using System.Diagnostics; using System.Globalization; -using Azure.Core; using Azure.Monitor.OpenTelemetry.Exporter.Internals; namespace Azure.Monitor.OpenTelemetry.Exporter.Models @@ -34,6 +33,9 @@ public RemoteDependencyData(int version, Activity activity, ref ActivityTagsProc case OperationType.Messaging: SetMessagingDependencyProperties(activity, ref activityTagsProcessor.MappedTags); break; + default: + Target = activityTagsProcessor.MappedTags.GetTargetUsingServerAddressAndPort(); + break; } dependencyName ??= activity.DisplayName; diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/AzMonListExtensions.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/AzMonListExtensions.cs index 90c60104ac8a..132777870ce7 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/AzMonListExtensions.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/Internals/AzMonListExtensions.cs @@ -261,6 +261,24 @@ internal static string GetDefaultDbPort(string? dbSystem) return target; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static string? GetTargetUsingServerAddressAndPort(this AzMonList tagObjects) + { + var serverAttributes = AzMonList.GetTagValues(ref tagObjects, SemanticConventions.AttributeServerAddress, SemanticConventions.AttributeServerPort); + + var serverAddress = serverAttributes[0]?.ToString(); + if (!string.IsNullOrEmpty(serverAddress)) + { + var serverPort = serverAttributes[1]?.ToString(); + + return string.IsNullOrEmpty(serverPort) + ? serverAddress + : serverAddress + ":" + serverPort; + } + + return null; + } + /// /// Gets Http dependency target from activity tag objects. /// diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/RemoteDependencyDataTests.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/RemoteDependencyDataTests.cs index ed218ba86c6c..f2108aa0af22 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/RemoteDependencyDataTests.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/RemoteDependencyDataTests.cs @@ -190,5 +190,46 @@ public void HttpDependencyNameIsActivityDisplayNameByDefault() Assert.Equal(activity.DisplayName, remoteDependencyDataName); } + + [Fact] + public void VerifyAllDependenciesSetTargetViaServerAddress() + { + using ActivitySource activitySource = new ActivitySource(ActivitySourceName); + using var activity = activitySource.StartActivity( + ActivityName, + ActivityKind.Client, + parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded), + startTime: DateTime.UtcNow); + + Assert.NotNull(activity); + activity.SetTag(SemanticConventions.AttributeServerAddress, "unitTestAddress"); + + var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); + + var remoteDependencyData = new RemoteDependencyData(2, activity, ref activityTagsProcessor); + + Assert.Equal("unitTestAddress", remoteDependencyData.Target); + } + + [Fact] + public void VerifyAllDependenciesSetTargetViaServerAddressAndPort() + { + using ActivitySource activitySource = new ActivitySource(ActivitySourceName); + using var activity = activitySource.StartActivity( + ActivityName, + ActivityKind.Client, + parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded), + startTime: DateTime.UtcNow); + + Assert.NotNull(activity); + activity.SetTag(SemanticConventions.AttributeServerAddress, "unitTestAddress"); + activity.SetTag(SemanticConventions.AttributeServerPort, "unitTestPort"); + + var activityTagsProcessor = TraceHelper.EnumerateActivityTags(activity); + + var remoteDependencyData = new RemoteDependencyData(2, activity, ref activityTagsProcessor); + + Assert.Equal("unitTestAddress:unitTestPort", remoteDependencyData.Target); + } } }