Skip to content

Commit

Permalink
Add InProc dependency type and update db target mapping. (Azure#23541)
Browse files Browse the repository at this point in the history
* update target for db and add inproc type

* minor fix on tests

* resolve PR comments
  • Loading branch information
vishweshbankwar authored Aug 26, 2021
1 parent 66c0647 commit ba52863
Show file tree
Hide file tree
Showing 5 changed files with 110 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,32 @@ internal static string GetHostUsingNetPeerAttributes(this AzMonList tagObjects)
}

///<summary>
/// Gets http dependency target from activity tag objects.
/// Gets Database dependency target from activity tag objects.
///</summary>
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;
}

///<summary>
/// Gets Http dependency target from activity tag objects.
///</summary>
internal static string GetDependencyTarget(this AzMonList tagObjects, PartBType type)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<string, object>(SemanticConventions.AttributeHttpScheme, httpScheme));
Expand Down Expand Up @@ -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<string, object>(SemanticConventions.AttributePeerService, peerService));
AzMonList.Add(ref PartBTags, new KeyValuePair<string, object>(SemanticConventions.AttributeNetPeerName, netPeerName));
AzMonList.Add(ref PartBTags, new KeyValuePair<string, object>(SemanticConventions.AttributeNetPeerIp, netPeerIp));
AzMonList.Add(ref PartBTags, new KeyValuePair<string, object>(SemanticConventions.AttributeNetPeerPort, netPeerPort));
AzMonList.Add(ref PartBTags, new KeyValuePair<string, object>(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<string, object>(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<string, object>(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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}

0 comments on commit ba52863

Please sign in to comment.