public void OnNext()

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));
            }
        }