diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2015-11-19 19:02:30 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2015-11-19 19:02:30 +0100 |
| commit | 6c48b5b4efc91533658dababa47587689b4a6ae1 (patch) | |
| tree | fcaff6eb6f3336de892bb3b925f22ed8d16918f7 /manager/html.go | |
| parent | 7677b07a714e16bc48aa541e1deb807f2ce0774e (diff) | |
add various statistics to http interface
Diffstat (limited to 'manager/html.go')
| -rw-r--r-- | manager/html.go | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/manager/html.go b/manager/html.go index 782fa1953..6123160d9 100644 --- a/manager/html.go +++ b/manager/html.go @@ -11,6 +11,7 @@ import ( "net/http" "sort" "strconv" + "time" "github.com/google/syzkaller/cover" "github.com/google/syzkaller/prog" @@ -47,14 +48,31 @@ func (mgr *Manager) httpInfo(w http.ResponseWriter, r *http.Request) { cc.cov = cover.Union(cc.cov, cover.Cover(inp.Cover)) } + uptime := time.Since(mgr.startTime) data := &UIData{ Name: mgr.cfg.Name, MasterHttp: mgr.masterHttp, MasterCorpusSize: len(mgr.masterCorpus), CorpusSize: len(mgr.corpus), TriageQueue: len(mgr.candidates), + Uptime: fmt.Sprintf("%v", uptime), } + secs := uint64(uptime) / 1e9 + for k, v := range mgr.stats { + val := "" + if x := v / secs; x >= 10 { + val = fmt.Sprintf("%v/sec", x) + } else if x := v * 60 / secs; x >= 10 { + val = fmt.Sprintf("%v/min", x) + } else { + x := v * 60 * 60 / secs + val = fmt.Sprintf("%v/hour", x) + } + data.Stats = append(data.Stats, UIStat{Name: k, Value: val}) + } + sort.Sort(UIStatArray(data.Stats)) + var cov cover.Cover for c, cc := range calls { cov = cover.Union(cov, cc.cov) @@ -171,9 +189,16 @@ type UIData struct { CorpusSize int TriageQueue int CoverSize int + Uptime string + Stats []UIStat Calls []UICallType } +type UIStat struct { + Name string + Value string +} + type UICallType struct { Name string Inputs int @@ -200,6 +225,12 @@ func (a UIInputArray) Len() int { return len(a) } func (a UIInputArray) Less(i, j int) bool { return a[i].Cover > a[j].Cover } func (a UIInputArray) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +type UIStatArray []UIStat + +func (a UIStatArray) Len() int { return len(a) } +func (a UIStatArray) Less(i, j int) bool { return a[i].Name < a[j].Name } +func (a UIStatArray) Swap(i, j int) { a[i], a[j] = a[j], a[i] } + var htmlTemplate = template.Must(template.New("").Parse(` <!doctype html> <html> @@ -208,11 +239,17 @@ var htmlTemplate = template.Must(template.New("").Parse(` </head> <body> Manager: {{.Name}} <a href='http://{{.MasterHttp}}'>[master]</a> <br> +Uptime: {{.Uptime}}<br> Master corpus: {{.MasterCorpusSize}} <br> Corpus: {{.CorpusSize}}<br> Triage queue len: {{.TriageQueue}}<br> <a href='/cover'>Cover: {{.CoverSize}}</a> <br> <br> +Stats: <br> +{{range $stat := $.Stats}} + {{$stat.Name}}: {{$stat.Value}}<br> +{{end}} +<br> {{range $c := $.Calls}} {{$c.Name}} <a href='/corpus?call={{$c.Name}}'>inputs:{{$c.Inputs}}</a> <a href='/cover?call={{$c.Name}}'>cover:{{$c.Cover}}</a> <a href='/prio?call={{$c.Name}}'>prio</a> <br> {{end}} |
