aboutsummaryrefslogtreecommitdiffstats
path: root/http/http.go
diff options
context:
space:
mode:
Diffstat (limited to 'http/http.go')
-rw-r--r--http/http.go32
1 files changed, 32 insertions, 0 deletions
diff --git a/http/http.go b/http/http.go
index d547010..e783319 100644
--- a/http/http.go
+++ b/http/http.go
@@ -1,9 +1,11 @@
package http
import (
+ "bytes"
"context"
"encoding/json"
"fmt"
+ "io"
"log"
"net"
"net/http"
@@ -146,6 +148,21 @@ 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 {
@@ -246,6 +263,19 @@ func (s *Server) basicMetricHandler(w http.ResponseWriter, r *http.Request) *htt
return nil
}
+func (s *Server) prometheusMetricHandler(w http.ResponseWriter, r *http.Request) *httpError {
+ lstats, err := s.logger.Stats(time.Minute)
+ 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())
+ return nil
+}
+
func (s *Server) metricHandler(w http.ResponseWriter, r *http.Request) *httpError {
format := ""
if formatParams := r.URL.Query()["format"]; len(formatParams) > 0 {
@@ -254,6 +284,8 @@ func (s *Server) metricHandler(w http.ResponseWriter, r *http.Request) *httpErro
switch format {
case "", "basic":
return s.basicMetricHandler(w, r)
+ case "prometheus":
+ return s.prometheusMetricHandler(w, r)
}
writeJSONHeader(w)
return newHTTPBadRequest(fmt.Errorf("invalid metric format: %s", format))