diff options
Diffstat (limited to 'src/cmd/trace/v2/gen.go')
| -rw-r--r-- | src/cmd/trace/v2/gen.go | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/cmd/trace/v2/gen.go b/src/cmd/trace/v2/gen.go index ad1599db92..f6a4bb643b 100644 --- a/src/cmd/trace/v2/gen.go +++ b/src/cmd/trace/v2/gen.go @@ -31,6 +31,9 @@ type generator interface { ProcRange(ctx *traceContext, ev *tracev2.Event) ProcTransition(ctx *traceContext, ev *tracev2.Event) + // User annotations. + Log(ctx *traceContext, ev *tracev2.Event) + // Finish indicates the end of the trace and finalizes generation. Finish(ctx *traceContext) } @@ -69,6 +72,8 @@ func runGenerator(ctx *traceContext, g generator, parsed *parsedTrace, opts *gen case tracev2.ResourceGoroutine: g.GoroutineTransition(ctx, ev) } + case tracev2.EventLog: + g.Log(ctx, ev) } } for i, task := range opts.tasks { @@ -357,3 +362,33 @@ type completedRange struct { endStack tracev2.Stack arg any } + +type logEventGenerator[R resource] struct { + // getResource is a function to extract a resource ID from a Log event. + getResource func(*tracev2.Event) R +} + +// Log implements a log event handler. It expects ev to be one such event. +func (g *logEventGenerator[R]) Log(ctx *traceContext, ev *tracev2.Event) { + id := g.getResource(ev) + if id == R(noResource) { + // We have nowhere to put this in the UI. + return + } + + // Construct the name to present. + log := ev.Log() + name := log.Message + if log.Category != "" { + name = "[" + log.Category + "] " + name + } + + // Emit an instant event. + ctx.Instant(traceviewer.InstantEvent{ + Name: name, + Ts: ctx.elapsed(ev.Time()), + Category: "user event", + Resource: uint64(id), + Stack: ctx.Stack(viewerFrames(ev.Stack())), + }) +} |
