From ba5286350c899bcd0f0e91b172be7098883670c3 Mon Sep 17 00:00:00 2001 From: Vishwesh Bankwar Date: Thu, 26 Aug 2021 10:16:08 -0700 Subject: [PATCH] Add InProc dependency type and update db target mapping. (#23541) * update target for db and add inproc type * minor fix on tests * resolve PR comments --- .../src/HttpHelper.cs | 27 ++++++++- .../src/TagEnumerationState.cs | 1 + .../src/TelemetryPartB.cs | 7 ++- .../HttpHelperTests.cs | 58 ++++++++++++++++++- .../TelemetryPartBTests.cs | 20 +++++++ 5 files changed, 110 insertions(+), 3 deletions(-) diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/HttpHelper.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/HttpHelper.cs index 92a01a7774cc..7d831a6f8f55 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/HttpHelper.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/HttpHelper.cs @@ -219,7 +219,32 @@ internal static string GetHostUsingNetPeerAttributes(this AzMonList tagObjects) } /// - /// Gets http dependency target from activity tag objects. + /// Gets Database dependency target from activity tag objects. + /// + internal static string GetDbDependencyTarget(this AzMonList tagObjects) + { + string target = tagObjects.GetDependencyTarget(PartBType.Db); + string dbName = AzMonList.GetTagValue(ref tagObjects, SemanticConventions.AttributeDbName)?.ToString(); + bool isTargetEmpty = string.IsNullOrEmpty(target); + bool isDbNameEmpty = string.IsNullOrEmpty(dbName); + if (!isTargetEmpty && !isDbNameEmpty) + { + target = $"{target}/{dbName}"; + } + else if (isTargetEmpty && !isDbNameEmpty) + { + target = dbName; + } + else if (isTargetEmpty && isDbNameEmpty) + { + target = AzMonList.GetTagValue(ref tagObjects, SemanticConventions.AttributeDbSystem)?.ToString(); + } + + return target; + } + + /// + /// Gets Http dependency target from activity tag objects. /// internal static string GetDependencyTarget(this AzMonList tagObjects, PartBType type) { diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TagEnumerationState.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TagEnumerationState.cs index 3bf71d668679..4d3180b02700 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TagEnumerationState.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TagEnumerationState.cs @@ -14,6 +14,7 @@ internal struct TagEnumerationState { [SemanticConventions.AttributeDbStatement] = PartBType.Db, [SemanticConventions.AttributeDbSystem] = PartBType.Db, + [SemanticConventions.AttributeDbName] = PartBType.Db, [SemanticConventions.AttributeHttpMethod] = PartBType.Http, [SemanticConventions.AttributeHttpUrl] = PartBType.Http, diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TelemetryPartB.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TelemetryPartB.cs index cd2154bf7ff2..65a99f2c8811 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TelemetryPartB.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/src/TelemetryPartB.cs @@ -78,7 +78,7 @@ internal static RemoteDependencyData GetRemoteDependencyData(Activity activity, case PartBType.Db: var depDataAndType = AzMonList.GetTagValues(ref monitorTags.PartBTags, SemanticConventions.AttributeDbStatement, SemanticConventions.AttributeDbSystem); dependency.Data = depDataAndType[0]?.ToString(); - dependency.Target = monitorTags.PartBTags.GetDependencyTarget(PartBType.Db); + dependency.Target = monitorTags.PartBTags.GetDbDependencyTarget(); dependency.Type = SqlDbs.Contains(depDataAndType[1]?.ToString()) ? "SQL" : depDataAndType[1]?.ToString(); break; case PartBType.Rpc: @@ -94,6 +94,11 @@ internal static RemoteDependencyData GetRemoteDependencyData(Activity activity, break; } + if (activity.Kind == ActivityKind.Internal && activity.Parent != null) + { + dependency.Type = "InProc"; + } + AddPropertiesToTelemetry(dependency.Properties, ref monitorTags.PartCTags); return dependency; diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/HttpHelperTests.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/HttpHelperTests.cs index 3c0ba2e1aaf6..ff1e34447176 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/HttpHelperTests.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/HttpHelperTests.cs @@ -431,7 +431,7 @@ internal void DependencyTargetIsSetUsingNetPeerName(string httpScheme, string po [InlineData("https", "8888", PartBType.Http)] [InlineData("https", "1433", PartBType.Db)] [InlineData("https", "8888", PartBType.Db)] - internal void HttpDependencyTargetIsSetUsingNetPeerIp(string httpScheme, string port, PartBType type) + internal void DependencyTargetIsSetUsingNetPeerIp(string httpScheme, string port, PartBType type) { var PartBTags = AzMonList.Initialize(); AzMonList.Add(ref PartBTags, new KeyValuePair(SemanticConventions.AttributeHttpScheme, httpScheme)); @@ -544,5 +544,61 @@ internal void DependencyTargetIsNullByDefault(PartBType type) string target = PartBTags.GetDependencyTarget(type); Assert.Null(target); } + + [Theory] + [InlineData("peerservice", null, null, null)] + [InlineData(null, "servicename.com", null, "8888")] + [InlineData(null, null, "127.0.0.1", "8888")] + public void DbNameIsAppendedToTargetDerivedFromNetAttributesforDBDependencyTarget(string peerService, string netPeerName, string netPeerIp, string netPeerPort) + { + var PartBTags = AzMonList.Initialize(); + AzMonList.Add(ref PartBTags, new KeyValuePair(SemanticConventions.AttributePeerService, peerService)); + AzMonList.Add(ref PartBTags, new KeyValuePair(SemanticConventions.AttributeNetPeerName, netPeerName)); + AzMonList.Add(ref PartBTags, new KeyValuePair(SemanticConventions.AttributeNetPeerIp, netPeerIp)); + AzMonList.Add(ref PartBTags, new KeyValuePair(SemanticConventions.AttributeNetPeerPort, netPeerPort)); + AzMonList.Add(ref PartBTags, new KeyValuePair(SemanticConventions.AttributeDbName, "DbName")); + string hostName = null; + if (peerService != null) + { + hostName = peerService; + } + if (netPeerName != null) + { + hostName = $"{netPeerName}:{netPeerPort}"; + } + if (netPeerIp != null) + { + hostName = $"{netPeerIp}:{netPeerPort}"; + } + string expectedTarget = $"{hostName}/DbName"; + string target = PartBTags.GetDbDependencyTarget(); + Assert.Equal(expectedTarget, target); + } + + [Fact] + public void DbDependencyTargetIsSetToDbNameWhenNetAttributesAreNotPresent() + { + var PartBTags = AzMonList.Initialize(); + AzMonList.Add(ref PartBTags, new KeyValuePair(SemanticConventions.AttributeDbName, "DbName")); + string target = PartBTags.GetDbDependencyTarget(); + Assert.Equal("DbName", target); + } + + [Fact] + public void DbDependencyTargetIsSetToDbSystemWhenNetAndDbNameAttributesAreNotPresent() + { + var PartBTags = AzMonList.Initialize(); + AzMonList.Add(ref PartBTags, new KeyValuePair(SemanticConventions.AttributeDbSystem, "DbSystem")); + string target = PartBTags.GetDbDependencyTarget(); + Assert.Equal("DbSystem", target); + } + + [Fact] + public void DbDependencyTargetIsSetToNullByDefault() + { + var PartBTags = AzMonList.Initialize(); + string target = PartBTags.GetDbDependencyTarget(); + Assert.Null(target); + } } } diff --git a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryPartBTests.cs b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryPartBTests.cs index b21efeefc8a0..860ef6789799 100644 --- a/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryPartBTests.cs +++ b/sdk/monitor/Azure.Monitor.OpenTelemetry.Exporter/tests/Azure.Monitor.OpenTelemetry.Exporter.Tests/TelemetryPartBTests.cs @@ -141,5 +141,25 @@ public void ValidateDBDependencyType(string dbSystem) Assert.Equal(expectedType, remoteDependencyDataType); } + + [Fact] + public void DependencyTypeisSetToInProcForInternalSpanWithParent() + { + using ActivitySource activitySource = new ActivitySource(ActivitySourceName); + using var parentActivity = activitySource.StartActivity("ParentActivity", ActivityKind.Internal); + using var childActivity = activitySource.StartActivity("ChildActivity", ActivityKind.Internal); + + var monitorTagsParent = AzureMonitorConverter.EnumerateActivityTags(parentActivity); + + var remoteDependencyDataTypeForParent = TelemetryPartB.GetRemoteDependencyData(parentActivity, ref monitorTagsParent).Type; + + Assert.Null(remoteDependencyDataTypeForParent); + + var monitorTagsChild = AzureMonitorConverter.EnumerateActivityTags(childActivity); + + var remoteDependencyDataTypeForChild = TelemetryPartB.GetRemoteDependencyData(childActivity, ref monitorTagsChild).Type; + + Assert.Equal("InProc", remoteDependencyDataTypeForChild); + } } }