From 50debbced69a619133f7cc608ae53a19e78267bd Mon Sep 17 00:00:00 2001 From: Simon Richardson Date: Fri, 11 Jul 2014 10:22:59 +0100 Subject: [PATCH 1/3] Allow the ability to save the graph. Limitations: Currently FF saves with incorrect image extension and the background of the image is transparent (will fix later). --- main.go | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index b8b4c70..b529cf3 100644 --- a/main.go +++ b/main.go @@ -115,13 +115,20 @@ var visTmpl = template.Must(template.New("vis").Parse(` ] $(document).ready(function() { - $.plot($("#placeholder"), data, { - xaxis: { + var plot = $.plot($("#placeholder"), data, { + xaxis: { mode: "time", timeformat: "%I:%M:%S " - }, - }) - }) + }, + }); + + $("#output-image").click(function() { + var canvas = plot.getCanvas(); + var raw = canvas.toDataURL(); + var image = raw.replace("image/png", "image/octet-stream"); + document.location.href = image; + }); + }) @@ -137,6 +144,7 @@ scvg.sys: virtual memory requested from the operating system (should aproximate scvg.released: virtual memory returned to the operating system by the scavenger scvg.consumed: virtual memory in use (should roughly match process RSS) + `)) From de5560c05bbcafdab917a56461522a3f165c142f Mon Sep 17 00:00:00 2001 From: Simon Richardson Date: Fri, 11 Jul 2014 11:44:31 +0100 Subject: [PATCH 2/3] Adding updating of graphs via polling --- main.go | 97 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 75 insertions(+), 22 deletions(-) diff --git a/main.go b/main.go index b529cf3..5ddaa41 100644 --- a/main.go +++ b/main.go @@ -3,11 +3,12 @@ // // usage: // -// gcvis program [arguments]... +// gcvis program [arguments]... package main import ( "bufio" + "encoding/json" "fmt" "html/template" "io" @@ -24,10 +25,9 @@ import ( "github.com/pkg/browser" ) -func startSubprocess(w io.Writer) { +func startSubprocess(args []string, w io.Writer) { env := os.Environ() env = append(env, "GODEBUG=gctrace=1") - args := os.Args[1:] cmd := exec.Command(args[0], args[1:]...) cmd.Env = env cmd.Stdin = os.Stdin @@ -80,7 +80,7 @@ var mu sync.RWMutex func index(w http.ResponseWriter, req *http.Request) { mu.RLock() defer mu.RUnlock() - visTmpl.Execute(w, struct { + visIndexTmpl.Execute(w, struct { HeapUse, ScvgInuse, ScvgIdle, ScvgSys, ScvgReleased, ScvgConsumed []graphPoints Title string }{ @@ -92,10 +92,30 @@ func index(w http.ResponseWriter, req *http.Request) { ScvgConsumed: scvgconsumed, Title: strings.Join(os.Args[1:], " "), }) +} +func ajax(w http.ResponseWriter, req *http.Request) { + mu.RLock() + defer mu.RUnlock() + toJsonString := func(g []graphPoints) string { + j, _ := json.Marshal(g) + return string(j) + } + visAjaxTmpl.Execute(w, struct { + HeapUse, ScvgInuse, ScvgIdle, ScvgSys, ScvgReleased, ScvgConsumed string + Title string + }{ + HeapUse: toJsonString(heapuse), + ScvgInuse: toJsonString(scvginuse), + ScvgIdle: toJsonString(scvgidle), + ScvgSys: toJsonString(scvgsys), + ScvgReleased: toJsonString(scvgreleased), + ScvgConsumed: toJsonString(scvgconsumed), + Title: strings.Join(os.Args[1:], " "), + }) } -var visTmpl = template.Must(template.New("vis").Parse(` +var visIndexTmpl = template.Must(template.New("vis-index").Parse(` gcvis - {{ .Title }} @@ -105,30 +125,50 @@ var visTmpl = template.Must(template.New("vis").Parse(` @@ -144,11 +184,23 @@ scvg.sys: virtual memory requested from the operating system (should aproximate scvg.released: virtual memory returned to the operating system by the scavenger scvg.consumed: virtual memory in use (should roughly match process RSS) + `)) +var visAjaxTmpl = template.Must(template.New("vis-ajax").Parse(` +[ + { "label": "gc.heapinuse", "data": {{ .HeapUse }} }, + { "label": "scvg.inuse", "data": {{ .ScvgInuse }} }, + { "label": "scvg.idle", "data": {{ .ScvgIdle }} }, + { "label": "scvg.sys", "data": {{ .ScvgSys }} }, + { "label": "scvg.released", "data": {{ .ScvgReleased }} }, + { "label": "scvg.consumed", "data": {{ .ScvgConsumed }} } +] +`)) + var ( gcre = regexp.MustCompile(`gc\d+\(\d+\): \d+\+\d+\+\d+\+\d+ us, \d+ -> \d+ MB, \d+ \(\d+-\d+\) objects, \d+\/\d+\/\d+ sweeps, \d+\(\d+\) handoff, \d+\(\d+\) steal, \d+\/\d+\/\d+ yields`) scvgre = regexp.MustCompile(`scvg\d+: inuse: \d+, idle: \d+, sys: \d+, released: \d+, consumed: \d+ \(MB\)`) @@ -200,7 +252,7 @@ func main() { gc := make(chan *gctrace, 1) scvg := make(chan *scvgtrace, 1) - go startSubprocess(pw) + go startSubprocess(os.Args[1:], pw) go startParser(pr, gc, scvg) l, err := net.Listen("tcp4", "127.0.0.1:0") @@ -208,6 +260,7 @@ func main() { log.Fatal(err) } http.HandleFunc("/", index) + http.HandleFunc("/ajax", ajax) go http.Serve(l, nil) url := fmt.Sprintf("http://%s/", l.Addr()) From ac3dbb2847e071006b2efbab15ed10c9d66a9770 Mon Sep 17 00:00:00 2001 From: Simon Richardson Date: Fri, 11 Jul 2014 12:03:40 +0100 Subject: [PATCH 3/3] Fixing the merge breakages --- main.go | 217 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 110 insertions(+), 107 deletions(-) diff --git a/main.go b/main.go index cf6395a..8b8d547 100644 --- a/main.go +++ b/main.go @@ -127,113 +127,116 @@ var visIndexTmpl = template.Must(template.New("vis-index").Parse(`