From d8714e64e400ef873c2adc4d929a07d7890727b9 Mon Sep 17 00:00:00 2001 From: Miek Gieben Date: Thu, 14 Sep 2017 09:36:06 +0100 Subject: Remove the word middleware (#1067) * Rename middleware to plugin first pass; mostly used 'sed', few spots where I manually changed text. This still builds a coredns binary. * fmt error * Rename AddMiddleware to AddPlugin * Readd AddMiddleware to remain backwards compat --- plugin/metrics/metrics.go | 101 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 plugin/metrics/metrics.go (limited to 'plugin/metrics/metrics.go') diff --git a/plugin/metrics/metrics.go b/plugin/metrics/metrics.go new file mode 100644 index 000000000..0dabcdf96 --- /dev/null +++ b/plugin/metrics/metrics.go @@ -0,0 +1,101 @@ +// Package metrics implement a handler and plugin that provides Prometheus metrics. +package metrics + +import ( + "log" + "net" + "net/http" + "sync" + + "github.com/coredns/coredns/plugin" + "github.com/coredns/coredns/plugin/metrics/vars" + + "github.com/prometheus/client_golang/prometheus" +) + +func init() { + prometheus.MustRegister(vars.RequestCount) + prometheus.MustRegister(vars.RequestDuration) + prometheus.MustRegister(vars.RequestSize) + prometheus.MustRegister(vars.RequestDo) + prometheus.MustRegister(vars.RequestType) + + prometheus.MustRegister(vars.ResponseSize) + prometheus.MustRegister(vars.ResponseRcode) +} + +// Metrics holds the prometheus configuration. The metrics' path is fixed to be /metrics +type Metrics struct { + Next plugin.Handler + Addr string + ln net.Listener + mux *http.ServeMux + + zoneNames []string + zoneMap map[string]bool + zoneMu sync.RWMutex +} + +// AddZone adds zone z to m. +func (m *Metrics) AddZone(z string) { + m.zoneMu.Lock() + m.zoneMap[z] = true + m.zoneNames = keys(m.zoneMap) + m.zoneMu.Unlock() +} + +// RemoveZone remove zone z from m. +func (m *Metrics) RemoveZone(z string) { + m.zoneMu.Lock() + delete(m.zoneMap, z) + m.zoneNames = keys(m.zoneMap) + m.zoneMu.Unlock() +} + +// ZoneNames returns the zones of m. +func (m *Metrics) ZoneNames() []string { + m.zoneMu.RLock() + s := m.zoneNames + m.zoneMu.RUnlock() + return s +} + +// OnStartup sets up the metrics on startup. +func (m *Metrics) OnStartup() error { + ln, err := net.Listen("tcp", m.Addr) + if err != nil { + log.Printf("[ERROR] Failed to start metrics handler: %s", err) + return err + } + + m.ln = ln + ListenAddr = m.ln.Addr().String() + + m.mux = http.NewServeMux() + m.mux.Handle("/metrics", prometheus.Handler()) + + go func() { + http.Serve(m.ln, m.mux) + }() + return nil +} + +// OnShutdown tears down the metrics on shutdown and restart. +func (m *Metrics) OnShutdown() error { + if m.ln != nil { + return m.ln.Close() + } + return nil +} + +func keys(m map[string]bool) []string { + sx := []string{} + for k := range m { + sx = append(sx, k) + } + return sx +} + +// ListenAddr is assigned the address of the prometheus listener. Its use is mainly in tests where +// we listen on "localhost:0" and need to retrieve the actual address. +var ListenAddr string -- cgit v1.2.3