This repository contains code for decoding and encoding runtime/trace files as well as useful functionality implemented on top.
go install github.com/felixge/traceutils/cmd/traceutils@latest Commands: anonymize, breakdown, flamescope, pprof, print, strings, stw
The anonymize command can be used to remove all file paths, function names and user logs from a trace file. The go stdlib is not anonymized, but all other packages are. This is useful for sharing traces that may contain sensitive information.
traceutils anonymize <input> <output> Example output:
DEPRECATED: As of go1.23, the go tool trace command has a built-in breakdown command that you should use instead: go tool trace -d=footprint <trace>.
The breakdown command can be used to analyze the contents of a trace.
traceutils breakdown bytes <input> Example output:
+------------------------+----------+---------+ | EVENT TYPE | BYTES | % | +------------------------+----------+---------+ | EventGoSched | 235.9 kB | 35.88% | | EventGoStartLocal | 193.8 kB | 29.48% | | EventHeapAlloc | 81.6 kB | 12.41% | | EventStack | 44.1 kB | 6.70% | | EventString | 27.7 kB | 4.22% | ... +------------------------+----------+---------+ | TOTAL | 657.5 KB | 100.00% | +------------------------+----------+---------+ traceutils breakdown count <input> Example output:
+------------------------+--------+---------+ | EVENT TYPE | COUNT | % | +------------------------+--------+---------+ | EventGoStartLocal | 61612 | 41.88% | | EventGoSched | 58859 | 40.01% | | EventHeapAlloc | 11801 | 8.02% | | EventGoPreempt | 2354 | 1.60% | | EventGoSysCall | 1791 | 1.22% | ... +------------------------+--------+---------+ | TOTAL | 147111 | 100.00% | +------------------------+--------+---------+ traceutils breakdown csv <input> Example output:
Event Type,Count,Bytes EventGoStartLabel,596,4007 EventHeapAlloc,11801,81561 EventProcStart,1198,5381 EventGoStartLocal,61612,193841 EventGoSysCall,1791,7069 ... Extract CPU samples from a trace and convert them to a format suitable for FlameScope.
traceutils flamescope <input> <output> See FlameScope for Go blog post for more details.
Example output:
Converts a trace to a pprof wall clock profile.
traceutils pprof wall <input> <output> traceutils print events <input> Example output:
0 GoCreate p=0 g=0 stk=1 g=1 stack=2 2208 GoCreate p=0 g=0 stk=1 g=2 stack=3 2288 GoWaiting p=0 g=2 stk=0 g=2 2496 GoCreate p=0 g=0 stk=1 g=3 stack=4 2592 GoWaiting p=0 g=3 stk=0 g=3 4384 GoCreate p=0 g=0 stk=1 g=4 stack=5 ... traceutils print stacks <input> Example output:
stack 14: runtime/trace.Start.func1() /Users/bob/go/src/github.com/golang/go/src/runtime/trace/trace.go:130 stack 15: runtime.asyncPreempt() /Users/bob/go/src/github.com/golang/go/src/runtime/preempt_arm64.s:47 main.main.func1() /Users/bob/go/src/github.com/felixge/felixge.de/runtime-trace-examples/main.go:24 ... Prints all strings contained inside of a trace. This is useful for verifying the output of anonymize.
traceutils strings <input> Example output:
Not worker GC (dedicated) GC (fractional) GC (idle) runtime.asyncPreempt XXX/src/runtime/preempt_arm64.s XXX XXX.go List all stop-the-world events in a trace.
traceutils stw top <input> Example output:
+-----------+--------------+-------------------+------------+ | DURATION | START | TYPE | PERCENTILE | +-----------+--------------+-------------------+------------+ | 154.912µs | 227.279429ms | mark termination | 100.00 | | 89.376µs | 504.95696ms | mark termination | 97.62 | | 70.128µs | 200.131507ms | mark termination | 95.24 | | 64.912µs | 214.2521ms | sweep termination | 92.86 | | 62.544µs | 224.908853ms | sweep termination | 90.48 | ... | 18.784µs | 2.323248ms | sweep termination | 2.38 | +-----------+--------------+-------------------+------------+ traceutils stw csv <input> Example output:
Start (ms),Duration (ms),Type 2.323248,0.018784,sweep termination 2.777536,0.061712,mark termination 7.065904,0.020464,sweep termination 7.808416,0.034032,mark termination ... 504.956960,0.089376,mark termination MIT

