@@ -2,35 +2,30 @@ package main
22
33import (
44 "flag"
5+ "fmt"
56 "io"
67 "log"
78 "os"
89 "os/signal"
10+ "strconv"
11+ "strings"
912
1013 "github.com/pyroscope-io/dotnetdiag"
14+ "github.com/pyroscope-io/dotnetdiag/nettrace"
15+ "github.com/pyroscope-io/dotnetdiag/nettrace/profiler"
1116)
1217
1318func main () {
14- var (
15- socketFilePath string
16- outputFilePath = "my-traces.nettrace"
17- )
18-
19- flag .StringVar (& socketFilePath , "s" , "" , "Path to Diagnostic IPC socket" )
20- flag .StringVar (& outputFilePath , "o" , "my-traces.nettrace" , "Output file." )
19+ var ps string
20+ flag .StringVar (& ps , "p" , "" , "Target process ID" )
2121 flag .Parse ()
2222
23- if socketFilePath == "" {
24- log .Fatalln ("Diagnostic IPC socket path is required." )
25- }
26-
27- file , err := os .Create (outputFilePath )
23+ pid , err := strconv .Atoi (ps )
2824 if err != nil {
29- log .Fatalln (err )
25+ log .Fatalln ("Invalid PID:" , err )
3026 }
31- defer file .Close ()
3227
33- c := dotnetdiag .NewClient (socketFilePath )
28+ c := dotnetdiag .NewClient (dotnetdiag . DefaultServerAddress ( pid ) )
3429 ctc := dotnetdiag.CollectTracingConfig {
3530 CircularBufferSizeMB : 10 ,
3631 Providers : []dotnetdiag.ProviderConfig {
@@ -57,9 +52,45 @@ func main() {
5752 }
5853 }()
5954
60- if _ , err = io .Copy (file , sess ); err != nil {
55+ // Process the stream with the sample profiler.
56+ stream := nettrace .NewStream (sess )
57+ trace , err := stream .Open ()
58+ if err != nil {
59+ _ = sess .Close ()
6160 log .Fatalln (err )
6261 }
6362
64- log .Println ("Done" )
63+ p := profiler .NewSampleProfiler (trace )
64+ stream .EventHandler = p .EventHandler
65+ stream .MetadataHandler = p .MetadataHandler
66+ stream .StackBlockHandler = p .StackBlockHandler
67+ stream .SequencePointBlockHandler = p .SequencePointBlockHandler
68+
69+ log .Println ("Collecting trace log" )
70+ for {
71+ switch err = stream .Next (); err {
72+ default :
73+ log .Fatalln (err )
74+ case nil :
75+ continue
76+ case io .EOF :
77+ p .Walk (treePrinter (os .Stdout ))
78+ log .Println ("Done" )
79+ return
80+ }
81+ }
82+ }
83+
84+ func treePrinter (w io.Writer ) func (profiler.FrameInfo ) {
85+ return func (frame profiler.FrameInfo ) {
86+ _ , _ = fmt .Fprintf (w , "%s(%v) %s\n " , padding (frame .Level ), frame .SampledTime , frame .Name )
87+ }
88+ }
89+
90+ func padding (x int ) string {
91+ var s strings.Builder
92+ for i := 0 ; i < x ; i ++ {
93+ s .WriteString ("\t " )
94+ }
95+ return s .String ()
6596}
0 commit comments