go / expert
Snippet
Feingranulares Latenz-Profiling mit runtime/trace Regionen und Tasks
Das Standard-Package runtime/trace ermöglicht Entwicklern das Instrumentieren von benutzerdefinierten Tasks, Regionen und Trace-Logs. Diese Annotationen integrieren sich direkt in Ausführungstraces von 'go tool trace' und bieten tiefen Einblick in Goroutine-Blockierungslatenzen, GC-Phasen und Ausführungszeiten.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package mainimport ("context""os""runtime/trace""time")func ProcessDataBatch(ctx context.Context, batchID int) {ctx, task := trace.NewTask(ctx, "ProcessBatch")defer task.End()trace.Log(ctx, "batchID", string(rune(batchID)))region := trace.StartRegion(ctx, "ComputeStage")time.Sleep(10 * time.Millisecond)region.End()regionIO := trace.StartRegion(ctx, "IOFlushStage")time.Sleep(15 * time.Millisecond)regionIO.End()}func main() {f, err := os.Create("trace.out")if err != nil {panic(err)}defer f.Close()if err := trace.Start(f); err != nil {panic(err)}defer trace.Stop()ProcessDataBatch(context.Background(), 42)}
Erklärung
1
ctx, task := trace.NewTask(ctx, "ProcessBatch")
Erstellt eine logische Ausführungseinheit im Kontext, die alle untergeordneten Spans und Trace-Logs in der Visualisierung gruppiert.
2
region := trace.StartRegion(ctx, "ComputeStage")
Markiert den Beginn eines hochauflösenden Sub-Intervalls innerhalb einer Task, um die exakte Dauer kritischer Codeblöcke zu messen.