in WEB/Src/DependencyCollector/DependencyCollector/HttpCoreDiagnosticSourceListener.cs [137:259]
public void OnNext(KeyValuePair<string, object> evnt)
{
try
{
// It's possible to host multiple apps (ASP.NET Core or generic hosts) in the same process
// Each of this apps has it's own DependencyTrackingModule and corresponding Http listener.
// We should ignore events for all of them except one
if (!SubscriptionManager.IsActive(this))
{
DependencyCollectorEventSource.Log.NotActiveListenerNoTracking(evnt.Key, Activity.Current?.Id);
return;
}
const string errorTemplateTypeCast = "Event {0}: cannot cast {1} to expected type {2}";
const string errorTemplateValueParse = "Event {0}: cannot parse '{1}' as type {2}";
switch (evnt.Key)
{
case HttpOutStartEventName:
{
var request = this.startRequestFetcher.Fetch(evnt.Value) as HttpRequestMessage;
if (request == null)
{
var error = string.Format(CultureInfo.InvariantCulture, errorTemplateTypeCast, evnt.Key, "request", "HttpRequestMessage");
DependencyCollectorEventSource.Log.HttpCoreDiagnosticSourceListenerOnNextFailed(error);
}
else
{
this.OnActivityStart(request);
}
break;
}
case HttpOutStopEventName:
{
var response = this.stopResponseFetcher.Fetch(evnt.Value) as HttpResponseMessage;
var request = this.stopRequestFetcher.Fetch(evnt.Value) as HttpRequestMessage;
var requestTaskStatusString = this.stopRequestStatusFetcher.Fetch(evnt.Value).ToString();
if (request == null)
{
var error = string.Format(CultureInfo.InvariantCulture, errorTemplateTypeCast, evnt.Key, "request", "HttpRequestMessage");
DependencyCollectorEventSource.Log.HttpCoreDiagnosticSourceListenerOnNextFailed(error);
}
else if (!Enum.TryParse(requestTaskStatusString, out TaskStatus requestTaskStatus))
{
var error = string.Format(CultureInfo.InvariantCulture, errorTemplateValueParse, evnt.Key, requestTaskStatusString, "TaskStatus");
DependencyCollectorEventSource.Log.HttpCoreDiagnosticSourceListenerOnNextFailed(error);
}
else
{
this.OnActivityStop(response, request, requestTaskStatus);
}
break;
}
case DeprecatedRequestEventName:
{
if (this.httpInstrumentationVersion != HttpInstrumentationVersion.V1)
{
// 2.0+ publishes new events, and this should be just ignored to prevent duplicates.
break;
}
var request = this.deprecatedRequestFetcher.Fetch(evnt.Value) as HttpRequestMessage;
var loggingRequestIdString = this.deprecatedRequestGuidFetcher.Fetch(evnt.Value).ToString();
if (request == null)
{
var error = string.Format(CultureInfo.InvariantCulture, errorTemplateTypeCast, evnt.Key, "request", "HttpRequestMessage");
DependencyCollectorEventSource.Log.HttpCoreDiagnosticSourceListenerOnNextFailed(error);
}
else if (!Guid.TryParse(loggingRequestIdString, out Guid loggingRequestId))
{
var error = string.Format(CultureInfo.InvariantCulture, errorTemplateValueParse, evnt.Key, loggingRequestIdString, "Guid");
DependencyCollectorEventSource.Log.HttpCoreDiagnosticSourceListenerOnNextFailed(error);
}
else
{
this.OnRequest(request, loggingRequestId);
}
break;
}
case DeprecatedResponseEventName:
{
if (this.httpInstrumentationVersion != HttpInstrumentationVersion.V1)
{
// 2.0+ publishes new events, and this should be just ignored to prevent duplicates.
break;
}
var response = this.deprecatedResponseFetcher.Fetch(evnt.Value) as HttpResponseMessage;
var loggingRequestIdString = this.deprecatedResponseGuidFetcher.Fetch(evnt.Value).ToString();
if (response == null)
{
var error = string.Format(CultureInfo.InvariantCulture, errorTemplateTypeCast, evnt.Key, "response", "HttpResponseMessage");
DependencyCollectorEventSource.Log.HttpCoreDiagnosticSourceListenerOnNextFailed(error);
}
else if (!Guid.TryParse(loggingRequestIdString, out Guid loggingRequestId))
{
var error = string.Format(CultureInfo.InvariantCulture, errorTemplateValueParse, evnt.Key, loggingRequestIdString, "Guid");
DependencyCollectorEventSource.Log.HttpCoreDiagnosticSourceListenerOnNextFailed(error);
}
else
{
this.OnResponse(response, loggingRequestId);
}
break;
}
}
}
catch (Exception ex)
{
DependencyCollectorEventSource.Log.HttpCoreDiagnosticSourceListenerOnNextFailed(ExceptionUtilities.GetExceptionDetailString(ex));
}
}