metrics: adding support for servers.bind. statistic (#7)

this commit adds support for the servers.bind. statistic
which is exposed by dnsmasq and provides information about the
number of successful and failed queries on each configured
upstream server
This commit is contained in:
Felix Ehrenpfort 2020-02-25 08:18:18 +01:00 committed by GitHub
parent 161ea97d3d
commit d5b74a1f9b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -22,6 +22,7 @@ import (
"net/http" "net/http"
"os" "os"
"strconv" "strconv"
"strings"
"golang.org/x/sync/errgroup" "golang.org/x/sync/errgroup"
@ -83,6 +84,23 @@ var (
}), }),
} }
serversMetrics = map[string]*prometheus.GaugeVec{
"queries": prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "dnsmasq_servers_queries",
Help: "DNS queries on upstream server",
},
[]string{"server"},
),
"queries_failed": prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "dnsmasq_servers_queries_failed",
Help: "DNS queries failed on upstream server",
},
[]string{"server"},
),
}
leases = prometheus.NewGauge(prometheus.GaugeOpts{ leases = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "dnsmasq_leases", Name: "dnsmasq_leases",
Help: "Number of DHCP leases handed out", Help: "Number of DHCP leases handed out",
@ -93,6 +111,9 @@ func init() {
for _, g := range floatMetrics { for _, g := range floatMetrics {
prometheus.MustRegister(g) prometheus.MustRegister(g)
} }
for _, g := range serversMetrics {
prometheus.MustRegister(g)
}
prometheus.MustRegister(leases) prometheus.MustRegister(leases)
} }
@ -149,7 +170,22 @@ func (s *server) metrics(w http.ResponseWriter, r *http.Request) {
} }
switch txt.Hdr.Name { switch txt.Hdr.Name {
case "servers.bind.": case "servers.bind.":
// TODO: parse <server> <successes> <errors>, also with multiple upstreams for _, str := range txt.Txt {
arr := strings.Fields(str)
if got, want := len(arr), 3; got != want {
return fmt.Errorf("stats DNS record servers.bind.: unexpeced number of argument in record: got %d, want %d", got, want)
}
queries, err := strconv.ParseFloat(arr[1], 64)
if err != nil {
return err
}
failedQueries, err := strconv.ParseFloat(arr[2], 64)
if err != nil {
return err
}
serversMetrics["queries"].WithLabelValues(arr[0]).Set(queries)
serversMetrics["queries_failed"].WithLabelValues(arr[0]).Set(failedQueries)
}
default: default:
g, ok := floatMetrics[txt.Hdr.Name] g, ok := floatMetrics[txt.Hdr.Name]
if !ok { if !ok {