SlideShare a Scribd company logo
ETW w służbie programisty .NET
@KonradKokosa
Logowanie zdarzeń w .NET
3
4
try
{
Console.WriteLine("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
Console.WriteLine("Pies1 " + result);
ProcessMore();
Console.WriteLine("Pies2");
ProcessWithException(result);
Console.WriteLine("Pies3");
}
Console.WriteLine("Processing ended.");
}
catch (Exception ex)
{
Console.WriteLine($"Ojojoj... {ex.Message}");
}
5
try
{
Console.WriteLine("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
Console.WriteLine("Pies1 " + result);
ProcessMore();
Console.WriteLine("Pies2");
ProcessWithException(result);
Console.WriteLine("Pies3");
}
Console.WriteLine("Processing ended.");
}
catch (Exception ex)
{
Console.WriteLine($"Ojojoj... {ex.Message}");
}
try
{
logger.Info("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
logger.Debug($"Pies1 {result}");
ProcessMore();
logger.Debug("Pies2");
ProcessWithException(result);
logger.Debug("Pies3");
}
logger.Info("Processing ended.");
}
catch (Exception ex)
{
logger.Error($"Ojojoj... {ex.Message}");
}
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" fileName="logs-nlog.txt" />
<target name="console" xsi:type="Console"
layout="${longdate}|${level}|${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile,console" />
</rules>
</nlog>
try
{
logger.Info("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
logger.Debug($"Pies1 {result}");
ProcessMore();
logger.Debug("Pies2");
ProcessWithException(result);
logger.Debug("Pies3");
}
logger.Info("Processing ended.");
}
catch (Exception ex)
{
logger.Error($"Ojojoj... {ex.Message}");
}
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="logfile" xsi:type="File" fileName="logs-nlog.txt" />
<target name="console" xsi:type="Console"
layout="${longdate}|${level}|${message}" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile,console" />
</rules>
</nlog>
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.LiterateConsole()
.WriteTo.RollingFile("logs-serilog.txt")
.CreateLogger();
try
{
Log.Information("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
var debugData = new { Result = result, IsHappy = true };
Log.Debug("Pies1 {@data}", debugData);
ProcessMore();
Log.Debug("Pies2");
ProcessWithException(result);
Log.Debug("Pies3");
}
logger.Trace("Processing ended.");
}
catch (Exception ex)
{
Log.Error($"Ojojoj... {ex.Message}");
}
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.LiterateConsole()
.WriteTo.RollingFile("logs-serilog.txt")
.CreateLogger();
try
{
Log.Information("Starting to process...");
var result = ProcessSomething();
if (result > 0)
{
var debugData = new { Result = result, IsHappy = true };
Log.Debug("Pies1 {@data}", debugData);
ProcessMore();
Log.Debug("Pies2");
ProcessWithException(result);
Log.Debug("Pies3");
}
logger.Trace("Processing ended.");
}
catch (Exception ex)
{
Log.Error($"Ojojoj... {ex.Message}");
}
ETW
10
11
12
Event Tracing for Windows
13
Event Tracing for Windows
14
najpotężniejszy i... najbardziej niedoceniany
15
"strongly typed (schematized), extensible
logging system built into the Windows
Operating System"
16
17
Zalety:
• Ogromna ilość informacji
• Zerowy narzut gdy wyłączony
• Mały narzut gdy włączony (~kilka %)
• Nieinwazyjne włączanie/wyłączanie
• Precyzyjny (analiza wyścigów czasowych)
• Silnie typowany
• Całkiem niezły “tooling”
18
Zalety:
• Ogromna ilość informacji
• Zerowy narzut gdy wyłączony
• Mały narzut gdy włączony (~kilka %)
• Nieinwazyjne włączanie/wyłączanie
• Precyzyjny (analiza wyścigów czasowych)
• Silnie typowany
• Całkiem niezły “tooling”
19
Zalety:
• Ogromna ilość informacji
• Zerowy narzut gdy wyłączony
• Mały narzut gdy włączony (~kilka %)
• Nieinwazyjne włączanie/wyłączanie
• Precyzyjny (analiza wyścigów czasowych)
• Silnie typowany
• Całkiem niezły “tooling”
PRD
20
21
Wady:
• Całkiem niezły “tooling”
22
Timeline
Windows 2000
Windows Vista
Server 2003
Windows 7
Server 2008
Windows 8
Server 2012
2000 2007 2009 2012
Windows 10
2015
ETW ETW solidnie
rozwinięty
call-stack przy
każdym evencie
.NET 2.0
2005
Ulepszenia…
.NET 4.0
2010
ETW
dla CLR
.NET Core
2016
ETW
dla CoreCLR
23
Przykłady
24
eventvwr.exe
25
resmon.exe
26
perfmon.exe
27
Architektura
28
29
30
31
ETW Session
32
33
34
Jak to ugryźć?
35
logman query providers
logman query providers "Windows Kernel
Trace"
logman query providers | findstr DotNET
logman query providers -pid XXXX
36
xperf -loggers
37
ETW Event
38
Event ETW
• Id
• Version
• Keyword
• Level
• Opcode
• Task
• …
39
Przykładowe eventy
• Windows KernelProcessStart
• Windows KernelProcessEnd
• Windows KernelImageLoad – kiedy
ładowana jest DLLka
• Windows KernelTcpIpRecv – kiedy dociera
pakiet TCP/IP
• Windows KernelThreadCSwitch - kiedy
wątek dostaje albo traci dostęp do CPU
40
logman query providers ".NET Common
Language Runtime"
41
Eventy CLR
• MSDN (https://msdn.microsoft.com/en-us/library/dd264810(v=vs.110).aspx)
• manifest:
• CoreCLR
.coreclrsrcvmClrEtwAll.man
• .NET Framework 4.0+
c:WindowsMicrosoft.NETFramework64v4.0.30319CLR-ETW.man
• .NET Framework 2.0 - nie wspierał 
42
43
44
45
46
Narzędzia
49
Windows Performance Toolkit
50
51
52
Demo
53
Zalety:
• przyjemnie graficzny
• może posłużyć do tworzenia wykresów
Wady:
• nie wszystko da się narysować
• nie można podejrzeć stacktrace eventów
54
PerfView
55
PerfView
https://github.com/Microsoft/perfview
56
57
58
59
60
61
62
Demo
63
wtrace, etrace
https://github.com/lowleveldesign/wtrace
https://github.com/goldshtn/etrace
66
Programowanie
67
Kiedyś* - żmudne
* do 2012 - .NET 4.5
68
Teraz - EventSource
69
class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("Enter command:");
string command = Console.ReadLine();
MySampleEventProvider.Log.Command(7, command);
}
}
}
sealed class MySampleEventProvider : EventSource
{
public void Command(long commandId, string Name)
{
WriteEvent(1, commandId, Name);
}
public static MySampleEventProvider Log = new MySampleEventProvider();
}
70
Teraz - TraceEvent
71
using (var session = new TraceEventSession("SimpleMontitorSession",
"MyEventsFile.etl"))
{
var eventSourceGuid =
TraceEventProviders.GetEventSourceGuidFromName("MyEventSource");
session.EnableProvider(eventSourceGuid);
Thread.Sleep(10000);
}
72
using (var session = new TraceEventSession("MyRealTimeSession"))
{
var providerName = "Microsoft-Windows-DotNETRuntime";
var eventSourceGuid =
TraceEventProviders.GetProviderGuidByName(providerName);
session.EnableProvider(eventSourceGuid);
session.Source.Clr.GCHeapStats += ClrOnGcHeapStats;
session.Source.Process();
}
Dziękuję za uwagę! Pytania?!
73

More Related Content

Similar to ETW w służbie programisty .NET

Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
Kamil Grabowski
 
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
PROIDEA
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.
Semihalf
 
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
PROIDEA
 
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
PROIDEA
 
Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.
Semihalf
 
DTrace, czyli jak zobaczyć to czego nie widać.
DTrace, czyli jak zobaczyć to czego nie widać.DTrace, czyli jak zobaczyć to czego nie widać.
DTrace, czyli jak zobaczyć to czego nie widać.
Semihalf
 
Testowanie- nauka czy sztuka? - Adam Roman
Testowanie- nauka czy sztuka? - Adam RomanTestowanie- nauka czy sztuka? - Adam Roman
Testowanie- nauka czy sztuka? - Adam Roman
Women in Technology Poland
 
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
Future Processing
 
[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu
[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu
[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu
Piotr Kaźmierczak
 
Typescript - Object Oriented Approach in JS
Typescript - Object Oriented Approach in JSTypescript - Object Oriented Approach in JS
Typescript - Object Oriented Approach in JS
Piotr Miazga
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?
javOnet
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
kraqa
 
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMKopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Artur Skowroński
 
Devops/Sysops security
Devops/Sysops securityDevops/Sysops security
Devops/Sysops security
Logicaltrust pl
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
qbeuek
 
C#. Ćwiczenia. Wydanie II
C#. Ćwiczenia. Wydanie IIC#. Ćwiczenia. Wydanie II
C#. Ćwiczenia. Wydanie II
Wydawnictwo Helion
 
StreamInsight - Analiza danych w ruchu
StreamInsight - Analiza danych w ruchuStreamInsight - Analiza danych w ruchu
StreamInsight - Analiza danych w ruchuWlodek Bielski
 
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PROIDEA
 

Similar to ETW w służbie programisty .NET (20)

Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
Konrad Kokosa - Pamięć w .NET - od ogólu do szczegółu- 4developers2016
 
Iron Python I Dlr
Iron Python I DlrIron Python I Dlr
Iron Python I Dlr
 
Secure Coding w praktyce.
Secure Coding w praktyce.Secure Coding w praktyce.
Secure Coding w praktyce.
 
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
 
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
CONFidence 2018: "Small money, a lot of bugs" - Large scale bughunting dla ty...
 
Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.
 
DTrace, czyli jak zobaczyć to czego nie widać.
DTrace, czyli jak zobaczyć to czego nie widać.DTrace, czyli jak zobaczyć to czego nie widać.
DTrace, czyli jak zobaczyć to czego nie widać.
 
Testowanie- nauka czy sztuka? - Adam Roman
Testowanie- nauka czy sztuka? - Adam RomanTestowanie- nauka czy sztuka? - Adam Roman
Testowanie- nauka czy sztuka? - Adam Roman
 
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
[Quality Meetup #9] TestOps, QAOps - czy ktoś taki istnieje? - Aleksandra Kor...
 
[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu
[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu
[Confidence 2016] Red Team - najlepszy przyjaciel Blue Teamu
 
Typescript - Object Oriented Approach in JS
Typescript - Object Oriented Approach in JSTypescript - Object Oriented Approach in JS
Typescript - Object Oriented Approach in JS
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMKopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVM
 
Devops/Sysops security
Devops/Sysops securityDevops/Sysops security
Devops/Sysops security
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
C#. Ćwiczenia. Wydanie II
C#. Ćwiczenia. Wydanie IIC#. Ćwiczenia. Wydanie II
C#. Ćwiczenia. Wydanie II
 
StreamInsight - Analiza danych w ruchu
StreamInsight - Analiza danych w ruchuStreamInsight - Analiza danych w ruchu
StreamInsight - Analiza danych w ruchu
 
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
 

More from Konrad Kokosa

A miało być tak... bez wycieków
A miało być tak... bez wyciekówA miało być tak... bez wycieków
A miało być tak... bez wycieków
Konrad Kokosa
 
Narysuj Swoją Karierę IT - Konrad Kokosa
Narysuj Swoją Karierę IT - Konrad KokosaNarysuj Swoją Karierę IT - Konrad Kokosa
Narysuj Swoją Karierę IT - Konrad Kokosa
Konrad Kokosa
 
Wydajność webowa jak to ugryźć
Wydajność webowa   jak to ugryźćWydajność webowa   jak to ugryźć
Wydajność webowa jak to ugryźć
Konrad Kokosa
 
Zarzadzanie pamiecia w .NET - WDI
Zarzadzanie pamiecia w .NET - WDIZarzadzanie pamiecia w .NET - WDI
Zarzadzanie pamiecia w .NET - WDI
Konrad Kokosa
 
BoilingFrogs 2016 - Web performance
BoilingFrogs 2016 - Web performanceBoilingFrogs 2016 - Web performance
BoilingFrogs 2016 - Web performance
Konrad Kokosa
 
WG.NET 90 - Testy obciążeniowe – co, jak, czym?
WG.NET 90 - Testy obciążeniowe – co, jak, czym?WG.NET 90 - Testy obciążeniowe – co, jak, czym?
WG.NET 90 - Testy obciążeniowe – co, jak, czym?
Konrad Kokosa
 

More from Konrad Kokosa (6)

A miało być tak... bez wycieków
A miało być tak... bez wyciekówA miało być tak... bez wycieków
A miało być tak... bez wycieków
 
Narysuj Swoją Karierę IT - Konrad Kokosa
Narysuj Swoją Karierę IT - Konrad KokosaNarysuj Swoją Karierę IT - Konrad Kokosa
Narysuj Swoją Karierę IT - Konrad Kokosa
 
Wydajność webowa jak to ugryźć
Wydajność webowa   jak to ugryźćWydajność webowa   jak to ugryźć
Wydajność webowa jak to ugryźć
 
Zarzadzanie pamiecia w .NET - WDI
Zarzadzanie pamiecia w .NET - WDIZarzadzanie pamiecia w .NET - WDI
Zarzadzanie pamiecia w .NET - WDI
 
BoilingFrogs 2016 - Web performance
BoilingFrogs 2016 - Web performanceBoilingFrogs 2016 - Web performance
BoilingFrogs 2016 - Web performance
 
WG.NET 90 - Testy obciążeniowe – co, jak, czym?
WG.NET 90 - Testy obciążeniowe – co, jak, czym?WG.NET 90 - Testy obciążeniowe – co, jak, czym?
WG.NET 90 - Testy obciążeniowe – co, jak, czym?
 

ETW w służbie programisty .NET

  • 1.
  • 2. ETW w służbie programisty .NET @KonradKokosa
  • 4. 4 try { Console.WriteLine("Starting to process..."); var result = ProcessSomething(); if (result > 0) { Console.WriteLine("Pies1 " + result); ProcessMore(); Console.WriteLine("Pies2"); ProcessWithException(result); Console.WriteLine("Pies3"); } Console.WriteLine("Processing ended."); } catch (Exception ex) { Console.WriteLine($"Ojojoj... {ex.Message}"); }
  • 5. 5 try { Console.WriteLine("Starting to process..."); var result = ProcessSomething(); if (result > 0) { Console.WriteLine("Pies1 " + result); ProcessMore(); Console.WriteLine("Pies2"); ProcessWithException(result); Console.WriteLine("Pies3"); } Console.WriteLine("Processing ended."); } catch (Exception ex) { Console.WriteLine($"Ojojoj... {ex.Message}"); }
  • 6. try { logger.Info("Starting to process..."); var result = ProcessSomething(); if (result > 0) { logger.Debug($"Pies1 {result}"); ProcessMore(); logger.Debug("Pies2"); ProcessWithException(result); logger.Debug("Pies3"); } logger.Info("Processing ended."); } catch (Exception ex) { logger.Error($"Ojojoj... {ex.Message}"); } <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="logfile" xsi:type="File" fileName="logs-nlog.txt" /> <target name="console" xsi:type="Console" layout="${longdate}|${level}|${message}" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="logfile,console" /> </rules> </nlog>
  • 7. try { logger.Info("Starting to process..."); var result = ProcessSomething(); if (result > 0) { logger.Debug($"Pies1 {result}"); ProcessMore(); logger.Debug("Pies2"); ProcessWithException(result); logger.Debug("Pies3"); } logger.Info("Processing ended."); } catch (Exception ex) { logger.Error($"Ojojoj... {ex.Message}"); } <?xml version="1.0" encoding="utf-8" ?> <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <targets> <target name="logfile" xsi:type="File" fileName="logs-nlog.txt" /> <target name="console" xsi:type="Console" layout="${longdate}|${level}|${message}" /> </targets> <rules> <logger name="*" minlevel="Trace" writeTo="logfile,console" /> </rules> </nlog>
  • 8. Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.LiterateConsole() .WriteTo.RollingFile("logs-serilog.txt") .CreateLogger(); try { Log.Information("Starting to process..."); var result = ProcessSomething(); if (result > 0) { var debugData = new { Result = result, IsHappy = true }; Log.Debug("Pies1 {@data}", debugData); ProcessMore(); Log.Debug("Pies2"); ProcessWithException(result); Log.Debug("Pies3"); } logger.Trace("Processing ended."); } catch (Exception ex) { Log.Error($"Ojojoj... {ex.Message}"); }
  • 9. Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.LiterateConsole() .WriteTo.RollingFile("logs-serilog.txt") .CreateLogger(); try { Log.Information("Starting to process..."); var result = ProcessSomething(); if (result > 0) { var debugData = new { Result = result, IsHappy = true }; Log.Debug("Pies1 {@data}", debugData); ProcessMore(); Log.Debug("Pies2"); ProcessWithException(result); Log.Debug("Pies3"); } logger.Trace("Processing ended."); } catch (Exception ex) { Log.Error($"Ojojoj... {ex.Message}"); }
  • 11. 11
  • 12. 12
  • 13. Event Tracing for Windows 13
  • 14. Event Tracing for Windows 14
  • 16. "strongly typed (schematized), extensible logging system built into the Windows Operating System" 16
  • 17. 17 Zalety: • Ogromna ilość informacji • Zerowy narzut gdy wyłączony • Mały narzut gdy włączony (~kilka %) • Nieinwazyjne włączanie/wyłączanie • Precyzyjny (analiza wyścigów czasowych) • Silnie typowany • Całkiem niezły “tooling”
  • 18. 18 Zalety: • Ogromna ilość informacji • Zerowy narzut gdy wyłączony • Mały narzut gdy włączony (~kilka %) • Nieinwazyjne włączanie/wyłączanie • Precyzyjny (analiza wyścigów czasowych) • Silnie typowany • Całkiem niezły “tooling”
  • 19. 19 Zalety: • Ogromna ilość informacji • Zerowy narzut gdy wyłączony • Mały narzut gdy włączony (~kilka %) • Nieinwazyjne włączanie/wyłączanie • Precyzyjny (analiza wyścigów czasowych) • Silnie typowany • Całkiem niezły “tooling” PRD
  • 20. 20
  • 22. 22 Timeline Windows 2000 Windows Vista Server 2003 Windows 7 Server 2008 Windows 8 Server 2012 2000 2007 2009 2012 Windows 10 2015 ETW ETW solidnie rozwinięty call-stack przy każdym evencie .NET 2.0 2005 Ulepszenia… .NET 4.0 2010 ETW dla CLR .NET Core 2016 ETW dla CoreCLR
  • 28. 28
  • 29. 29
  • 30. 30
  • 32. 32
  • 33. 33
  • 35. 35 logman query providers logman query providers "Windows Kernel Trace" logman query providers | findstr DotNET logman query providers -pid XXXX
  • 38. 38 Event ETW • Id • Version • Keyword • Level • Opcode • Task • …
  • 39. 39 Przykładowe eventy • Windows KernelProcessStart • Windows KernelProcessEnd • Windows KernelImageLoad – kiedy ładowana jest DLLka • Windows KernelTcpIpRecv – kiedy dociera pakiet TCP/IP • Windows KernelThreadCSwitch - kiedy wątek dostaje albo traci dostęp do CPU
  • 40. 40 logman query providers ".NET Common Language Runtime"
  • 41. 41 Eventy CLR • MSDN (https://msdn.microsoft.com/en-us/library/dd264810(v=vs.110).aspx) • manifest: • CoreCLR .coreclrsrcvmClrEtwAll.man • .NET Framework 4.0+ c:WindowsMicrosoft.NETFramework64v4.0.30319CLR-ETW.man • .NET Framework 2.0 - nie wspierał 
  • 42. 42
  • 43. 43
  • 44. 44
  • 45. 45
  • 48. 50
  • 49. 51
  • 51. 53 Zalety: • przyjemnie graficzny • może posłużyć do tworzenia wykresów Wady: • nie wszystko da się narysować • nie można podejrzeć stacktrace eventów
  • 54. 56
  • 55. 57
  • 56. 58
  • 57. 59
  • 58. 60
  • 59. 61
  • 63. 67 Kiedyś* - żmudne * do 2012 - .NET 4.5
  • 65. 69 class Program { static void Main(string[] args) { while (true) { Console.WriteLine("Enter command:"); string command = Console.ReadLine(); MySampleEventProvider.Log.Command(7, command); } } } sealed class MySampleEventProvider : EventSource { public void Command(long commandId, string Name) { WriteEvent(1, commandId, Name); } public static MySampleEventProvider Log = new MySampleEventProvider(); }
  • 67. 71 using (var session = new TraceEventSession("SimpleMontitorSession", "MyEventsFile.etl")) { var eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName("MyEventSource"); session.EnableProvider(eventSourceGuid); Thread.Sleep(10000); }
  • 68. 72 using (var session = new TraceEventSession("MyRealTimeSession")) { var providerName = "Microsoft-Windows-DotNETRuntime"; var eventSourceGuid = TraceEventProviders.GetProviderGuidByName(providerName); session.EnableProvider(eventSourceGuid); session.Source.Clr.GCHeapStats += ClrOnGcHeapStats; session.Source.Process(); }
  • 69. Dziękuję za uwagę! Pytania?! 73

Editor's Notes

  1. Witam wszystkich serdecznie i bardzo się cieszę, że tutaj dziś Wam opowiadam. Nazywam się Konrad Kokosa i jestem .NET freelancerem I trenerem w swojej DG.
  2. Co robicie gdy jest problem (błąd, wydajność, pamięć) na PRD albo na UAT Pokażę Wam extra nardzędzie diagnostyczne – mam nadzieję, że nawet jak już coś o nim wiecie to Wam się przypomni jakie jest fajne
  3. Linux dtrace "in the field monitoring/diagnostic"
  4. Linux dtrace "in the field monitoring/diagnostic"
  5. Linux dtrace "in the field monitoring/diagnostic"
  6. Linux dtrace "in the field monitoring/diagnostic"
  7. Linux dtrace "in the field monitoring/diagnostic"
  8. .NET Core - Dla Linuxa LLTng
  9. - PerfMon.exe i Performance Counters - NIE oparte o ETW
  10. Cechą charakterystyczną ETW jest operowanie na poziomie providerów, a nie np. procesów. Nie możemy włączyć logowania tylko calc.exe
  11. CLR też ma zarejestrowany provider! co oferuje dany PID
  12. CLR też ma zarejestrowany provider! co oferuje dany PID
  13. Każdy event ETW oprócz unikalnej w ramach providera Id oraz Version posiada również kilka ważnych atrybutów: - Keyword - słowo kluczowe, a tak naprawdę maska bitowa. Dzięki niej eventom może być przypisane jedno lub kilka znaczeń. - Level - poziom logowania. - Opcode - oznacza konkretną akcję (etap) w ramach danego eventu. Najczęściej używany wbudowanymi wartościami jest opcode Start oraz End. - Task - służy do grupowania eventów w ramach providera w pewne zakresy funkcjonalności.
  14. CLR też ma zarejestrowany provider! co oferuje dany PID
  15. CLR też ma zarejestrowany provider! co oferuje dany PID
  16. Windows Performance Recorder i Windows Performance Analyzer
  17. Windows Performance Recorder i Windows Performance Analyzer
  18. Windows Performance Recorder i Windows Performance Analyzer
  19. - przede wszystkim pomyślane jako performance dla .NET (Vance Morrison, Visual Studio performance architect) - Narzędzie to jest używane przez zespół Visual Studio w celu dbania o wydajność tego narzędzia. Jak również przez zespół .NET w celu dbania o wydajność samego frameworku - Jest też napisany tak by rozpoczęcie pracy z nim było banalnie proste. Nie wymaga żadnej instalacji. Jest to po prostu pojedynczy plik wykonywalny - perfview.exe. Dzięki temu możemy go bez problemu użyć na dowolnym komputerze, również serwerach produkcyjnych.
  20. Windows Performance Recorder i Windows Performance Analyzer
  21. - przede wszystkim pomyślane jako performance dla .NET (Vance Morrison, Visual Studio performance architect) - Narzędzie to jest używane przez zespół Visual Studio w celu dbania o wydajność tego narzędzia. Jak również przez zespół .NET w celu dbania o wydajność samego frameworku - Jest też napisany tak by rozpoczęcie pracy z nim było banalnie proste. Nie wymaga żadnej instalacji. Jest to po prostu pojedynczy plik wykonywalny - perfview.exe. Dzięki temu możemy go bez problemu użyć na dowolnym komputerze, również serwerach produkcyjnych.
  22. - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  23. - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  24. - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  25. - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  26. - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  27. - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  28. - posiada potężną pomoc, właściwe każda opcja i element GUI jest linkiem prowadzącym do dokumentacji - przy konkretnym evencie Open Any Stack - pokazuje jego stackview - automatycznie resolvuje symbole JITted kodu zarządzalnego - oparty głównie na ETW ale również na: - The ETWCLrProfiler dlls that allow PerfView intercept the .NET Method calls (see .NET Call in the collect dialog)
  29. - przede wszystkim pomyślane jako performance dla .NET (Vance Morrison, Visual Studio performance architect) - Narzędzie to jest używane przez zespół Visual Studio w celu dbania o wydajność tego narzędzia. Jak również przez zespół .NET w celu dbania o wydajność samego frameworku - Jest też napisany tak by rozpoczęcie pracy z nim było banalnie proste. Nie wymaga żadnej instalacji. Jest to po prostu pojedynczy plik wykonywalny - perfview.exe. Dzięki temu możemy go bez problemu użyć na dowolnym komputerze, również serwerach produkcyjnych.
  30. kiedyś - żmudne, trzeba było utworzyć plik manifestu, utworzyć z niego poprzez mc.exe kod, zarejestrować manualnie wevtutil.exe - jedna z przyczyn zerowej popularności?
  31. tworzy manifest automatycznie z kodu i załącza go do logu
  32. tworzy manifest automatycznie z kodu i załącza go do logu pokazać kod pokazać PerfView logi - sam event jak i ManifestData pokazać CPU Stack
  33. tworzy manifest automatycznie z kodu i załącza go do logu
  34. tworzy manifest automatycznie z kodu i załącza go do logu
  35. tworzy manifest automatycznie z kodu i załącza go do logu
  36. Zastrzelcie mnie pytaniami – najlepiej osobiście, żeby się wstydu nie najeść!