예제 #1
0
 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;
         }
     });
 }
예제 #2
0
 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;
         }
     });
 }
예제 #3
0
        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);
        }