mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/trace: task-oriented view includes child tasks
R=go1.11 Change-Id: Ibb09e309c745eba811a0b53000c063bc10a055e1 Reviewed-on: https://go-review.googlesource.com/90218 Run-TryBot: Hyang-Ah Hana Kim <hyangah@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Peter Weinberger <pjw@google.com>
This commit is contained in:
parent
d6856036bf
commit
fdcf4f712b
3 changed files with 182 additions and 24 deletions
|
|
@ -195,8 +195,8 @@ func httpJsonTrace(w http.ResponseWriter, r *http.Request) {
|
|||
log.Printf("failed to parse taskid parameter %q: %v", taskids, err)
|
||||
return
|
||||
}
|
||||
tasks, _ := analyzeAnnotations()
|
||||
task, ok := tasks[taskid]
|
||||
annotRes, _ := analyzeAnnotations()
|
||||
task, ok := annotRes.tasks[taskid]
|
||||
if !ok {
|
||||
log.Printf("failed to find task with id %d", taskid)
|
||||
return
|
||||
|
|
@ -206,8 +206,15 @@ func httpJsonTrace(w http.ResponseWriter, r *http.Request) {
|
|||
params.startTime = task.firstTimestamp() - 1
|
||||
params.endTime = task.lastTimestamp() + 1
|
||||
params.maing = goid
|
||||
params.gs = task.RelatedGoroutines(res.Events, 0) // find only directly involved goroutines
|
||||
params.showTask = task
|
||||
params.tasks = task.decendents()
|
||||
gs := map[uint64]bool{}
|
||||
for _, t := range params.tasks {
|
||||
// find only directly involved goroutines
|
||||
for k, v := range t.RelatedGoroutines(res.Events, 0) {
|
||||
gs[k] = v
|
||||
}
|
||||
}
|
||||
params.gs = gs
|
||||
}
|
||||
|
||||
data, err := generateTrace(params)
|
||||
|
|
@ -296,7 +303,7 @@ type traceParams struct {
|
|||
endTime int64
|
||||
maing uint64 // for goroutine-oriented view, place this goroutine on the top row
|
||||
gs map[uint64]bool // Goroutines to be displayed for goroutine-oriented or task-oriented view
|
||||
showTask *taskDesc // Task to be displayed
|
||||
tasks []*taskDesc // Tasks to be displayed. tasks[0] is the top-most task
|
||||
}
|
||||
|
||||
type traceviewMode int
|
||||
|
|
@ -627,6 +634,7 @@ func generateTrace(params *traceParams) (ViewerData, error) {
|
|||
ctx.emit(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: 0, Tid: trace.SyscallP, Arg: &NameArg{"Syscalls"}})
|
||||
ctx.emit(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: 0, Tid: trace.SyscallP, Arg: &SortIndexArg{-3}})
|
||||
|
||||
// Display rows for Ps if we are in the default trace view mode.
|
||||
if ctx.mode == defaultTraceview {
|
||||
for i := 0; i <= maxProc; i++ {
|
||||
ctx.emit(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: 0, Tid: uint64(i), Arg: &NameArg{fmt.Sprintf("Proc %v", i)}})
|
||||
|
|
@ -634,20 +642,23 @@ func generateTrace(params *traceParams) (ViewerData, error) {
|
|||
}
|
||||
}
|
||||
|
||||
// Display task and its spans
|
||||
taskRow := uint64(trace.GCP + 1)
|
||||
if task := ctx.showTask; task != nil {
|
||||
taskName := fmt.Sprintf("Task %s(%d)", task.name, task.id)
|
||||
ctx.emit(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: 0, Tid: taskRow, Arg: &NameArg{"Tasks"}})
|
||||
ctx.emit(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: 0, Tid: taskRow, Arg: &SortIndexArg{-3}})
|
||||
ctx.emit(&ViewerEvent{Category: "task", Name: taskName, Phase: "b", Time: float64(task.firstTimestamp()) / 1e3, Tid: taskRow, ID: task.id, Cname: "bad"})
|
||||
ctx.emit(&ViewerEvent{Category: "task", Name: taskName, Phase: "e", Time: float64(task.lastTimestamp()) / 1e3, Tid: taskRow, ID: task.id, Cname: "bad"})
|
||||
// Spans
|
||||
for _, s := range task.spans {
|
||||
ctx.emitSpan(s)
|
||||
// Display task and its spans if we are in the taskTrace view mode.
|
||||
if ctx.mode == taskTraceview {
|
||||
taskRow := uint64(trace.GCP + 1)
|
||||
for _, task := range ctx.tasks {
|
||||
taskName := fmt.Sprintf("Task %s(%d)", task.name, task.id)
|
||||
ctx.emit(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: 0, Tid: taskRow, Arg: &NameArg{"Tasks"}})
|
||||
ctx.emit(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: 0, Tid: taskRow, Arg: &SortIndexArg{-3}})
|
||||
ctx.emit(&ViewerEvent{Category: "task", Name: taskName, Phase: "b", Time: float64(task.firstTimestamp()) / 1e3, Tid: taskRow, ID: task.id, Cname: "bad"})
|
||||
ctx.emit(&ViewerEvent{Category: "task", Name: taskName, Phase: "e", Time: float64(task.lastTimestamp()) / 1e3, Tid: taskRow, ID: task.id, Cname: "bad"})
|
||||
// Spans
|
||||
for _, s := range task.spans {
|
||||
ctx.emitSpan(s)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Display goroutine rows if we are either in gtrace or taskTrace view mode.
|
||||
if ctx.mode != defaultTraceview && ctx.gs != nil {
|
||||
for k, v := range ginfos {
|
||||
if !ctx.gs[k] {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue