diff options
author | 2016-04-09 16:17:53 +0100 | |
---|---|---|
committer | 2016-04-09 16:17:53 +0100 | |
commit | ad221f4b2afa0cf89810cd9c3b4e953913d602fc (patch) | |
tree | 23bf7561336d29096eb24d821265235f84ac4222 /core/setup/metrics.go | |
parent | db3d689a8ac2bec199e5643394ffa779341acde0 (diff) | |
download | coredns-ad221f4b2afa0cf89810cd9c3b4e953913d602fc.tar.gz coredns-ad221f4b2afa0cf89810cd9c3b4e953913d602fc.tar.zst coredns-ad221f4b2afa0cf89810cd9c3b4e953913d602fc.zip |
correct EDNS responses (#96)
Tests updated as well and all the middleware. And Prometheus renamed to
metrics (directive is still prometheus).
Diffstat (limited to 'core/setup/metrics.go')
-rw-r--r-- | core/setup/metrics.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/core/setup/metrics.go b/core/setup/metrics.go new file mode 100644 index 000000000..84fdadb29 --- /dev/null +++ b/core/setup/metrics.go @@ -0,0 +1,74 @@ +package setup + +import ( + "sync" + + "github.com/miekg/coredns/middleware" + "github.com/miekg/coredns/middleware/metrics" +) + +const ( + path = "/metrics" + addr = "localhost:9135" // 9153 is occupied by bind_exporter +) + +var once sync.Once + +func Prometheus(c *Controller) (middleware.Middleware, error) { + met, err := parsePrometheus(c) + if err != nil { + return nil, err + } + + once.Do(func() { + c.Startup = append(c.Startup, met.Start) + }) + + return func(next middleware.Handler) middleware.Handler { + met.Next = next + return met + }, nil +} + +func parsePrometheus(c *Controller) (metrics.Metrics, error) { + var ( + met metrics.Metrics + err error + ) + + for c.Next() { + if len(met.ZoneNames) > 0 { + return metrics.Metrics{}, c.Err("metrics: can only have one metrics module per server") + } + met = metrics.Metrics{ZoneNames: c.ServerBlockHosts} + for i, _ := range met.ZoneNames { + met.ZoneNames[i] = middleware.Host(met.ZoneNames[i]).Normalize() + } + args := c.RemainingArgs() + + switch len(args) { + case 0: + case 1: + met.Addr = args[0] + default: + return metrics.Metrics{}, c.ArgErr() + } + for c.NextBlock() { + switch c.Val() { + case "address": + args = c.RemainingArgs() + if len(args) != 1 { + return metrics.Metrics{}, c.ArgErr() + } + met.Addr = args[0] + default: + return metrics.Metrics{}, c.Errf("metrics: unknown item: %s", c.Val()) + } + + } + } + if met.Addr == "" { + met.Addr = addr + } + return met, err +} |