public AspNetCoreContext(HttpContext httpContext) { // Make sure a valid HTTP context is specified if (httpContext == null) { throw new ArgumentNullException(nameof(httpContext)); } // Save request, response and session Request = new AspNetCoreRequest(httpContext.Request); Response = new AspNetCoreResponse(httpContext.Response); Session = new AspNetCoreSession(httpContext.User); }
private static void ParseExtensionsLoggingEvent(TraceEvent data, int minRequestDurationMilliseconds, string eventArgs, Dictionary <string, AspNetCoreRequest> aspnetCoreRequests, Dictionary <AspNetCoreRequest, List <AspNetCoreTraceEvent> > failedRequests, Dictionary <AspNetCoreRequestId, List <AspNetCoreTraceEvent> > requestsFullTrace, AspNetCoreRequestEventType eventType) { var loggerName = data.PayloadByName("LoggerName").ToString(); string rawMessage = ""; if (!string.IsNullOrWhiteSpace(eventArgs)) { if (data.PayloadByName(eventArgs) != null) { rawMessage = data.PayloadByName(eventArgs).ToString(); if (rawMessage.ToLower().Contains("StructValue[]".ToLower())) { rawMessage = ""; try { var args = (IDictionary <string, object>[])data.PayloadByName(eventArgs); foreach (IDictionary <string, object> item in args.ToList()) { var dict = item.ToDictionary(x => x.Key, x => x.Value); rawMessage += $" {dict["Key"].ToString()}->[{dict["Value"].ToString()}]"; } } catch (Exception) { } } if (rawMessage.Length > 250) { rawMessage = rawMessage.Substring(0, 250) + "...[REMOVED_AS_MESSAGE_TOO_LARGE]"; } rawMessage = eventType.ToString() + ":" + rawMessage; } } else { rawMessage = eventType.ToString(); } var shortActivityId = StartStopActivityComputer.ActivityPathString(data.ActivityID); foreach (var key in requestsFullTrace.Keys.ToArray()) { if (shortActivityId.StartsWith(key.ShortActivityId)) { AddRawAspNetTraceToDictionary(key, shortActivityId, loggerName, rawMessage, data, requestsFullTrace); break; } } if (CheckAspNetLogger(loggerName) && eventType == AspNetCoreRequestEventType.Start) { if (data.ActivityID != Guid.Empty) { if (!aspnetCoreRequests.ContainsKey(shortActivityId)) { var coreRequest = new AspNetCoreRequest { ShortActivityId = shortActivityId, ProcessId = data.ProcessID, ActivityId = data.ActivityID, RelatedActivityId = StartStopActivityComputer.ActivityPathString(data.RelatedActivityID) }; var arguments = (IDictionary <string, object>[])data.PayloadByName("Arguments"); GetAspnetCoreRequestDetailsFromArgs(arguments.ToList(), out coreRequest.Path, out coreRequest.RequestId); coreRequest.StartTimeRelativeMSec = data.TimeStampRelativeMSec; if (!string.IsNullOrWhiteSpace(coreRequest.Path) && !string.IsNullOrWhiteSpace(coreRequest.RequestId)) { aspnetCoreRequests.Add(shortActivityId, coreRequest); } } AspNetCoreRequestId requestId = new AspNetCoreRequestId { ShortActivityId = shortActivityId, ActivityId = data.ActivityID }; AddRawAspNetTraceToDictionary(requestId, shortActivityId, loggerName, rawMessage, data, requestsFullTrace); } } if (CheckAspNetLogger(loggerName) && eventType == AspNetCoreRequestEventType.Stop) { if (data.ActivityID != Guid.Empty) { if (aspnetCoreRequests.TryGetValue(shortActivityId, out AspNetCoreRequest coreRequest)) { // // We are setting EndTime in 'Request finished' as well. Not // sure which is the correct one right now, so doing it both. // coreRequest.EndTimeRelativeMSec = data.TimeStampRelativeMSec; if ((coreRequest.EndTimeRelativeMSec - coreRequest.StartTimeRelativeMSec) < minRequestDurationMilliseconds) { var keyToRemove = requestsFullTrace.Keys.Where(x => x.ShortActivityId == coreRequest.ShortActivityId).FirstOrDefault(); if (keyToRemove != null) { requestsFullTrace.Remove(keyToRemove); } } } } } if (CheckAspNetLogger(loggerName) && eventType == AspNetCoreRequestEventType.Message) { string formattedMessage = string.Empty; if (data.PayloadByName("FormattedMessage") != null) { formattedMessage = data.PayloadByName("FormattedMessage").ToString(); } else if (data.PayloadByName("EventName") != null) { formattedMessage = data.PayloadByName("EventName").ToString(); } if (data.ActivityID != Guid.Empty) { if (formattedMessage.StartsWith("Request finished", StringComparison.OrdinalIgnoreCase)) { if (aspnetCoreRequests.TryGetValue(shortActivityId, out AspNetCoreRequest coreRequest)) { int statusCode = GetStatusCodeFromRequestFinishedMessage(formattedMessage); if (statusCode > 0) { coreRequest.StatusCode = statusCode; coreRequest.EndTimeRelativeMSec = data.TimeStampRelativeMSec; } if (statusCode >= 500) { AspNetCoreRequestId requestId = new AspNetCoreRequestId { ShortActivityId = shortActivityId, ActivityId = data.ActivityID }; var requestFullTraceFailedRequest = requestsFullTrace.Where(x => x.Key.ShortActivityId == coreRequest.ShortActivityId).FirstOrDefault(); if (requestFullTraceFailedRequest.Value != null && failedRequests.Count() < MAX_FAILED_REQUESTS_TO_TRACE) { failedRequests.Add(coreRequest.Clone(), requestFullTraceFailedRequest.Value.ToArray().ToList()); } } } } } } }