Skip to content

Commit

Permalink
cmd/trace/v2: emit user log annotations in all views
Browse files Browse the repository at this point in the history
This was an oversight in porting over cmd/trace to the new trace format
and API.

Fixes golang#65153.

Change-Id: I883d302f95956fcc9abb60aa53165acb6d099d67
Reviewed-on: https://go-review.googlesource.com/c/go/+/557175
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
  • Loading branch information
mknyszek authored and ezz-no committed Feb 17, 2024
1 parent 990c87c commit 2712751
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 3 deletions.
35 changes: 35 additions & 0 deletions src/cmd/trace/v2/gen.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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())),
})
}
5 changes: 4 additions & 1 deletion src/cmd/trace/v2/goroutinegen.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ type goroutineGenerator struct {
globalRangeGenerator
globalMetricGenerator
stackSampleGenerator[tracev2.GoID]
logEventGenerator[tracev2.GoID]

gStates map[tracev2.GoID]*gState[tracev2.GoID]
focus tracev2.GoID
Expand All @@ -22,9 +23,11 @@ type goroutineGenerator struct {

func newGoroutineGenerator(ctx *traceContext, focus tracev2.GoID, filter map[tracev2.GoID]struct{}) *goroutineGenerator {
gg := new(goroutineGenerator)
gg.stackSampleGenerator.getResource = func(ev *tracev2.Event) tracev2.GoID {
rg := func(ev *tracev2.Event) tracev2.GoID {
return ev.Goroutine()
}
gg.stackSampleGenerator.getResource = rg
gg.logEventGenerator.getResource = rg
gg.gStates = make(map[tracev2.GoID]*gState[tracev2.GoID])
gg.focus = focus
gg.filter = filter
Expand Down
5 changes: 4 additions & 1 deletion src/cmd/trace/v2/procgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ type procGenerator struct {
globalMetricGenerator
procRangeGenerator
stackSampleGenerator[tracev2.ProcID]
logEventGenerator[tracev2.ProcID]

gStates map[tracev2.GoID]*gState[tracev2.ProcID]
inSyscall map[tracev2.ProcID]*gState[tracev2.ProcID]
Expand All @@ -26,9 +27,11 @@ type procGenerator struct {

func newProcGenerator() *procGenerator {
pg := new(procGenerator)
pg.stackSampleGenerator.getResource = func(ev *tracev2.Event) tracev2.ProcID {
rg := func(ev *tracev2.Event) tracev2.ProcID {
return ev.Proc()
}
pg.stackSampleGenerator.getResource = rg
pg.logEventGenerator.getResource = rg
pg.gStates = make(map[tracev2.GoID]*gState[tracev2.ProcID])
pg.inSyscall = make(map[tracev2.ProcID]*gState[tracev2.ProcID])
return pg
Expand Down
5 changes: 4 additions & 1 deletion src/cmd/trace/v2/threadgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,19 @@ type threadGenerator struct {
globalRangeGenerator
globalMetricGenerator
stackSampleGenerator[tracev2.ThreadID]
logEventGenerator[tracev2.ThreadID]

gStates map[tracev2.GoID]*gState[tracev2.ThreadID]
threads map[tracev2.ThreadID]struct{}
}

func newThreadGenerator() *threadGenerator {
tg := new(threadGenerator)
tg.stackSampleGenerator.getResource = func(ev *tracev2.Event) tracev2.ThreadID {
rg := func(ev *tracev2.Event) tracev2.ThreadID {
return ev.Thread()
}
tg.stackSampleGenerator.getResource = rg
tg.logEventGenerator.getResource = rg
tg.gStates = make(map[tracev2.GoID]*gState[tracev2.ThreadID])
tg.threads = make(map[tracev2.ThreadID]struct{})
return tg
Expand Down

0 comments on commit 2712751

Please sign in to comment.