mirror of
https://github.com/coredns/coredns.git
synced 2025-12-31 14:01:22 -05:00
Remove expensive runtime.Caller calls from metrics Recorder.WriteMsg by tracking the responding plugin through the plugin chain instead. - Add PluginTracker interface and pluginWriter wrapper in plugin.go - Modify NextOrFailure to wrap ResponseWriter with plugin name - Update metrics Recorder to implement PluginTracker - Remove authoritativePlugin method using filepath inspection Signed-off-by: Ville Vesilehto <ville@vesilehto.fi>
48 lines
1.4 KiB
Go
48 lines
1.4 KiB
Go
package metrics
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/coredns/coredns/plugin"
|
|
"github.com/coredns/coredns/plugin/metrics/vars"
|
|
"github.com/coredns/coredns/plugin/pkg/rcode"
|
|
"github.com/coredns/coredns/request"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
// ServeDNS implements the Handler interface.
|
|
func (m *Metrics) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
|
|
state := request.Request{W: w, Req: r}
|
|
|
|
// Capture the original request size before any plugins modify it
|
|
originalSize := r.Len()
|
|
|
|
qname := state.QName()
|
|
zone := plugin.Zones(m.ZoneNames()).Matches(qname)
|
|
if zone == "" {
|
|
zone = "."
|
|
}
|
|
|
|
// Record response to get status code and size of the reply.
|
|
rw := NewRecorder(w)
|
|
status, err := plugin.NextOrFailure(m.Name(), m.Next, ctx, rw, r)
|
|
|
|
rc := rw.Rcode
|
|
if !plugin.ClientWrite(status) {
|
|
// when no response was written, fallback to status returned from next plugin as this status
|
|
// is actually used as rcode of DNS response
|
|
// see https://github.com/coredns/coredns/blob/master/core/dnsserver/server.go#L318
|
|
rc = status
|
|
}
|
|
// Pass the original request size to vars.Report
|
|
// rw.Plugin is set automatically by the plugin chain via the PluginTracker interface
|
|
vars.Report(WithServer(ctx), state, zone, WithView(ctx), rcode.ToString(rc), rw.Plugin,
|
|
rw.Len, rw.Start, vars.WithOriginalReqSize(originalSize))
|
|
|
|
return status, err
|
|
}
|
|
|
|
// Name implements the Handler interface.
|
|
func (m *Metrics) Name() string { return "prometheus" }
|