|
|
@@ -7,8 +7,6 @@ package main
|
|
|
import (
|
|
|
"flag"
|
|
|
"fmt"
|
|
|
- "html"
|
|
|
- "io"
|
|
|
"log"
|
|
|
"net/http"
|
|
|
"sort"
|
|
|
@@ -70,8 +68,13 @@ func main() {
|
|
|
}
|
|
|
|
|
|
mux := http.NewServeMux()
|
|
|
- tsweb.Debugger(mux)
|
|
|
- mux.HandleFunc("/", http.HandlerFunc(serveFunc(p)))
|
|
|
+ d := tsweb.Debugger(mux)
|
|
|
+ d.Handle("probe-run", "Run a probe", tsweb.StdHandler(tsweb.ReturnHandlerFunc(p.RunHandler), tsweb.HandlerOptions{Logf: log.Printf}))
|
|
|
+ mux.Handle("/", tsweb.StdHandler(p.StatusHandler(
|
|
|
+ prober.WithTitle("DERP Prober"),
|
|
|
+ prober.WithPageLink("Prober metrics", "/debug/varz"),
|
|
|
+ prober.WithProbeLink("Run Probe", "/debug/probe-run?name={{.Name}}"),
|
|
|
+ ), tsweb.HandlerOptions{Logf: log.Printf}))
|
|
|
log.Printf("Listening on %s", *listen)
|
|
|
log.Fatal(http.ListenAndServe(*listen, mux))
|
|
|
}
|
|
|
@@ -105,26 +108,3 @@ func getOverallStatus(p *prober.Prober) (o overallStatus) {
|
|
|
sort.Strings(o.good)
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
-func serveFunc(p *prober.Prober) func(w http.ResponseWriter, r *http.Request) {
|
|
|
- return func(w http.ResponseWriter, r *http.Request) {
|
|
|
- st := getOverallStatus(p)
|
|
|
- summary := "All good"
|
|
|
- if (float64(len(st.bad)) / float64(len(st.bad)+len(st.good))) > 0.25 {
|
|
|
- // Returning a 500 allows monitoring this server externally and configuring
|
|
|
- // an alert on HTTP response code.
|
|
|
- w.WriteHeader(500)
|
|
|
- summary = fmt.Sprintf("%d problems", len(st.bad))
|
|
|
- }
|
|
|
-
|
|
|
- io.WriteString(w, "<html><head><style>.bad { font-weight: bold; color: #700; }</style></head>\n")
|
|
|
- fmt.Fprintf(w, "<body><h1>derp probe</h1>\n%s:<ul>", summary)
|
|
|
- for _, s := range st.bad {
|
|
|
- fmt.Fprintf(w, "<li class=bad>%s</li>\n", html.EscapeString(s))
|
|
|
- }
|
|
|
- for _, s := range st.good {
|
|
|
- fmt.Fprintf(w, "<li>%s</li>\n", html.EscapeString(s))
|
|
|
- }
|
|
|
- io.WriteString(w, "</ul></body></html>\n")
|
|
|
- }
|
|
|
-}
|