diff options
author | 2016-10-04 11:05:04 +0100 | |
---|---|---|
committer | 2016-10-04 11:05:04 +0100 | |
commit | db6c9a3f01c9bbef12fd2a1b43e5a84608044ee0 (patch) | |
tree | fab926dc9dab6152a7845313be034c5286d920bb /middleware/metrics/setup.go | |
parent | d914832904760e8638bb79189822e2cbe84edee5 (diff) | |
download | coredns-db6c9a3f01c9bbef12fd2a1b43e5a84608044ee0.tar.gz coredns-db6c9a3f01c9bbef12fd2a1b43e5a84608044ee0.tar.zst coredns-db6c9a3f01c9bbef12fd2a1b43e5a84608044ee0.zip |
middleware/metrics: fix crash on startup (#318)
Make the methods that handle Metrics all use pointer receivers to fix
sync.Once not being initialized.
Finish the setup_test to test for failures. And make the check for the
address more strict and return an error when it does not have a port
number.
Add a toplevel test that starts a CoreDNS server with metrics enabled
so we catch these errors in the future.
Diffstat (limited to 'middleware/metrics/setup.go')
-rw-r--r-- | middleware/metrics/setup.go | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/middleware/metrics/setup.go b/middleware/metrics/setup.go index fd3f4a80c..8c8dd1a75 100644 --- a/middleware/metrics/setup.go +++ b/middleware/metrics/setup.go @@ -1,6 +1,7 @@ package metrics import ( + "net" "sync" "github.com/miekg/coredns/core/dnsserver" @@ -35,15 +36,15 @@ func setup(c *caddy.Controller) error { return nil } -func prometheusParse(c *caddy.Controller) (Metrics, error) { +func prometheusParse(c *caddy.Controller) (*Metrics, error) { var ( - met Metrics + met = &Metrics{Addr: addr} err error ) for c.Next() { if len(met.ZoneNames) > 0 { - return Metrics{}, c.Err("metrics: can only have one metrics module per server") + return met, c.Err("metrics: can only have one metrics module per server") } met.ZoneNames = make([]string, len(c.ServerBlockKeys)) copy(met.ZoneNames, c.ServerBlockKeys) @@ -56,26 +57,32 @@ func prometheusParse(c *caddy.Controller) (Metrics, error) { case 0: case 1: met.Addr = args[0] + _, _, e := net.SplitHostPort(met.Addr) + if e != nil { + return met, e + } default: - return Metrics{}, c.ArgErr() + return met, c.ArgErr() } for c.NextBlock() { switch c.Val() { case "address": args = c.RemainingArgs() if len(args) != 1 { - return Metrics{}, c.ArgErr() + return met, c.ArgErr() } met.Addr = args[0] + // expecting something that resembles a host-port + _, _, e := net.SplitHostPort(met.Addr) + if e != nil { + return met, e + } default: - return Metrics{}, c.Errf("metrics: unknown item: %s", c.Val()) + return met, c.Errf("metrics: unknown item: %s", c.Val()) } } } - if met.Addr == "" { - met.Addr = addr - } return met, err } |