Exemple #1
0
        public void EtwFileSourceTest()
        {
            var observable = EtwObservable.FromFiles(FileName);
            var source     = new TimeSource <EtwNativeEvent>(observable, e => e.TimeStamp);

            var parsed = from p in source
                         where p.Id == 2
                         select p.TimeStamp;

            var buf = parsed.Take(13).Buffer(TimeSpan.FromSeconds(1), source.Scheduler);

            var list = new List <IList <DateTimeOffset> >();
            ManualResetEvent completed = new ManualResetEvent(false);

            buf.Subscribe(
                t => list.Add(t),
                () => completed.Set());

            source.Connect();
            completed.WaitOne();

            Assert.AreEqual(2, list.Count());
            Assert.AreEqual(7, list.First().Count);
            Assert.AreEqual(6, list.Skip(1).First().Count);
        }
Exemple #2
0
        static void Main(string[] args)
        {
            if (args.Length < 2)
            {
                Console.WriteLine("Usage: SessionStatistics <real-time session name> <seconds>");
                return;
            }

            string sessionName = args[0];
            int    seconds     = int.Parse(args[1]);

            Console.WriteLine("Measuring provider verbosity for session '{0}' for {1} seconds", sessionName, seconds);
            IObservable <EtwNativeEvent> session = EtwObservable.FromSession(sessionName);

            var timeSource = new TimeSource <EtwNativeEvent>(session, e => e.TimeStamp);

            var countPerWindow = from e in timeSource.Take(TimeSpan.FromSeconds(seconds), timeSource.Scheduler)
                                 group e by new { e.ProviderId } into g
            from total in g.Count()
            select new { Provider = g.Key, Count = total };

            ManualResetEvent evt = new ManualResetEvent(false);

            IDisposable output = countPerWindow.Subscribe(
                stat => Console.WriteLine("{0} {1}", stat.Provider, stat.Count), // OnNext
                e => Console.WriteLine(e.Message),                               // OnError
                () => { evt.Set(); });                                           // OnCompleted

            IDisposable input = timeSource.Connect();

            evt.WaitOne();

            output.Dispose();
            input.Dispose();
        }
Exemple #3
0
        public void EtwObservableTest()
        {
            var observable = EtwObservable.FromFiles(FileName);

            int count = observable.Count().Wait();

            Assert.AreEqual(2041, count);
        }
Exemple #4
0
        static void Main()
        {
            IObservable <EtwNativeEvent> etl = EtwObservable.FromFiles(@"HTTP_Server.etl");
            IDisposable d = etl.Count().Subscribe(Console.WriteLine);

            Console.ReadLine();
            d.Dispose();
        }
Exemple #5
0
        public IObservable <EtwNativeEvent> GetRawEventsForTimeWindow()
        {
            Playback scope = new Playback();

            foreach (var item in this.files)
            {
                scope.AddEtlFiles(item);
            }

            return(EtwObservable.FromFiles(this.files.ToArray()));
        }
        public void OfType()
        {
            var count = EtwObservable.FromFiles(this.EtlFileName)
                        .OfType <EtwNativeEvent, Parse>(
                new EtwManifestTypeMap(),
                new EtwClassicTypeMap(),
                new EtwTypeMap())
                        .Count()
                        .Wait();

            Assert.AreEqual(291, count);
        }
Exemple #7
0
        private static IObservable <EtwNativeEvent> CreateEtwObservable(
            bool useSequentialReader,
            DateTime?startTime,
            DateTime?endTime,
            params string[] files)
        {
            if (startTime.HasValue != endTime.HasValue)
            {
                throw new ArgumentException("Specify both start and end times or leave both of them null.");
            }

            if (startTime.HasValue && startTime.Value >= endTime.Value)
            {
                throw new ArgumentException("Start time should be less than end time.");
            }

            if (files == null)
            {
                throw new ArgumentNullException(nameof(files));
            }

            if (files.Length == 0)
            {
                throw new ArgumentException("The Files parameter should contain at least one element.");
            }

            IObservable <EtwNativeEvent> etwObservable;

            if (useSequentialReader)
            {
                if (startTime.HasValue)
                {
                    etwObservable = EtwObservable.FromSequentialFiles(startTime.Value, endTime.Value, files);
                }
                else
                {
                    etwObservable = EtwObservable.FromSequentialFiles(files);
                }
            }
            else
            {
                if (startTime.HasValue)
                {
                    etwObservable = EtwObservable.FromFiles(startTime.Value, endTime.Value, files);
                }
                else
                {
                    etwObservable = EtwObservable.FromFiles(files);
                }
            }

            return(etwObservable);
        }
Exemple #8
0
        /// <summary>
        /// Creates a listener to ETW real-time session for BinaryEnvelope events. These Events have EventId 0, 1 and 2.
        /// and belong to specified provider.
        /// </summary>
        /// <param name="providerId">Identifier of ETW provider.</param>
        /// <param name="sessionName">Session name.</param>
        /// <returns>Sequence of events ordered by timestamp.</returns>
        public static IObservable <IEnvelope> FromSession(
            Guid providerId,
            string sessionName)
        {
            var parser = new BinaryEtwParser(providerId);

            var etwObservable = EtwObservable.FromSession(sessionName);

            return(etwObservable
                   .Select(parser.Parse)
                   .Where(item => item != null));
        }
Exemple #9
0
        public static void ListenWithImperativeCode()
        {
            Console.WriteLine("----- Listening with Tx-EtwObservable and imperative code -----");

            _statistics = new Dictionary <uint, StatisticsBucket>();
            _timer      = new Timer(OnTimer, null, 1000, 1000);
            _raw        = EtwObservable.FromSession(SessionName);

            using (_raw.Subscribe(CustomCallback))
            {
                Console.ReadLine();
            }
        }
Exemple #10
0
        public static void ListenWintUnsafeClass()
        {
            Console.WriteLine("----- Listening with Unsafe wrapper class and Rx query -----");

            // this is the approach used by TraceEvent
            // http://blogs.msdn.com/b/dotnet/archive/2013/08/15/announcing-traceevent-monitoring-and-diagnostics-for-the-cloud.aspx
            // - It works in this case and provides better performance
            // - In general means the user must think which data to copy as the first step in the query
            //   For example in query that joins begin and end event, we can't stop ETW from overwriting the buffer before matching end arrives

            var instance = new RecvV4();

            _raw = EtwObservable.FromSession(Baseline.SessionName);
            var timeSource = new TimeSource <EtwNativeEvent>(_raw, e => e.TimeStamp);

            var received = timeSource.Select(e =>
            {
                unsafe
                {
                    instance.userData = (byte *)e.UserData.ToPointer();
                }
                return(instance);
            });

            var x = from window in received.Window(TimeSpan.FromSeconds(1), timeSource.Scheduler)
                    from stats in
                    (from packet in window
                     group packet by packet.daddr into g
                     from total in g.Sum(p => p.size)
                     select new
            {
                address = new IPAddress(g.Key).ToString(),
                received = total
            })
                    .ToList()
                    select stats.OrderBy(s => s.address);

            _subscription = x.Subscribe(v =>
            {
                //Console.WriteLine("--- {0} ---", DateTime.Now);
                //foreach (var s in v)
                //    Console.WriteLine("{0, -15} {1,-10:n0} ", s.address, s.received);
                //Console.WriteLine();
            });
            timeSource.Connect();

            Console.ReadLine();
            _subscription.Dispose();
            timeSource.Dispose();
        }
Exemple #11
0
        public static void ListenWintQueryOnEtwNativeEvent()
        {
            Console.WriteLine("----- Listening with Tx-EtwObservable and Rx query -----");

            _raw = EtwObservable.FromSession(Baseline.SessionName);

            UInt32 pid   = 0;
            UInt32 size  = 0;
            UInt32 daddr = 0;

            var timeSource = new TimeSource <EtwNativeEvent>(_raw, e => e.TimeStamp);

            var toStackVars = timeSource.Do(e => // this copies the variables on the stack
            {
                pid   = e.ReadUInt32();          // skip PID
                size  = e.ReadUInt32();
                daddr = e.ReadUInt32();
            });

            var x = from window in toStackVars.Window(TimeSpan.FromSeconds(1))
                    from stats in
                    (from packet in window
                     group packet by daddr
                     into g
                     from total in g.Sum(p => size)
                     select new
            {
                address = new IPAddress(g.Key).ToString(),
                received = total
            })
                    .ToList()
                    select stats.OrderBy(s => s.address);

            _subscription = x.Subscribe(v =>
            {
                Console.WriteLine("--- {0} ---", DateTime.Now);
                foreach (var s in v)
                {
                    Console.WriteLine("{0, -15} {1,-10:n0} ", s.address, s.received);
                }
                Console.WriteLine();
            });

            timeSource.Connect();

            Console.ReadLine();
            Console.WriteLine(pid); // prevent the compiler to optimize this away
            _subscription.Dispose();
            timeSource.Dispose();
        }
Exemple #12
0
        public void EtwObservableTest()
        {
            var observable = EtwObservable.FromFiles(FileName);

            int count = 0;

            observable.ForEach(
                x =>
            {
                count++;
            });

            Assert.AreEqual(2041, count);
        }
Exemple #13
0
        public void EtwObservableFirst()
        {
            var observable = EtwObservable.FromFiles(FileName);

            string failureMessage = null;

            observable
            .Take(1)
            .Do(
                nativeEvent =>
            {
                try
                {
                    Assert.AreEqual(new Guid("00000100-0000-0003-193d-42fb30bbcb01"), nativeEvent.ActivityId);
                    Assert.AreEqual(16, nativeEvent.Channel);
                    Assert.AreEqual(0, nativeEvent.EventProperty);
                    Assert.IsNotNull(nativeEvent.ExtendedData);
                    Assert.AreEqual(0, nativeEvent.ExtendedDataCount);
                    Assert.AreEqual(576, nativeEvent.Flags);
                    Assert.AreEqual(0, nativeEvent.HeaderType);
                    Assert.AreEqual(21, nativeEvent.Id);
                    Assert.AreEqual(9223372036854775824L, nativeEvent.Keyword);
                    Assert.AreEqual(4, nativeEvent.Level);
                    Assert.AreEqual(28, nativeEvent.Opcode);
                    Assert.AreEqual((uint)0, nativeEvent.ProcessId);
                    Assert.AreEqual((uint)677443, nativeEvent.ProcessorTime);
                    Assert.AreEqual((ushort)152, nativeEvent.Size);
                    Assert.AreEqual((ushort)4, nativeEvent.Task);
                    Assert.AreEqual(new Guid("dd5ef90a-6398-47a4-ad34-4dcecdef795f"), nativeEvent.ProviderId);
                    Assert.AreEqual((uint)0, nativeEvent.ThreadId);
                    Assert.AreEqual(DateTimeOffset.FromFileTime(129402940472257591L), nativeEvent.TimeStamp);
                    Assert.AreEqual(129402940472257591L, nativeEvent.TimeStampRaw);
                    Assert.IsNotNull(nativeEvent.UserContext);
                    Assert.IsNotNull(nativeEvent.UserData);
                    Assert.AreEqual((ushort)72, nativeEvent.UserDataLength);
                    Assert.AreEqual(0, nativeEvent.Version);
                }
                catch (AssertFailedException assertError)
                {
                    failureMessage = assertError.Message;
                }
            })
            .Wait();

            if (failureMessage != null)
            {
                Assert.Fail(failureMessage);
            }
        }
Exemple #14
0
        public void EtwParser()
        {
            var parser = EtwObservable.FromFiles(FileName);

            int count = 0;
            ManualResetEvent completed = new ManualResetEvent(false);

            parser.Count().Subscribe(
                x => count = x,
                () => completed.Set());

            completed.WaitOne();

            Assert.AreEqual(2041, count);
        }
Exemple #15
0
        static void Main()
        {
            Process logman = Process.Start(
                "logman.exe",
                "create trace TCP -rt -nb 2 2 -bs 1024 -p {7dd42a49-5329-4832-8dfd-43d979153a88} 0xffffffffffffffff -ets");

            logman.WaitForExit();

            IObservable <EtwNativeEvent> session = EtwObservable.FromSession("TCP");

            using (session.Subscribe(e => Console.WriteLine("{0} {1}", e.TimeStamp, e.Id)))
            {
                Console.ReadLine();
            }
        }
Exemple #16
0
        public TimeSpan  RunTestcase(MethodInfo method)
        {
            var observable = EtwObservable.FromFiles(_files);

            // the testcase should set the callback
            method.Invoke(this, new object[] {});

            Stopwatch stopwatch = Stopwatch.StartNew();

            observable.Subscribe(EtwCallback, OnCompleted);
            _completed.WaitOne();
            stopwatch.Stop();

            return(stopwatch.Elapsed);
        }
Exemple #17
0
        static void ListenNative()
        {
            Console.WriteLine("listening for EtwNativeEvent");
            Console.WriteLine();

            var all = EtwObservable.FromSession("TxRealTime");

            var windows = from w in all.Window(TimeSpan.FromSeconds(1))
                          from c in w.Count()
                          select c;

            subscription = windows.Subscribe(
                (c) => Console.WriteLine("Using Tx and Rx for count : {0:n}", c),
                (error) => Console.WriteLine(error.Message),
                () => Console.WriteLine("----Completed!---"));
        }
Exemple #18
0
        public static void ListenWintUnsafeClass()
        {
            Console.WriteLine("----- Listening with Unsafe wrapper class and Rx query -----");

            var instance = new RecvV4();

            _raw = EtwObservable.FromSession(Baseline.SessionName);
            var timeSource = new TimeSource <EtwNativeEvent>(_raw, e => e.TimeStamp);

            var received = timeSource.Select(e =>
            {
                unsafe
                {
                    instance.userData = (byte *)e.UserData.ToPointer();
                }
                return(instance);
            });

            var x = from window in received.Window(TimeSpan.FromSeconds(1), timeSource.Scheduler)
                    from stats in
                    (from packet in window
                     group packet by packet.daddr into g
                     from total in g.Sum(p => p.size)
                     select new
            {
                address = new IPAddress(g.Key).ToString(),
                received = total
            })
                    .ToList()
                    select stats.OrderBy(s => s.address);

            _subscription = x.Subscribe(v =>
            {
                //Console.WriteLine("--- {0} ---", DateTime.Now);
                //foreach (var s in v)
                //    Console.WriteLine("{0, -15} {1,-10:n0} ", s.address, s.received);
                //Console.WriteLine();
            });
            timeSource.Connect();

            Console.ReadLine();
            _subscription.Dispose();
            timeSource.Dispose();
        }
Exemple #19
0
        static void Main()
        {
            IObservable <EtwNativeEvent> etl = EtwObservable.FromFiles(@"HTTP_Server.etl");

            var timeSource = new TimeSource <EtwNativeEvent>(etl, e => e.TimeStamp);

            var countPerWindow = from window in timeSource.Window(TimeSpan.FromSeconds(5), timeSource.Scheduler)
                                 from Count in window.Count()
                                 select Count;

            var withTime = countPerWindow.Timestamp(timeSource.Scheduler);

            using (withTime.Subscribe(ts => Console.WriteLine("{0} {1}", ts.Timestamp, ts.Value)))
            {
                timeSource.Connect();

                Console.ReadLine();
            }
        }
Exemple #20
0
        public void Start()
        {
            if (this.session != null)
            {
                throw new InvalidOperationException("The session is already started.");
            }

            RealTimeTraceCollectorInfo info = new RealTimeTraceCollectorInfo(this.name);

            info.Providers.Add(new ProviderInfo(KernelProcessProviderId)
            {
                KeywordsAll = 0x10, Level = 4
            });
            this.session = info.Create();
            this.session.Start();

            IObservable <EtwNativeEvent> stream = EtwObservable.FromSession(this.name);

            this.subscription = stream.Subscribe(e => this.OnNext(e));
        }
Exemple #21
0
 public TraceReader(string fileName)
 {
     this.eventStream = EtwObservable.FromFiles(fileName);
 }
Exemple #22
0
        public bool TxEtl(FileObject fileObject, string outputFile)
        {
            // this forces blg output timestamps to use local capture timezone which is utc for azure
            // Tx module is not able to determine with PDH api blg source timezone
            // todo: verify if needed for etl...
            //TimeUtil.DateTimeKind = DateTimeKind.Unspecified;

            DateTime startTime = DateTime.Now;
            IObservable <EtwNativeEvent>   observable   = default(IObservable <EtwNativeEvent>);
            TraceObserver <EtwNativeEvent> traceSession = default(TraceObserver <EtwNativeEvent>);
            //List<EtwNativeEvent> records = new List<EtwNativeEvent>();
            List <DtrTraceRecord> csvRecords = new List <DtrTraceRecord>();

            // todo: verify if needed for etl...testing pdh found invalid data when using concurrently
            // lock (_lockObj)
            // {
            Log.Debug($"observable creating: {fileObject.FileUri}");
            observable = EtwObservable.FromFiles(fileObject.FileUri);

            Log.Debug($"observable created: {fileObject.FileUri}");
            traceSession = ReadTraceRecords(observable);
            Log.Debug($"finished total ms: {DateTime.Now.Subtract(startTime).TotalMilliseconds} reading: {fileObject.FileUri}");
            //    records = traceSession.Records;
            // }

            //foreach (EtwNativeEvent record in records)
            foreach (EtwNativeEvent record in traceSession.Records)
            {
                //Log.Info("record", record);
                //if (!string.IsNullOrEmpty(record.Value.ToString()))
                //{
                //    string counterValue = record.Value.ToString() == "NaN" ? "0" : record.Value.ToString();

                //    try
                //    {
                //        csvRecords.Add(new CsvCounterRecord()
                //        {
                //            Timestamp = record.Timestamp,
                //            CounterName = record.CounterPath.Replace("\"", "").Trim(),
                //            CounterValue = Decimal.Parse(counterValue, NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint),
                //            Object = record.CounterSet?.Replace("\"", "").Trim(),
                //            Counter = record.CounterName.Replace("\"", "").Trim(),
                //            Instance = record.Instance?.Replace("\"", "").Trim(),
                //            NodeName = fileObject.NodeName,
                //            FileType = fileObject.FileDataType.ToString(),
                //            RelativeUri = fileObject.RelativeUri
                //        });
                //    }
                //    catch (Exception ex)
                //    {
                //        Log.Exception($"stringValue:{counterValue} exception:{ex}", record);
                //    }
                //}
                //else
                //{
                //    Log.Warning($"empty counter value:", record);
                //}
            }

            fileObject.Stream.Write(csvRecords);
            Log.Info($"records: {traceSession.Records.Count()} {csvRecords.Count}");
            traceSession.Dispose();
            return(true);
        }