public void AddEventStopCallback(TraceSourceManager source, DynamicTraceEventParser dynamicParser, string provider) { // For some crossgen2 events (ex: jitting), there could be multiple start&stop pairs within one process, thus we sum up // time elapsed between each pair as the interval of this event. dynamicParser.AddCallbackForProviderEvent(provider, $"{EventName}/Stop", evt => { if (Pid.HasValue && ParserUtility.MatchSingleProcessID(evt, source, (int)Pid)) { // Get time elapsed for this pair of start&stop events double interval = evt.TimeStampRelativeMSec - Start; // If previous pid exists, this is the same process and time elapsed is added to the last value in the stack. if (PrevPid.HasValue && ParserUtility.MatchSingleProcessID(evt, source, (int)PrevPid)) { double lastValue = Intervals.Pop(); Intervals.Push(lastValue + interval); } // If previous pid doesn't exist, this is the next process and time elapsed is a new value pushed to the stack. else { Intervals.Push(interval); } Start = 0; PrevPid = Pid; Pid = null; } }); }
public void AddEventStartCallback(TraceSourceManager source, DynamicTraceEventParser dynamicParser, string provider, IList <int> pids) { dynamicParser.AddCallbackForProviderEvent(provider, $"{EventName}/Start", evt => { if (!Pid.HasValue && ParserUtility.MatchProcessID(evt, source, pids)) { Pid = evt.ProcessID; Start = evt.TimeStampRelativeMSec; } }); }
public static AspNetCoreParserResults ParseDotNetCoreRequests(Microsoft.Diagnostics.Tracing.Etlx.TraceLog dataFile, int minRequestDurationMilliseconds) { AspNetCoreParserResults results = new AspNetCoreParserResults(); var processes = new List <AspNetCoreProcess>(); var aspnetCoreRequests = new Dictionary <string, AspNetCoreRequest>(); var requestsFullTrace = new Dictionary <AspNetCoreRequestId, List <AspNetCoreTraceEvent> >(); var failedRequests = new Dictionary <AspNetCoreRequest, List <AspNetCoreTraceEvent> >(); try { var source = dataFile.Events.GetSource(); var parser = new DynamicTraceEventParser(source); var clrParser = new ClrTraceEventParser(source); parser.AddCallbackForProviderEvent(MicrosoftExtensionsLoggingProvider, StartEvent, delegate(TraceEvent data) { ParseExtensionsLoggingEvent(data, minRequestDurationMilliseconds, "Arguments", aspnetCoreRequests, failedRequests, requestsFullTrace, AspNetCoreRequestEventType.Start); }); parser.AddCallbackForProviderEvent(MicrosoftExtensionsLoggingProvider, StopEvent, delegate(TraceEvent data) { ParseExtensionsLoggingEvent(data, minRequestDurationMilliseconds, string.Empty, aspnetCoreRequests, failedRequests, requestsFullTrace, AspNetCoreRequestEventType.Stop); }); parser.AddCallbackForProviderEvent(MicrosoftExtensionsLoggingProvider, FormatMessageEvent, delegate(TraceEvent data) { ParseExtensionsLoggingEvent(data, minRequestDurationMilliseconds, "FormattedMessage", aspnetCoreRequests, failedRequests, requestsFullTrace, AspNetCoreRequestEventType.Message); }); clrParser.ThreadPoolWorkerThreadWait += delegate(ThreadPoolWorkerThreadTraceData data) { if (!processes.Any(p => p.Id == data.ProcessID && p.Name == data.ProcessName)) { var coreProcess = new AspNetCoreProcess { Id = data.ProcessID, Name = data.ProcessName }; processes.Add(coreProcess); } }; source.Process(); } catch (Exception ex) { Logger.LogDiagnoserErrorEvent("Failed while parsing .net core events", ex); } foreach (var request in aspnetCoreRequests.Values) { if (request.EndTimeRelativeMSec == 0) { request.EndTimeRelativeMSec = dataFile.SessionEndTimeRelativeMSec; request.IncompleteRequest = true; } } results.AspNetCoreRequestsFullTrace = requestsFullTrace; results.Requests = aspnetCoreRequests; results.Processes = processes; results.FailedRequests = failedRequests; return(results); }