diff --git a/plugin/metrics/handler.go b/plugin/metrics/handler.go index 88fd2bcdb..077a301ff 100644 --- a/plugin/metrics/handler.go +++ b/plugin/metrics/handler.go @@ -33,7 +33,7 @@ func (m *Metrics) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg // see https://github.com/coredns/coredns/blob/master/core/dnsserver/server.go#L318 rc = status } - plugin := m.authoritativePlugin(rw.Caller1, rw.Caller2, rw.Caller3) + plugin := m.authoritativePlugin(rw.Caller) vars.Report(WithServer(ctx), state, zone, rcode.ToString(rc), plugin, rw.Len, rw.Start) return status, err @@ -43,22 +43,16 @@ func (m *Metrics) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg func (m *Metrics) Name() string { return "prometheus" } // authoritativePlugin returns which of made the write, if none is found the empty string is returned. -func (m *Metrics) authoritativePlugin(a, b, c string) string { +func (m *Metrics) authoritativePlugin(caller [3]string) string { // a b and c contain the full path of the caller, the plugin name 2nd last elements // .../coredns/plugin/whoami/whoami.go --> whoami // this is likely FS specific, so use filepath. - plug := filepath.Base(filepath.Dir(a)) - if _, ok := m.plugins[plug]; ok { - return plug - } - plug = filepath.Base(filepath.Dir(b)) - if _, ok := m.plugins[plug]; ok { - return plug - } - plug = filepath.Base(filepath.Dir(c)) - if _, ok := m.plugins[plug]; ok { - return plug - } + for _, c := range caller { + plug := filepath.Base(filepath.Dir(c)) + if _, ok := m.plugins[plug]; ok { + return plug + } + } return "" } diff --git a/plugin/metrics/recorder.go b/plugin/metrics/recorder.go index fdfa1c2c4..2a6dec85b 100644 --- a/plugin/metrics/recorder.go +++ b/plugin/metrics/recorder.go @@ -10,10 +10,8 @@ import ( // Recorder is a dnstest.Recorder specific to the metrics plugin. type Recorder struct { *dnstest.Recorder - // CallerN holds the string return value of the call to runtime.Caller(N) - Caller1 string - Caller2 string - Caller3 string + // CallerN holds the string return value of the call to runtime.Caller(N+1) + Caller [3]string } // NewRecorder makes and returns a new Recorder. @@ -22,9 +20,9 @@ func NewRecorder(w dns.ResponseWriter) *Recorder { return &Recorder{Recorder: dn // WriteMsg records the status code and calls the // underlying ResponseWriter's WriteMsg method. func (r *Recorder) WriteMsg(res *dns.Msg) error { - _, r.Caller1, _, _ = runtime.Caller(1) - _, r.Caller2, _, _ = runtime.Caller(2) - _, r.Caller3, _, _ = runtime.Caller(3) + _, r.Caller[0], _, _ = runtime.Caller(1) + _, r.Caller[1], _, _ = runtime.Caller(2) + _, r.Caller[2], _, _ = runtime.Caller(3) r.Len += res.Len() r.Msg = res return r.ResponseWriter.WriteMsg(res)