Example #1
0
        public void Test_EventSource_EtwManifestGeneration()
        {
            RemoteExecutor.Invoke(() =>
            {
                using (RemoteInvokeHandle handle = RemoteExecutor.Invoke(() =>
                {
                    var es = new SimpleEventSource();
                    for (var i = 0; i < 100; i++)
                    {
                        es.WriteSimpleInt(i);
                        Thread.Sleep(100);
                    }
                }))
                {
                    var etlFileName  = @"file.etl";
                    var tracesession = new TraceEventSession("testname", etlFileName);

                    tracesession.EnableProvider("SimpleEventSource");

                    Thread.Sleep(TimeSpan.FromSeconds(5));

                    tracesession.Flush();

                    // Sleep after requesting flush to ensure that the manifest payload generated
                    // is fully written to the etl file.
                    Thread.Sleep(TimeSpan.FromSeconds(5));

                    tracesession.DisableProvider("SimpleEventSource");
                    tracesession.Dispose();

                    Assert.True(VerifyManifestAndRemoveFile(etlFileName));
                }
            }).Dispose();
        }
        public void Test_EventSource_EtwManifestGenerationRollover()
        {
            RemoteExecutor.Invoke(() =>
            {
                using (RemoteInvokeHandle handle = RemoteExecutor.Invoke(() =>
                {
                    var es = new SimpleEventSource();
                    for (var i = 0; i < 100; i++)
                    {
                        es.WriteSimpleInt(i);
                        Thread.Sleep(100);
                    }
                }))
                {
                    var initialFileName  = @"initialFile.etl";
                    var rolloverFileName = @"rolloverFile.etl";
                    var tracesession     = new TraceEventSession("testname", initialFileName);
                    var max_retries      = 50;

                    tracesession.EnableProvider("SimpleEventSource");

                    Thread.Sleep(TimeSpan.FromSeconds(5));

                    tracesession.Flush();

                    tracesession.SetFileName(rolloverFileName);

                    Thread.Sleep(TimeSpan.FromSeconds(5));

                    tracesession.Flush();

                    tracesession.DisableProvider("SimpleEventSource");
                    tracesession.Dispose();

                    bool initialFileHasManifest  = false;
                    bool rollOverFileHasManifest = false;

                    for (int i = 0; i < max_retries; i++)
                    {
                        if (VerifyManifestAndRemoveFile(initialFileName))
                        {
                            initialFileHasManifest = true;
                            break;
                        }
                        Thread.Sleep(1000);
                    }
                    for (int i = 0; i < max_retries; i++)
                    {
                        if (VerifyManifestAndRemoveFile(rolloverFileName))
                        {
                            rollOverFileHasManifest = true;
                            break;
                        }
                        Thread.Sleep(1000);
                    }
                    Assert.True(initialFileHasManifest);
                    Assert.True(rollOverFileHasManifest);
                }
            }).Dispose();
        }
        public void Test_EventSource_EtwManifestGeneration()
        {
            RemoteInvokeOptions options = new RemoteInvokeOptions {
                TimeOut = 300_000                                                     /* ms */
            };

            RemoteExecutor.Invoke(() =>
            {
                RemoteInvokeOptions localOptions = new RemoteInvokeOptions {
                    TimeOut = 300_000                                                          /* ms */
                };
                using (RemoteInvokeHandle handle = RemoteExecutor.Invoke(() =>
                {
                    var es = new SimpleEventSource();
                    for (var i = 0; i < 100; i++)
                    {
                        es.WriteSimpleInt(i);
                        Thread.Sleep(100);
                    }
                }, localOptions))
                {
                    var etlFileName  = @"file.etl";
                    var tracesession = new TraceEventSession("testname", etlFileName);

                    tracesession.EnableProvider("SimpleEventSource");

                    Thread.Sleep(TimeSpan.FromSeconds(5));

                    tracesession.Flush();

                    tracesession.DisableProvider("SimpleEventSource");
                    tracesession.Dispose();

                    var manifestExists = false;
                    var max_retries    = 50;

                    for (int i = 0; i < max_retries; i++)
                    {
                        if (VerifyManifestAndRemoveFile(etlFileName))
                        {
                            manifestExists = true;
                            break;
                        }
                        Thread.Sleep(1000);
                    }
                    Assert.True(manifestExists);
                }
            }, options).Dispose();
        }
        public void TraceProcessForDuration(int duration, string traceName)
        {
            var tracesession = new TraceEventSession("testname", _traceName);

            foreach (var provider in _providers)
            {
                tracesession.EnableProvider(provider.Name, (TraceEventLevel)provider.EventLevel, (ulong)provider.Keywords);
            }

            tracesession.EnableProvider("My-Test-EventSource");

            System.Threading.Thread.Sleep(duration * 1000);
            tracesession.Flush();

            tracesession.DisableProvider("My-Test-EventSource");
            tracesession.Dispose();
        }
Example #5
0
        public void UpdateProviderNames(string[] providerNames)
        {
            var removed = ProviderNames.Except(providerNames);
            var added   = providerNames.Except(ProviderNames);

            foreach (var name in removed)
            {
                _etwSession.DisableProvider(name);
            }

            foreach (var name in added)
            {
                _etwSession.EnableProvider(name);
            }

            ProviderNames = providerNames;

            Properties.Settings.Default.ProviderNames = JsonConvert.SerializeObject(ProviderNames);
            Properties.Settings.Default.Save();
        }
        public void Writing_Message_To_Etw()
        {
            var resetEvent = new ManualResetEvent(false);
            var fpath      = Path.Combine(Path.GetTempPath(), "_etwnlogtest.etl");

            using (var session = new TraceEventSession("SimpleMonitorSession", fpath))
            {
                Thread.Sleep(1000);

                try
                {
                    session.EnableProvider(providerId);
                    Thread.Sleep(1000);
                }
                catch
                {
                    Thread.Sleep(1000);
                    session.EnableProvider(providerId);
                }

                Thread.Sleep(1000);

                // send events to session
                var logger = LogManager.GetLogger("A");
                logger.Debug("test-debug");
                logger.Info("test-info");
                logger.Warn("test-warn");
                logger.Error("test-error");
                logger.Fatal("test-fatal");

                try
                {
                    Thread.Sleep(1000);
                    session.DisableProvider(providerId);
                }
                catch
                {
                    Thread.Sleep(1000);
                    session.DisableProvider(providerId);
                }

                Thread.Sleep(1000);

                logger.Fatal("don't log this one");
            }

            var collectedEvents = new List <NLogEtwEventData>(5);

            using (var source = new ETWTraceEventSource(fpath))
            {
                source.UnhandledEvents += delegate(TraceEvent data)
                {
                    if (data.Level == TraceEventLevel.Always)
                    {
                        return;   // Not ours
                    }
                    collectedEvents.Add(new NLogEtwEventData(data)
                    {
                        Message = data.FormattedMessage,
                    });

                    if (collectedEvents.Count == 5)
                    {
                        resetEvent.Set();
                    }
                };
                source.Process();
            }
            File.Delete(fpath);

            var providerName = $"Provider({providerId.ToString()})";

            // assert collected events
            var expectedEvents = new NLogEtwEventData[] {
                new NLogEtwEventData {
                    ProviderName = providerName, TaskName = "EventWriteString", Level = TraceEventLevel.Verbose, Message = "DEBUG|A|test-debug"
                },
                new NLogEtwEventData {
                    ProviderName = providerName, TaskName = "EventWriteString", Level = TraceEventLevel.Informational, Message = "INFO|A|test-info"
                },
                new NLogEtwEventData {
                    ProviderName = providerName, TaskName = "EventWriteString", Level = TraceEventLevel.Warning, Message = "WARN|A|test-warn"
                },
                new NLogEtwEventData {
                    ProviderName = providerName, TaskName = "EventWriteString", Level = TraceEventLevel.Error, Message = "ERROR|A|test-error"
                },
                new NLogEtwEventData {
                    ProviderName = providerName, TaskName = "EventWriteString", Level = TraceEventLevel.Critical, Message = "FATAL|A|test-fatal"
                }
            };

            resetEvent.WaitOne(20000);
            Assert.Equal(expectedEvents.Length, collectedEvents.Count);
            Assert.Equal(expectedEvents, collectedEvents);
        }
        public void Writing_Message_To_Etw()
        {
            var fpath = Path.Combine(Path.GetTempPath(), "_etwnlogtest.etl");

            using (var session = new TraceEventSession("SimpleMonitorSession", fpath))
            {
                //var eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName("MyEventSource");
                var eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName("LowLevelDesign-NLogEtwSource");
                session.EnableProvider(eventSourceGuid);

                // send events to session
                var logger = LogManager.GetLogger("A");
                logger.Debug("test-debug");
                logger.Info("test-info");
                logger.Warn("test-warn");
                logger.Error("test-error");
                logger.Fatal("test-fatal");
                session.DisableProvider(eventSourceGuid);

                logger.Fatal("don't log this one");

                Thread.Sleep(5000);
            }

            var collectedEvents = new List <ExtendedEtwEvent>(5);

            using (var source = new ETWTraceEventSource(fpath))
            {
                var parser = new DynamicTraceEventParser(source);
                parser.All += delegate(TraceEvent data)
                {
                    collectedEvents.Add(new ExtendedEtwEvent
                    {
                        EventId    = (int)data.ID,
                        Level      = data.Level,
                        LoggerName = (string)data.PayloadByName("LoggerName"),
                        Message    = (string)data.PayloadByName("Message")
                    });
                };
                source.Process();
            }
            File.Delete(fpath);

            // assert collected events
            var expectedEvents = new ExtendedEtwEvent[] {
                new ExtendedEtwEvent {
                    EventId = 1, LoggerName = "A", Level = TraceEventLevel.Verbose, Message = "DEBUG|A|test-debug"
                },
                new ExtendedEtwEvent {
                    EventId = 2, LoggerName = "A", Level = TraceEventLevel.Informational, Message = "INFO|A|test-info"
                },
                new ExtendedEtwEvent {
                    EventId = 3, LoggerName = "A", Level = TraceEventLevel.Warning, Message = "WARN|A|test-warn"
                },
                new ExtendedEtwEvent {
                    EventId = 4, LoggerName = "A", Level = TraceEventLevel.Error, Message = "ERROR|A|test-error"
                },
                new ExtendedEtwEvent {
                    EventId = 5, LoggerName = "A", Level = TraceEventLevel.Critical, Message = "FATAL|A|test-fatal"
                }
            };

            Assert.Equal(collectedEvents, expectedEvents);
        }
        public void Writing_Message_To_Etw()
        {
            var resetEvent      = new ManualResetEvent(false);
            var collectedEvents = new List <NLogEtwEventData>(5);

            var providerName = etwTarget.ProviderName.Render(LogEventInfo.CreateNullEvent());

            using (var session = new TraceEventSession("SimpleMonitorSession"))
            {
                // Dynamic-Parser does not work with pure EventSource-objects
                session.Source.Registered.All += delegate(TraceEvent data)
                {
                    if (data.Level == TraceEventLevel.Always)
                    {
                        return;   // Not ours
                    }
                    collectedEvents.Add(new NLogEtwEventData(data)
                    {
                        EventId    = 0, // Raw EventSource gives "random" EventId
                        LoggerName = (string)data.PayloadByName("LoggerName"),
                        Message    = (string)data.PayloadByName("Message"),
                    });

                    if (collectedEvents.Count == 5)
                    {
                        resetEvent.Set();
                    }
                };
                session.Source.UnhandledEvents += delegate(TraceEvent data)
                {
                    if ((int)data.ID == 0xFFFE)
                    {
                        return; // The EventSource manifest events show up as unhanded, filter them out.
                    }
                };

                var task = System.Threading.Tasks.Task.Run(() => session.Source.Process());

                Thread.Sleep(1000);

                session.EnableProvider(providerName);

                Thread.Sleep(1000);

                // send events to session
                var logger = LogManager.GetLogger("A");
                logger.Debug("test-debug");
                logger.Info("test-info");
                logger.Warn("test-warn");
                logger.Error("test-error");
                logger.Fatal("test-fatal");

                try
                {
                    var eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName(providerName);
                    session.DisableProvider(eventSourceGuid);
                }
                catch
                {
                    Thread.Sleep(1000);
                    var eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName(providerName);
                    session.DisableProvider(eventSourceGuid);
                }

                Thread.Sleep(1000);

                logger.Fatal("don't log this one");
                resetEvent.WaitOne(20000);
            }

            // assert collected events
            var expectedEvents = new NLogEtwEventData[] {
                new NLogEtwEventData {
                    EventId = 0, ProviderName = providerName, TaskName = "Debug", Level = TraceEventLevel.Verbose, LoggerName = "A", Message = "DEBUG|A|test-debug"
                },
                new NLogEtwEventData {
                    EventId = 0, ProviderName = providerName, TaskName = "Info", Level = TraceEventLevel.Informational, LoggerName = "A", Message = "INFO|A|test-info"
                },
                new NLogEtwEventData {
                    EventId = 0, ProviderName = providerName, TaskName = "Warn", Level = TraceEventLevel.Warning, LoggerName = "A", Message = "WARN|A|test-warn"
                },
                new NLogEtwEventData {
                    EventId = 0, ProviderName = providerName, TaskName = "Error", Level = TraceEventLevel.Error, LoggerName = "A", Message = "ERROR|A|test-error"
                },
                new NLogEtwEventData {
                    EventId = 0, ProviderName = providerName, TaskName = "Fatal", Level = TraceEventLevel.Critical, LoggerName = "A", Message = "FATAL|A|test-fatal"
                }
            };

            Assert.Equal(collectedEvents, expectedEvents);
        }
        } // ETWTraceInBackground_Start()

        private void Eventbgw_DoWork(object sender, DoWorkEventArgs e)
        {
            // This is the background thread
            Provider         etwp   = e.Argument as Provider;
            BackgroundWorker worker = sender as BackgroundWorker;

            Thread.CurrentThread.Name = "ETWReader";

            using (myTraceEventSession = new TraceEventSession(etwp.name, TraceEventSessionOptions.Create))
            {
                myTraceEventSession.StopOnDispose       = true;
                myTraceEventSession.Source.Dynamic.All += delegate(TraceEvent data)  // Set Source (stream of events) from session.
                {                                                                    // Get dynamic parser (knows about EventSources)
                                                                                     // Subscribe to all EventSource events
                    string operation = "";
                    string inputs    = "";
                    string result    = "";
                    string outputs   = "";
                    string caller    = "";
                    Int64  start     = 0;
                    Int64  end       = 0;

                    try
                    {
                        operation = (string)data.PayloadByName("Operation");
                    }
                    catch
                    {
                        // expected possible condition
                    }
                    try
                    {
                        inputs = (string)data.PayloadByName("Inputs");
                    }
                    catch
                    {
                        // expected possible condition
                    }
                    try
                    {
                        result = (string)data.PayloadByName("Result");
                    }
                    catch
                    {
                        // expected possible condition
                    }
                    try
                    {
                        outputs = (string)data.PayloadByName("Outputs");
                    }
                    catch
                    {
                        // expected possible condition
                    }
                    try
                    {
                        caller = (string)data.PayloadByName("Caller");
                    }
                    catch
                    {
                        // expected possible condition
                    }
                    if (inputs == null && result == null && outputs == null)
                    {
                        try
                        {
                            outputs = (string)data.PayloadByName("Message");
                        }
                        catch
                        {
                            // expected possible condition
                        }
                    }
                    try
                    {
                        start = (Int64)data.PayloadByName("Start");
                    }
                    catch
                    {
                        // expected possible condition
                    }
                    try
                    {
                        end = (Int64)data.PayloadByName("End");
                    }
                    catch
                    {
                        // expected possible condition
                    }
                    EventItem ei = new EventItem((int)data.EventIndex,
                                                 start,
                                                 end,
                                                 data.TimeStamp,
                                                 data.ProcessName,
                                                 data.ProcessID,
                                                 data.ThreadID,
                                                 data.ProviderName,
                                                 operation,
                                                 inputs,
                                                 result,
                                                 outputs,
                                                 caller
                                                 );

                    lock (_TEventListsLock)
                    {
                        _TEventListItems.Add(ei);
                        AddToProcIDsList(data.ProcessID);
                    }
                    worker.ReportProgress((int)data.EventIndex);
                };

                EventTraceProviderEnablementResultCode = myTraceEventSession.EnableProvider(etwp.guid);
                if (!EventTraceProviderEnablementResultCode)
                {
                    // Attempt resetting for second run...
                    myTraceEventSession.DisableProvider(etwp.guid);
                    EventTraceProviderEnablementResultCode = myTraceEventSession.EnableProvider(etwp.guid);
                }
                EventTraceProviderSourceResultCode = myTraceEventSession.Source.Process();
            }
        } // Eventbgw_DoWork()
Example #10
0
        public void Writing_Message_To_Etw()
        {
            var providerName = "LowLevelDesign-NLogEtwSource";
            var resetEvent   = new ManualResetEvent(false);
            var fpath        = Path.Combine(Path.GetTempPath(), "_etwnlogtest.etl");

            using (var session = new TraceEventSession("SimpleMonitorSession", fpath))
            {
                Thread.Sleep(1000);

                var eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName(providerName);

                try
                {
                    session.EnableProvider(eventSourceGuid);
                    Thread.Sleep(1000);
                }
                catch
                {
                    Thread.Sleep(1000);
                    eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName(providerName);
                    session.EnableProvider(eventSourceGuid);
                }

                // send events to session
                var logger = LogManager.GetLogger("A");
                logger.Debug("test-debug");
                logger.Info("test-info");
                logger.Warn("test-warn");
                logger.Error("test-error");
                logger.Fatal("test-fatal");

                try
                {
                    Thread.Sleep(1000);
                    session.DisableProvider(eventSourceGuid);
                }
                catch
                {
                    Thread.Sleep(1000);
                    session.DisableProvider(eventSourceGuid);
                }

                Thread.Sleep(1000);

                logger.Fatal("don't log this one");
            }

            var collectedEvents = new List <NLogEtwEventData>(5);

            using (var source = new ETWTraceEventSource(fpath))
            {
                var parser = new DynamicTraceEventParser(source);
                parser.All += delegate(TraceEvent data)
                {
                    if (data.Level == TraceEventLevel.Always)
                    {
                        return;   // Not ours
                    }
                    collectedEvents.Add(new NLogEtwEventData(data)
                    {
                        LoggerName = (string)data.PayloadByName("LoggerName"),
                        Message    = (string)data.PayloadByName("Message")
                    });

                    if (collectedEvents.Count == 5)
                    {
                        resetEvent.Set();
                    }
                };
                source.Process();
            }
            File.Delete(fpath);

            // assert collected events
            var expectedEvents = new NLogEtwEventData[] {
                new NLogEtwEventData {
                    EventId = 1, ProviderName = providerName, TaskName = "Verbose", LoggerName = "A", Level = TraceEventLevel.Verbose, Message = "DEBUG|A|test-debug"
                },
                new NLogEtwEventData {
                    EventId = 2, ProviderName = providerName, TaskName = "Info", LoggerName = "A", Level = TraceEventLevel.Informational, Message = "INFO|A|test-info"
                },
                new NLogEtwEventData {
                    EventId = 3, ProviderName = providerName, TaskName = "Warn", LoggerName = "A", Level = TraceEventLevel.Warning, Message = "WARN|A|test-warn"
                },
                new NLogEtwEventData {
                    EventId = 4, ProviderName = providerName, TaskName = "Error", LoggerName = "A", Level = TraceEventLevel.Error, Message = "ERROR|A|test-error"
                },
                new NLogEtwEventData {
                    EventId = 5, ProviderName = providerName, TaskName = "Critical", LoggerName = "A", Level = TraceEventLevel.Critical, Message = "FATAL|A|test-fatal"
                }
            };

            resetEvent.WaitOne(20000);
            Assert.Equal(collectedEvents, expectedEvents);
        }
        public void Writing_Message_To_Etw()
        {
            var resetEvent = new ManualResetEvent(false);
            var fpath      = Path.Combine(Path.GetTempPath(), "_etwnlogtest.etl");

            using (var session = new TraceEventSession("SimpleMonitorSession", fpath))
            {
                session.EnableProvider(providerId);

                // send events to session
                var logger = LogManager.GetLogger("A");
                logger.Debug("test-debug");
                logger.Info("test-info");
                logger.Warn("test-warn");
                logger.Error("test-error");
                logger.Fatal("test-fatal");

                session.DisableProvider(providerId);

                logger.Fatal("don't log this one");
            }

            var collectedEvents = new List <SimpleEtwEvent>(5);

            using (var source = new ETWTraceEventSource(fpath))
            {
                source.UnhandledEvents += delegate(TraceEvent data)
                {
                    collectedEvents.Add(new SimpleEtwEvent {
                        Level = data.Level, Message = data.FormattedMessage
                    });
                    if (collectedEvents.Count == 5)
                    {
                        resetEvent.Set();
                    }
                };
                source.Process();
            }
            File.Delete(fpath);

            // assert collected events
            var expectedEvents = new SimpleEtwEvent[] {
                new SimpleEtwEvent {
                    Level = TraceEventLevel.Verbose, Message = "DEBUG|A|test-debug"
                },
                new SimpleEtwEvent {
                    Level = TraceEventLevel.Informational, Message = "INFO|A|test-info"
                },
                new SimpleEtwEvent {
                    Level = TraceEventLevel.Warning, Message = "WARN|A|test-warn"
                },
                new SimpleEtwEvent {
                    Level = TraceEventLevel.Error, Message = "ERROR|A|test-error"
                },
                new SimpleEtwEvent {
                    Level = TraceEventLevel.Critical, Message = "FATAL|A|test-fatal"
                }
            };

            resetEvent.WaitOne(20000);
            Assert.Equal(expectedEvents.Length, collectedEvents.Count);
            Assert.Equal(expectedEvents, collectedEvents);
        }