aboutsummaryrefslogtreecommitdiffstats
path: root/http/http.go
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2020-06-24 18:58:36 +0200
committerMartin Polden <mpolden@mpolden.no>2020-06-24 19:21:28 +0200
commit4bff6d85a46fd18c210f6a7d4a60136eda43bc24 (patch)
tree13a4ef5925a9dc72052d2f989b03e8739f62e3ce /http/http.go
parent052fd5a399819081fb826b152bba13eb6faea705 (diff)
http: Add runtime metrics
Diffstat (limited to 'http/http.go')
-rw-r--r--http/http.go35
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
}