in WEB/Src/DependencyCollector/DependencyCollector/TelemetryDiagnosticSourceListener.cs [78:194]
internal static DependencyTelemetry ExtractDependencyTelemetry(DiagnosticListener diagnosticListener, Activity currentActivity)
{
DependencyTelemetry telemetry = new DependencyTelemetry
{
Id = currentActivity.Id,
Duration = currentActivity.Duration,
Name = currentActivity.OperationName,
};
Uri requestUri = null;
string component = null;
string queryStatement = null;
string httpUrl = null;
string peerAddress = null;
string peerService = null;
foreach (KeyValuePair<string, string> tag in currentActivity.Tags)
{
// interpret Tags as defined by OpenTracing conventions
// https://github.com/opentracing/specification/blob/master/semantic_conventions.md
switch (tag.Key)
{
case "component":
{
component = tag.Value;
break;
}
case "db.statement":
{
queryStatement = tag.Value;
break;
}
case "error":
{
if (bool.TryParse(tag.Value, out var failed))
{
telemetry.Success = !failed;
continue; // skip Properties
}
break;
}
case "http.status_code":
{
telemetry.ResultCode = tag.Value;
continue; // skip Properties
}
case "http.method":
{
continue; // skip Properties
}
case "http.url":
{
httpUrl = tag.Value;
if (Uri.TryCreate(tag.Value, UriKind.RelativeOrAbsolute, out requestUri))
{
continue; // skip Properties
}
break;
}
case "peer.address":
{
peerAddress = tag.Value;
break;
}
case "peer.hostname":
{
telemetry.Target = tag.Value;
continue; // skip Properties
}
case "peer.service":
{
peerService = tag.Value;
break;
}
}
// if more than one tag with the same name is specified, the first one wins
// TODO verify if still needed once https://github.com/Microsoft/ApplicationInsights-dotnet/issues/562 is resolved
if (!telemetry.Properties.ContainsKey(tag.Key))
{
telemetry.Properties.Add(tag);
}
}
if (string.IsNullOrEmpty(telemetry.Type))
{
telemetry.Type = peerService ?? component ?? diagnosticListener.Name;
}
if (string.IsNullOrEmpty(telemetry.Target))
{
// 'peer.address' can be not user-friendly, thus use only if nothing else specified
telemetry.Target = requestUri?.Host ?? peerAddress;
}
if (string.IsNullOrEmpty(telemetry.Name))
{
telemetry.Name = currentActivity.OperationName;
}
if (string.IsNullOrEmpty(telemetry.Data))
{
telemetry.Data = queryStatement ?? requestUri?.OriginalString ?? httpUrl;
}
return telemetry;
}