// RegisterWeb registers handlers to serve files for the web interface. func RegisterWeb(r *route.Router, reloadCh chan<- struct{}) { ihf := prometheus.InstrumentHandlerFunc r.Get("/app/*filepath", ihf("app_files", func(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") serveAsset(w, req, filepath.Join("ui/app", fp)) }, )) r.Get("/lib/*filepath", ihf("lib_files", func(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") serveAsset(w, req, filepath.Join("ui/lib", fp)) }, )) r.Get("/metrics", prometheus.Handler().ServeHTTP) r.Get("/", ihf("index", func(w http.ResponseWriter, req *http.Request) { serveAsset(w, req, "ui/app/index.html") })) r.Post("/-/reload", func(w http.ResponseWriter, req *http.Request) { w.Write([]byte("Reloading configuration file...")) reloadCh <- struct{}{} }) r.Get("/debug/*subpath", http.DefaultServeMux.ServeHTTP) r.Post("/debug/*subpath", http.DefaultServeMux.ServeHTTP) }
// RegisterWeb registers handlers to serve files for the web interface. func RegisterWeb(r *route.Router) { r.Get("/app/*filepath", func(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") serveAsset(w, req, filepath.Join("ui/app", fp)) }) r.Get("/lib/*filepath", func(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") serveAsset(w, req, filepath.Join("ui/lib", fp)) }) r.Get("/", func(w http.ResponseWriter, req *http.Request) { serveAsset(w, req, "ui/app/index.html") }) }
func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { ctx := route.Context(r) name := strings.Trim(route.Param(ctx, "filepath"), "/") if name == "" { name = "index.html" } file, err := GetFile(StaticFiles, name) if err != nil { if err != io.EOF { log.Warn("Could not get file: ", err) } w.WriteHeader(http.StatusNotFound) return } contentType := http.DetectContentType(file) if strings.Contains(contentType, "text/plain") || strings.Contains(contentType, "application/octet-stream") { parts := strings.Split(name, ".") contentType = mimeMap[parts[len(parts)-1]] } w.Header().Set("Content-Type", contentType) w.Header().Set("Cache-Control", "public, max-age=259200") w.Write(file) }
func (api *API) labelValues(r *http.Request) (interface{}, *apiError) { name := route.Param(api.context(r), "name") if !model.LabelNameRE.MatchString(name) { return nil, &apiError{errorBadData, fmt.Errorf("invalid label name: %q", name)} } vals := api.Storage.LabelValuesForLabelName(model.LabelName(name)) sort.Sort(vals) return vals, nil }
func (api *API) delSilence(w http.ResponseWriter, r *http.Request) { sid := route.Param(api.context(r), "sid") if err := api.silences.Expire(sid); err != nil { respondError(w, apiError{ typ: errorBadData, err: err, }, nil) return } respond(w, nil) }
// RegisterWeb registers handlers to serve files for the web interface. func RegisterWeb(r *route.Router) { ihf := prometheus.InstrumentHandlerFunc r.Get("/app/*filepath", ihf("app_files", func(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") serveAsset(w, req, filepath.Join("ui/app", fp)) }, )) r.Get("/lib/*filepath", ihf("lib_files", func(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") serveAsset(w, req, filepath.Join("ui/lib", fp)) }, )) r.Get("/metrics", prometheus.Handler().ServeHTTP) r.Get("/", ihf("index", func(w http.ResponseWriter, req *http.Request) { serveAsset(w, req, "ui/app/index.html") })) }
func (h *Handler) consoles(w http.ResponseWriter, r *http.Request) { ctx := route.Context(r) name := route.Param(ctx, "filepath") file, err := http.Dir(h.options.ConsoleTemplatesPath).Open(name) if err != nil { http.Error(w, err.Error(), http.StatusNotFound) return } text, err := ioutil.ReadAll(file) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // Provide URL parameters as a map for easy use. Advanced users may have need for // parameters beyond the first, so provide RawParams. rawParams, err := url.ParseQuery(r.URL.RawQuery) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } params := map[string]string{} for k, v := range rawParams { params[k] = v[0] } data := struct { RawParams url.Values Params map[string]string Path string }{ RawParams: rawParams, Params: params, Path: strings.TrimLeft(name, "/"), } tmpl := template.NewTemplateExpander(string(text), "__console_"+name, data, model.Now(), h.queryEngine, h.options.ExternalURL.Path) filenames, err := filepath.Glob(h.options.ConsoleLibrariesPath + "/*.lib") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } result, err := tmpl.ExpandHTML(filenames) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } io.WriteString(w, result) }
func (api *API) getSilence(w http.ResponseWriter, r *http.Request) { sid := route.Param(api.context(r), "sid") sils, err := api.silences.Query(silence.QIDs(sid)) if err != nil || len(sils) == 0 { http.Error(w, fmt.Sprint("Error getting silence: ", err), http.StatusNotFound) return } sil, err := silenceFromProto(sils[0]) if err != nil { respondError(w, apiError{ typ: errorInternal, err: err, }, nil) return } respond(w, sil) }
func (api *API) getSilence(w http.ResponseWriter, r *http.Request) { sids := route.Param(api.context(r), "sid") sid, err := strconv.ParseUint(sids, 10, 64) if err != nil { respondError(w, apiError{ typ: errorBadData, err: err, }, nil) return } sil, err := api.silences.Get(sid) if err != nil { http.Error(w, fmt.Sprint("Error getting silence: ", err), http.StatusNotFound) return } respond(w, &sil) }
func (api *API) labelValues(r *http.Request) (interface{}, *apiError) { name := route.Param(api.context(r), "name") if !model.LabelNameRE.MatchString(name) { return nil, &apiError{errorBadData, fmt.Errorf("invalid label name: %q", name)} } q, err := api.Storage.Querier() if err != nil { return nil, &apiError{errorExec, err} } defer q.Close() vals, err := q.LabelValuesForLabelName(api.context(r), model.LabelName(name)) if err != nil { return nil, &apiError{errorExec, err} } sort.Sort(vals) return vals, nil }
func (api *API) delSilence(w http.ResponseWriter, r *http.Request) { sids := route.Param(api.context(r), "sid") sid, err := strconv.ParseUint(sids, 10, 64) if err != nil { respondError(w, apiError{ typ: errorBadData, err: err, }, nil) return } if err := api.silences.Del(sid); err != nil { respondError(w, apiError{ typ: errorInternal, err: err, }, nil) return } respond(w, nil) }
func serveStaticAsset(w http.ResponseWriter, req *http.Request) { fp := route.Param(route.Context(req), "filepath") fp = filepath.Join("web/ui/static", fp) info, err := ui.AssetInfo(fp) if err != nil { log.With("file", fp).Warn("Could not get file info: ", err) w.WriteHeader(http.StatusNotFound) return } file, err := ui.Asset(fp) if err != nil { if err != io.EOF { log.With("file", fp).Warn("Could not get file: ", err) } w.WriteHeader(http.StatusNotFound) return } http.ServeContent(w, req, info.Name(), info.ModTime(), bytes.NewReader(file)) }