diff options
Diffstat (limited to 'middleware/metrics/setup.go')
-rw-r--r-- | middleware/metrics/setup.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/middleware/metrics/setup.go b/middleware/metrics/setup.go new file mode 100644 index 000000000..f31cbd4d5 --- /dev/null +++ b/middleware/metrics/setup.go @@ -0,0 +1,84 @@ +package metrics + +import ( + "sync" + + "github.com/miekg/coredns/core/dnsserver" + "github.com/miekg/coredns/middleware" + + "github.com/mholt/caddy" +) + +func init() { + caddy.RegisterPlugin("prometheus", caddy.Plugin{ + ServerType: "dns", + Action: setup, + }) +} + +func setup(c *caddy.Controller) error { + m, err := prometheusParse(c) + if err != nil { + return err + } + + dnsserver.GetConfig(c).AddMiddleware(func(next dnsserver.Handler) dnsserver.Handler { + m.Next = next + return m + }) + + metricsOnce.Do(func() { + c.OnStartup(m.Startup) + c.OnShutdown(m.Shutdown) + }) + + return nil +} + +func prometheusParse(c *caddy.Controller) (Metrics, error) { + var ( + met Metrics + err error + ) + + for c.Next() { + if len(met.ZoneNames) > 0 { + return Metrics{}, c.Err("metrics: can only have one metrics module per server") + } + met.ZoneNames = make([]string, len(c.ServerBlockKeys)) + copy(met.ZoneNames, c.ServerBlockKeys) + 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{}, c.ArgErr() + } + for c.NextBlock() { + switch c.Val() { + case "address": + args = c.RemainingArgs() + if len(args) != 1 { + return Metrics{}, c.ArgErr() + } + met.Addr = args[0] + default: + return Metrics{}, c.Errf("metrics: unknown item: %s", c.Val()) + } + + } + } + if met.Addr == "" { + met.Addr = addr + } + return met, err +} + +var metricsOnce sync.Once + +const addr = "localhost:9153" |