aboutsummaryrefslogtreecommitdiff
path: root/core/setup/prometheus.go
diff options
context:
space:
mode:
Diffstat (limited to 'core/setup/prometheus.go')
-rw-r--r--core/setup/prometheus.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/core/setup/prometheus.go b/core/setup/prometheus.go
new file mode 100644
index 000000000..3bcb907ce
--- /dev/null
+++ b/core/setup/prometheus.go
@@ -0,0 +1,70 @@
+package setup
+
+import (
+ "sync"
+
+ "github.com/miekg/coredns/middleware"
+ prom "github.com/miekg/coredns/middleware/prometheus"
+)
+
+const (
+ path = "/metrics"
+ addr = "localhost:9153"
+)
+
+var once sync.Once
+
+func Prometheus(c *Controller) (middleware.Middleware, error) {
+ metrics, err := parsePrometheus(c)
+ if err != nil {
+ return nil, err
+ }
+ if metrics.Addr == "" {
+ metrics.Addr = addr
+ }
+ once.Do(func() {
+ c.Startup = append(c.Startup, metrics.Start)
+ })
+
+ return func(next middleware.Handler) middleware.Handler {
+ metrics.Next = next
+ return metrics
+ }, nil
+}
+
+func parsePrometheus(c *Controller) (*prom.Metrics, error) {
+ var (
+ metrics *prom.Metrics
+ err error
+ )
+
+ for c.Next() {
+ if metrics != nil {
+ return nil, c.Err("prometheus: can only have one metrics module per server")
+ }
+ metrics = &prom.Metrics{ZoneNames: c.ServerBlockHosts}
+ args := c.RemainingArgs()
+
+ switch len(args) {
+ case 0:
+ case 1:
+ metrics.Addr = args[0]
+ default:
+ return nil, c.ArgErr()
+ }
+ for c.NextBlock() {
+ switch c.Val() {
+ case "address":
+ args = c.RemainingArgs()
+ if len(args) != 1 {
+ return nil, c.ArgErr()
+ }
+ metrics.Addr = args[0]
+ default:
+ return nil, c.Errf("prometheus: unknown item: %s", c.Val())
+ }
+
+ }
+ }
+ return metrics, err
+}