Skip to content

Commit 109a51b

Browse files
Add db.name to custom properties (Azure#36389)
* add db.name to custom properties * refactor * fix build * address pr comments * test * fix test * use tuple as return type
1 parent 7378996 commit 109a51b

File tree

4 files changed

+26
-18
lines changed

4 files changed

+26
-18
lines changed

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ internal partial class RemoteDependencyData
1717

1818
public RemoteDependencyData(int version, Activity activity, ref ActivityTagsProcessor activityTagsProcessor) : base(version)
1919
{
20+
Properties = new ChangeTrackingDictionary<string, string>();
21+
Measurements = new ChangeTrackingDictionary<string, double>();
22+
2023
string? httpUrl = null;
2124
string dependencyName;
2225

@@ -50,7 +53,15 @@ public RemoteDependencyData(int version, Activity activity, ref ActivityTagsProc
5053
case OperationType.Db:
5154
var depDataAndType = AzMonList.GetTagValues(ref activityTagsProcessor.MappedTags, SemanticConventions.AttributeDbStatement, SemanticConventions.AttributeDbSystem);
5255
Data = depDataAndType[0]?.ToString().Truncate(SchemaConstants.RemoteDependencyData_Data_MaxLength);
53-
Target = activityTagsProcessor.MappedTags.GetDbDependencyTarget().Truncate(SchemaConstants.RemoteDependencyData_Target_MaxLength);
56+
var dbNameAndTarget = activityTagsProcessor.MappedTags.GetDbDependencyTargetAndName();
57+
Target = dbNameAndTarget.DbTarget.Truncate(SchemaConstants.RemoteDependencyData_Target_MaxLength);
58+
59+
// special case for db.name
60+
var sanitizedDbName = dbNameAndTarget.DbName.Truncate(SchemaConstants.KVP_MaxValueLength);
61+
if (sanitizedDbName != null)
62+
{
63+
Properties.Add(SemanticConventions.AttributeDbName, sanitizedDbName);
64+
}
5465
Type = s_sqlDbs.Contains(depDataAndType[1]?.ToString()) ? "SQL" : depDataAndType[1]?.ToString().Truncate(SchemaConstants.RemoteDependencyData_Type_MaxLength);
5566
break;
5667
case OperationType.Rpc:
@@ -84,9 +95,6 @@ public RemoteDependencyData(int version, Activity activity, ref ActivityTagsProc
8495
Type = "InProc";
8596
}
8697

87-
Properties = new ChangeTrackingDictionary<string, string>();
88-
Measurements = new ChangeTrackingDictionary<string, double>();
89-
9098
TraceHelper.AddActivityLinksToProperties(activity, ref activityTagsProcessor.UnMappedTags);
9199
TraceHelper.AddPropertiesToTelemetry(Properties, ref activityTagsProcessor.UnMappedTags);
92100
}

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,9 @@ internal static string GetDefaultDbPort(string? dbSystem)
287287
}
288288

289289
///<summary>
290-
/// Gets Database dependency target from activity tag objects.
290+
/// Gets Database dependency target and name from activity tag objects.
291291
///</summary>
292-
internal static string? GetDbDependencyTarget(this AzMonList tagObjects)
292+
internal static (string? DbName, string? DbTarget) GetDbDependencyTargetAndName(this AzMonList tagObjects)
293293
{
294294
string? target = null;
295295
string defaultPort = GetDefaultDbPort(AzMonList.GetTagValue(ref tagObjects, SemanticConventions.AttributeDbSystem)?.ToString());
@@ -303,7 +303,7 @@ internal static string GetDefaultDbPort(string? dbSystem)
303303
target = tagObjects.GetTargetUsingNetPeerAttributes(defaultPort);
304304
}
305305

306-
string? dbName = AzMonList.GetTagValue(ref tagObjects, SemanticConventions.AttributeDbName)?.ToString();
306+
var dbName = AzMonList.GetTagValue(ref tagObjects, SemanticConventions.AttributeDbName)?.ToString();
307307
bool isTargetEmpty = string.IsNullOrWhiteSpace(target);
308308
bool isDbNameEmpty = string.IsNullOrWhiteSpace(dbName);
309309
if (!isTargetEmpty && !isDbNameEmpty)
@@ -319,7 +319,7 @@ internal static string GetDefaultDbPort(string? dbSystem)
319319
target = AzMonList.GetTagValue(ref tagObjects, SemanticConventions.AttributeDbSystem)?.ToString();
320320
}
321321

322-
return target;
322+
return (DbName: dbName, DbTarget: target);
323323
}
324324

325325
///<summary>
@@ -332,7 +332,7 @@ internal static string GetDefaultDbPort(string? dbSystem)
332332
case OperationType.Http:
333333
return tagObjects.GetHttpDependencyTarget();
334334
case OperationType.Db:
335-
return tagObjects.GetDbDependencyTarget();
335+
return tagObjects.GetDbDependencyTargetAndName().DbTarget;
336336
default:
337337
return null;
338338
}

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -574,34 +574,30 @@ public void DbNameIsAppendedToTargetDerivedFromNetAttributesforDBDependencyTarge
574574
hostName = $"{netPeerIp}:{netPeerPort}";
575575
}
576576
string expectedTarget = $"{hostName} | DbName";
577-
string? target = mappedTags.GetDbDependencyTarget();
578-
Assert.Equal(expectedTarget, target);
577+
Assert.Equal(expectedTarget, mappedTags.GetDbDependencyTargetAndName().DbTarget);
579578
}
580579

581580
[Fact]
582581
public void DbDependencyTargetIsSetToDbNameWhenNetAttributesAreNotPresent()
583582
{
584583
var mappedTags = AzMonList.Initialize();
585584
AzMonList.Add(ref mappedTags, new KeyValuePair<string, object?>(SemanticConventions.AttributeDbName, "DbName"));
586-
string? target = mappedTags.GetDbDependencyTarget();
587-
Assert.Equal("DbName", target);
585+
Assert.Equal("DbName", mappedTags.GetDbDependencyTargetAndName().DbTarget);
588586
}
589587

590588
[Fact]
591589
public void DbDependencyTargetIsSetToDbSystemWhenNetAndDbNameAttributesAreNotPresent()
592590
{
593591
var mappedTags = AzMonList.Initialize();
594592
AzMonList.Add(ref mappedTags, new KeyValuePair<string, object?>(SemanticConventions.AttributeDbSystem, "DbSystem"));
595-
string? target = mappedTags.GetDbDependencyTarget();
596-
Assert.Equal("DbSystem", target);
593+
Assert.Equal("DbSystem", mappedTags.GetDbDependencyTargetAndName().DbTarget);
597594
}
598595

599596
[Fact]
600597
public void DbDependencyTargetIsSetToNullByDefault()
601598
{
602599
var mappedTags = AzMonList.Initialize();
603-
string? target = mappedTags.GetDbDependencyTarget();
604-
Assert.Null(target);
600+
Assert.Null(mappedTags.GetDbDependencyTargetAndName().DbTarget);
605601
}
606602
}
607603
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Generic;
56
using System.Diagnostics;
67
using System.Globalization;
78

@@ -134,6 +135,7 @@ public void ValidateDbRemoteDependencyData()
134135
activity.Stop();
135136

136137
activity.SetStatus(Status.Ok);
138+
activity.SetTag(SemanticConventions.AttributeDbName, "mysqlserver");
137139
activity.SetTag(SemanticConventions.AttributeDbSystem, "mssql");
138140
activity.SetTag(SemanticConventions.AttributePeerService, "localhost"); // only adding test via peer.service. all possible combinations are covered in AzMonListExtensionsTests.
139141
activity.SetTag(SemanticConventions.AttributeDbStatement, "Select * from table");
@@ -145,10 +147,12 @@ public void ValidateDbRemoteDependencyData()
145147
Assert.Equal(ActivityName, remoteDependencyData.Name);
146148
Assert.Equal(activity.Context.SpanId.ToHexString(), remoteDependencyData.Id);
147149
Assert.Equal("Select * from table", remoteDependencyData.Data);
150+
Assert.Equal("localhost | mysqlserver", remoteDependencyData.Target);
148151
Assert.Null(remoteDependencyData.ResultCode);
149152
Assert.Equal(activity.Duration.ToString("c", CultureInfo.InvariantCulture), remoteDependencyData.Duration);
150153
Assert.Equal(activity.GetStatus() != Status.Error, remoteDependencyData.Success);
151-
Assert.True(remoteDependencyData.Properties.Count == 0);
154+
Assert.True(remoteDependencyData.Properties.Count == 1);
155+
Assert.True(remoteDependencyData.Properties.Contains(new KeyValuePair<string, string>(SemanticConventions.AttributeDbName, "mysqlserver" )));
152156
Assert.True(remoteDependencyData.Measurements.Count == 0);
153157
}
154158

0 commit comments

Comments
 (0)