diff options
author | Martin Polden <mpolden@mpolden.no> | 2020-06-24 18:58:36 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2020-06-24 19:21:28 +0200 |
commit | 4bff6d85a46fd18c210f6a7d4a60136eda43bc24 (patch) | |
tree | 13a4ef5925a9dc72052d2f989b03e8739f62e3ce /http/http.go | |
parent | 052fd5a399819081fb826b152bba13eb6faea705 (diff) |
http: Add runtime metrics
Diffstat (limited to 'http/http.go')
-rw-r--r-- | http/http.go | 35 |
1 files changed, 9 insertions, 26 deletions
diff --git a/http/http.go b/http/http.go index e783319..5ff5fd3 100644 --- a/http/http.go +++ b/http/http.go @@ -1,11 +1,9 @@ package http import ( - "bytes" "context" "encoding/json" "fmt" - "io" "log" "net" "net/http" @@ -22,7 +20,7 @@ const ( jsonMediaType = "application/json" ) -// A Server defines paramaters for running an HTTP server. The HTTP server serves an API for inspecting cache contents +// A Server defines parameters for running an HTTP server. The HTTP server serves an API for inspecting cache contents // and request log. type Server struct { cache *cache.Cache @@ -99,10 +97,10 @@ func newHTTPBadRequest(err error) *httpError { func NewServer(cache *cache.Cache, logger *sql.Logger, sqlCache *sql.Cache, addr string) *Server { server := &http.Server{Addr: addr} s := &Server{ + server: server, cache: cache, logger: logger, sqlCache: sqlCache, - server: server, } s.server.Handler = s.handler() return s @@ -111,9 +109,11 @@ func NewServer(cache *cache.Cache, logger *sql.Logger, sqlCache *sql.Cache, addr func (s *Server) handler() http.Handler { r := &router{} r.route(http.MethodGet, "/cache/v1/", s.cacheHandler) - r.route(http.MethodGet, "/log/v1/", s.logHandler) - r.route(http.MethodGet, "/metric/v1/", s.metricHandler) r.route(http.MethodDelete, "/cache/v1/", s.cacheResetHandler) + if s.logger != nil { + r.route(http.MethodGet, "/log/v1/", s.logHandler) + r.route(http.MethodGet, "/metric/v1/", s.metricHandler) + } return r.handler() } @@ -148,21 +148,6 @@ func writeJSON(w http.ResponseWriter, data interface{}) { w.Write(b) } -func writeMetric(w io.StringWriter, name, help string, value int64) { - w.WriteString("# HELP ") - w.WriteString(name) - w.WriteString(" ") - w.WriteString(help) - w.WriteString("\n") - w.WriteString("# TYPE ") - w.WriteString(name) - w.WriteString(" gauge\n") - w.WriteString(name) - w.WriteString(" ") - w.WriteString(strconv.FormatInt(value, 10)) - w.WriteString("\n") -} - func (s *Server) cacheHandler(w http.ResponseWriter, r *http.Request) *httpError { count, err := countFrom(r) if err != nil { @@ -268,11 +253,9 @@ func (s *Server) prometheusMetricHandler(w http.ResponseWriter, r *http.Request) if err != nil { return newHTTPError(err) } - var buf bytes.Buffer - writeMetric(&buf, "zdns_requests_total", "The total number of DNS requests.", lstats.Total) - writeMetric(&buf, "zdns_requests_hijacked", "The number of hijacked DNS requests.", lstats.Hijacked) - w.Header().Set("Content-Type", "text/plain; version=0.0.4") - w.Write(buf.Bytes()) + totalRequestsGauge.Set(float64(lstats.Total)) + hijackedRequestsGauge.Set(float64(lstats.Hijacked)) + prometheusHandler.ServeHTTP(w, r) return nil } |