SlideShare a Scribd company logo
1 of 75
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
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
18
Przykłady
19
eventvwr.exe
20
resmon.exe
21
perfmon.exe
22
ETW Event
23
Event ETW
• Id
• Version
• Keyword
• Level
• Opcode
• Task
• …
24
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
25
logman query providers ".NET Common
Language Runtime"
26
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ł 
27
28
29
30
31
Narzędzia
32
xperf
33
xperf -start <SESSION_NAME> -on
PROC_THREAD+LOADER+Base -on ".NET Common
Language Runtime":::'stack'
xperf -stop <SESSION_NAME> -d trace.etl
34
Windows Performance Toolkit
35
Demo
36
37
38
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
39
PerfView
40
PerfView
https://github.com/Microsoft/perfview
41
Demo
42
43
44
45
46
47
48
49
wtrace, etrace
https://github.com/lowleveldesign/wtrace
https://github.com/goldshtn/etrace
50
Concurrency Visualizer w Visual Studio
51
Jak to ugryźć?
52
logman query providers
logman query providers "Windows Kernel
Trace"
logman query providers | findstr DotNET
logman query providers -pid XXXX
53
xperf -loggers
54
!wmitrace - WinDbg
55
Architektura
56
57
58
59
ETW Session
60
61
62
Programowanie
63
Kiedyś* - żmudne
* do 2012 - .NET 4.5
64
Teraz - EventSource
65
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();
}
66
Teraz - TraceEvent
67
using (var session = new TraceEventSession("SimpleMontitorSession",
"MyEventsFile.etl"))
{
var eventSourceGuid =
TraceEventProviders.GetEventSourceGuidFromName("MyEventSource");
session.EnableProvider(eventSourceGuid);
Thread.Sleep(10000);
}
68
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
Demo
70
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”
71
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”
72
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
73
Wady:
• Całkiem niezły “tooling”
74
Dziękuję za uwagę! Pytania?!
75

More Related Content

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

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ł GrajewskiPROIDEA
 
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- 4developers2016PROIDEA
 
4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o archit...
4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o archit...4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o archit...
4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o archit...PROIDEA
 
I ty też możesz mieć swoje dane w cache
I ty też możesz mieć swoje dane w cacheI ty też możesz mieć swoje dane w cache
I ty też możesz mieć swoje dane w cacheJaroslaw Palka
 
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiWJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiKrzysztof Ślusarski
 
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...PROIDEA
 
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
 
ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015Michał Dudak
 
[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
 
Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Semihalf
 
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.jsPatryk Jar
 
Seminarium .Net CF 2004
Seminarium .Net CF 2004Seminarium .Net CF 2004
Seminarium .Net CF 2004Tomasz Cieplak
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychMarcin Jasiński
 
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...PROIDEA
 
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 GraalVMArtur Skowroński
 
Jak napisać własny RTOS!
Jak napisać własny RTOS!Jak napisać własny RTOS!
Jak napisać własny RTOS!Semihalf
 

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

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
 
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
 
4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o archit...
4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o archit...4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o archit...
4Developers 2015: Jaka piękna katastrofa w doskonałym świecie, rzecz o archit...
 
I ty też możesz mieć swoje dane w cache
I ty też możesz mieć swoje dane w cacheI ty też możesz mieć swoje dane w cache
I ty też możesz mieć swoje dane w cache
 
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof ŚlusarskiWJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
WJUG #257 Just-In-Time compiler - ukryty "przyjaciel" - Krzysztof Ślusarski
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
JDD2015: Logowanie zdarzeń w architekturze opartej na mikroserwisach - Paweł ...
 
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ć.
 
Benchmarking
Benchmarking Benchmarking
Benchmarking
 
ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015ITAD PolSl 2014 - Nowości w .NET 2015
ITAD PolSl 2014 - Nowości w .NET 2015
 
[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...
 
Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.Programowanie sterowników w Linuksie.
Programowanie sterowników w Linuksie.
 
Modularny JavaScript - meet.js
Modularny JavaScript - meet.jsModularny JavaScript - meet.js
Modularny JavaScript - meet.js
 
Devops/Sysops security
Devops/Sysops securityDevops/Sysops security
Devops/Sysops security
 
Seminarium .Net CF 2004
Seminarium .Net CF 2004Seminarium .Net CF 2004
Seminarium .Net CF 2004
 
Confitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów SparkowychConfitura 2018 - Sekretne życie jobów Sparkowych
Confitura 2018 - Sekretne życie jobów Sparkowych
 
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
JDD2014: JAVA.util.concurrent czyli wielowątkowość z różnych perspektyw, tych...
 
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
 
Jak napisać własny RTOS!
Jak napisać własny RTOS!Jak napisać własny RTOS!
Jak napisać własny RTOS!
 

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ówKonrad Kokosa
 
Narysuj Swoją Karierę IT - Konrad Kokosa
Narysuj Swoją Karierę IT - Konrad KokosaNarysuj Swoją Karierę IT - Konrad Kokosa
Narysuj Swoją Karierę IT - Konrad KokosaKonrad 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 - WDIKonrad Kokosa
 
BoilingFrogs 2016 - Web performance
BoilingFrogs 2016 - Web performanceBoilingFrogs 2016 - Web performance
BoilingFrogs 2016 - Web performanceKonrad 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 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. 23 Event ETW • Id • Version • Keyword • Level • Opcode • Task • …
  • 24. 24 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
  • 25. 25 logman query providers ".NET Common Language Runtime"
  • 26. 26 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ł 
  • 27. 27
  • 28. 28
  • 29. 29
  • 30. 30
  • 33. 33 xperf -start <SESSION_NAME> -on PROC_THREAD+LOADER+Base -on ".NET Common Language Runtime":::'stack' xperf -stop <SESSION_NAME> -d trace.etl
  • 36. 36
  • 37. 37
  • 38. 38 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
  • 42. 42
  • 43. 43
  • 44. 44
  • 45. 45
  • 46. 46
  • 47. 47
  • 48. 48
  • 52. 52 logman query providers logman query providers "Windows Kernel Trace" logman query providers | findstr DotNET logman query providers -pid XXXX
  • 56. 56
  • 57. 57
  • 58. 58
  • 60. 60
  • 61. 61
  • 63. 63 Kiedyś* - żmudne * do 2012 - .NET 4.5
  • 65. 65 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. 67 using (var session = new TraceEventSession("SimpleMontitorSession", "MyEventsFile.etl")) { var eventSourceGuid = TraceEventProviders.GetEventSourceGuidFromName("MyEventSource"); session.EnableProvider(eventSourceGuid); Thread.Sleep(10000); }
  • 68. 68 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(); }
  • 70. 70 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”
  • 71. 71 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”
  • 72. 72 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
  • 74. 74
  • 75. Dziękuję za uwagę! Pytania?! 75

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 Potężne narzędzie do logowania – ale przez to “logowanie” rozumiem naprawdę niskopoziomowe rzeczy
  3. Empire Total War
  4. Empire Total War
  5. Linux dtrace "in the field monitoring/diagnostic"
  6. .NET Core - Dla Linuxa LLTng
  7. - PerfMon.exe i Performance Counters - NIE oparte o ETW
  8. 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.
  9. CLR też ma zarejestrowany provider! co oferuje dany PID
  10. CLR też ma zarejestrowany provider! co oferuje dany PID
  11. Windows Performance Recorder i Windows Performance Analyzer
  12. Odpalić ScriptApp – wklepać cokolwiek, odpalić Run Odpalić WPR, zacząć Collect, powtórzyć wykonanie skryptu/Run, zatrzymać Odpalić gotowe WPA – Stacks, …
  13. Windows Performance Recorder i Windows Performance Analyzer
  14. Windows Performance Recorder i Windows Performance Analyzer
  15. Windows Performance Recorder i Windows Performance Analyzer
  16. - 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.
  17. - 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)
  18. Odpalić ScriptApp – kliknąć Run generując brak obsługi Odpalić PerfView, zacząć Collect, powtórzyć Run Odpalić gotową analize PerfView – Exception stack, Events, GC stats
  19. - 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)
  20. - 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)
  21. - 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)
  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. CLR też ma zarejestrowany provider! co oferuje dany PID
  27. CLR też ma zarejestrowany provider! co oferuje dany PID
  28. Cechą charakterystyczną ETW jest operowanie na poziomie providerów, a nie np. procesów. Nie możemy włączyć logowania tylko calc.exe
  29. 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?
  30. tworzy manifest automatycznie z kodu i załącza go do logu
  31. tworzy manifest automatycznie z kodu i załącza go do logu pokazać kod pokazać PerfView logi - sam event jak i ManifestData pokazać CPU Stack
  32. tworzy manifest automatycznie z kodu i załącza go do logu
  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. Linux dtrace "in the field monitoring/diagnostic"
  36. Linux dtrace "in the field monitoring/diagnostic"
  37. Linux dtrace "in the field monitoring/diagnostic"
  38. Linux dtrace "in the field monitoring/diagnostic"
  39. Zastrzelcie mnie pytaniami – najlepiej osobiście, żeby się wstydu nie najeść!