Exemple #1
0
        protected override void Capture(TraceEventSession session)
        {
            session.EnableKernelProvider(KernelTraceEventParser.Keywords.NetworkTCPIP, KernelTraceEventParser.Keywords.NetworkTCPIP);

            //TraceLogEventSource is required on win 7
            //see: https://github.com/Microsoft/dotnetsamples/blob/master/Microsoft.Diagnostics.Tracing/TraceEvent/TraceEvent/41_TraceLogMonitor.cs
            using (TraceLogEventSource traceLogSource = TraceLog.CreateFromTraceEventSession(session))
            {
                //two events in a row for same process and IP/port means failure.
                //It could be a firewall intervention, silently droping packets to that destination
                //or the end service is down.
                traceLogSource.Kernel.TcpIpReconnect += (TcpIpTraceData data) =>
                {
                    try
                    {
                        _sender.Send(data.ProcessID, data.daddr + ":" + data.dport, TCP_RECONNECT);
                    }
                    catch (Exception)
                    {
                        //TODO: log it
                        //TODO: check all Exceptions that can be thrown by the _sender instance.
                        throw;
                    }
                };

                traceLogSource.Kernel.TcpIpConnect += (TcpIpConnectTraceData data) =>
                {
                    try
                    {
                        _sender.Send(data.ProcessID, data.ToXml(new System.Text.StringBuilder()).ToString(), TCP_CONNECT);
                    }
                    catch (Exception)
                    {
                        //TODO: log it
                        //TODO: check all Exceptions that can be thrown by the _sender instance.
                        throw;
                    }
                };

                traceLogSource.Kernel.TcpIpDisconnect += (TcpIpTraceData data) =>
                {
                    try
                    {
                        _sender.Send(data.ProcessID, data.ToXml(new System.Text.StringBuilder()).ToString(), TCP_CONNECT);
                    }
                    catch (Exception)
                    {
                        //TODO: log it
                        //TODO: check all Exceptions that can be thrown by the _sender instance.
                        throw;
                    }
                };
                traceLogSource.Process();
            }
        }
Exemple #2
0
        protected override bool OnStart()
        {
            if (_session != null)
            {
                throw new InvalidOperationException("Profiling session already started...");
            }

            string sessionName = "LiveCpu_Profiling_Session+" + Guid.NewGuid().ToString();

            _session = new TraceEventSession(sessionName, TraceEventSessionOptions.Create);
            if (!EnableProviders(_session))
            {
                _session.Dispose();
                _session = null;
                return(false);
            }

            _profilingTask = Task.Factory.StartNew(() =>
            {
                using (TraceLogEventSource source = TraceLog.CreateFromTraceEventSession(_session))
                {
                    // CPU sampling kernel events
                    source.Kernel.PerfInfoSample += (SampledProfileTraceData data) =>
                    {
                        if (data.ProcessID != Pid)
                        {
                            return;
                        }

                        var callstack = data.CallStack();
                        if (callstack == null)
                        {
                            return;
                        }

                        MergeCallStack(callstack, Reader);
                    };

                    // this call exits when the session is stopped
                    source.Process();
                }
            });

            return(true);
        }