func runWebUI(addr string, perfData []perflog.PerfLogEntry) { m := staticbin.Classic(gopnikwebstatic.Asset) m.Map(log.New(os.Stderr, "", log.LstdFlags)) m.Use(rendergold.Renderer(rendergold.Options{Asset: Asset})) m.Get("/", func(r rendergold.Render) { totalStats := getStats(perfData, nil) var zoomsStats []zoomStats zrng := getZooms(perfData) for z := zrng.MinZoom; z <= zrng.MaxZoom; z++ { zoomsStats = append(zoomsStats, zoomStats{ Zoom: z, Stats: getStats(perfData, &z), }) } r.HTML( http.StatusOK, "index", map[string]interface{}{ "Page": "Results", "TotalStats": totalStats, "ZoomsStats": zoomsStats, }, ) }) m.Get("/heatmap", func(r rendergold.Render) { r.HTML( http.StatusOK, "heatmap", map[string]interface{}{ "Page": "Heat", }, ) }) m.Get("/heattiles_zooms", func(res http.ResponseWriter) { var zooms struct { Min uint64 Max uint64 } if len(perfData) > 0 { zooms.Min = perfData[0].Coord.Zoom zooms.Max = perfData[0].Coord.Zoom for i := 1; i < len(perfData); i++ { zoom := perfData[i].Coord.Zoom if zoom < zooms.Min { zooms.Min = zoom } if zoom > zooms.Max { zooms.Max = zoom } } } enc := json.NewEncoder(res) if err := enc.Encode(zooms); err != nil { http.Error(res, err.Error(), 500) return } }) m.Get("/heattiles/:zoom_orig/:zoom/:x/:y.png", func(params martini.Params, res http.ResponseWriter) { var coord gopnik.TileCoord coord.Size = 1 _, err := fmt.Sscan(params["zoom"], &coord.Zoom) if err != nil { http.Error(res, err.Error(), 400) return } _, err = fmt.Sscan(params["x"], &coord.X) if err != nil { http.Error(res, err.Error(), 400) return } _, err = fmt.Sscan(params["y"], &coord.Y) if err != nil { http.Error(res, err.Error(), 400) return } var zoomOrig uint64 _, err = fmt.Sscan(params["zoom_orig"], &zoomOrig) if err != nil { http.Error(res, err.Error(), 400) return } tile, err := genPerfTile(perfData, coord, zoomOrig) if err != nil { http.Error(res, err.Error(), 500) return } res.Header().Set("Content-Type", "image/png") res.Write(tile) }) log.Printf("Starting WebUI on %v", addr) log.Fatal(http.ListenAndServe(addr, m)) }
func runWebUI(addr string, p *coordinator, cache gopnik.CachePluginInterface) { m := staticbin.Classic(gopnikwebstatic.Asset) var logger webUILogger m.Map(stdlog.New(&logger, "[martini] ", stdlog.LstdFlags)) m.Use(rendergold.Renderer(rendergold.Options{Asset: Asset})) m.Get("/", func(r rendergold.Render) { done, total := p.DoneTasks() progress := float64(done) / float64(total) * 100.0 r.HTML( http.StatusOK, "status", map[string]interface{}{ "Page": "Status", "Total": total, "Done": done, "Progress": fmt.Sprintf("%.02f", progress), }, ) }) m.Get("/nodes", func(r rendergold.Render) { type node struct { Addr string Status bool } addrs := p.Nodes() nodes := make([]node, len(addrs)) for i, addr := range addrs { nodes[i].Addr = addr nodes[i].Status = p.NodeStatus(addr) } r.HTML( http.StatusOK, "nodes", map[string]interface{}{ "Page": "Nodes", "Nodes": nodes, }, ) }) m.Get("/charts/:addr", func(params martini.Params, r rendergold.Render) { addr := params["addr"] mon := p.NodeMonitor(addr) if mon == nil { r.Redirect("/nodes") } r.HTML( http.StatusOK, "charts", map[string]interface{}{ "Page": "Charts", "Addr": addr, "Metrics": mon.Metrics(), }, ) }) m.Get("/chart/:addr", func(params martini.Params, res http.ResponseWriter, req *http.Request) { addr := params["addr"] mon := p.NodeMonitor(addr) if mon == nil { res.WriteHeader(400) return } metricArgs := req.URL.Query()["metric"] if len(metricArgs) != 1 { res.WriteHeader(400) return } metric := metricArgs[0] points := mon.Points(metric) enc := json.NewEncoder(res) err := enc.Encode(points) if err != nil { log.Error("%v", err) } }) m.Get("/map", func(r rendergold.Render) { r.HTML( http.StatusOK, "map", map[string]interface{}{ "Page": "Map", }, ) }) m.Get("/tiles/:z/:x/:y.png", func(params martini.Params) []byte { z, _ := strconv.ParseUint(params["z"], 10, 64) x, _ := strconv.ParseUint(params["x"], 10, 64) y, _ := strconv.ParseUint(params["y"], 10, 64) coord := gopnik.TileCoord{x, y, z, 1, nil} res, err := cache.Get(coord) if err != nil { log.Error("%v", err) return nil } return res }) log.Info("Starting WebUI on %v", addr) log.Fatal(http.ListenAndServe(addr, m)) }