// Status serves the status page. func Status( ms storage.MetricStore, assetFunc func(string) ([]byte, error), flags map[string]string, ) func(http.ResponseWriter, *http.Request) { birth := time.Now() return func(w http.ResponseWriter, _ *http.Request) { t := template.New("status") t.Funcs(template.FuncMap{ "value": func(f float64) string { return strconv.FormatFloat(f, 'f', -1, 64) }, }) tpl, err := assetFunc("template.html") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } _, err = t.Parse(string(tpl)) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } buildInfo := map[string]string{ "version": version.Version, "revision": version.Revision, "branch": version.Branch, "buildUser": version.BuildUser, "buildDate": version.BuildDate, "goVersion": version.GoVersion, } d := &data{ MetricGroups: ms.GetMetricFamiliesMap(), Flags: flags, BuildInfo: buildInfo, Birth: birth, } err = t.Execute(w, d) if err != nil { // Hack to get a visible error message right at the top. fmt.Fprintf(w, `<div id="template-error" class="alert alert-danger">Error executing template: %s</div>`, html.EscapeString(err.Error())) fmt.Fprintln(w, `<script>$("#template-error").prependTo("body")</script>`) } } }