diff options
author | 2021-07-10 07:34:53 +0200 | |
---|---|---|
committer | 2021-07-10 07:34:53 +0200 | |
commit | d17e50afc7e231b0389596cbe69b82f85e4221f3 (patch) | |
tree | 2ea387dabb3ba899ee0c87bffe59101b0ea829f5 /plugin | |
parent | 6efda5293e012238d34157c6eca29c0e5cbf7119 (diff) | |
download | coredns-d17e50afc7e231b0389596cbe69b82f85e4221f3.tar.gz coredns-d17e50afc7e231b0389596cbe69b82f85e4221f3.tar.zst coredns-d17e50afc7e231b0389596cbe69b82f85e4221f3.zip |
plugin/trace: fix rcode tag in case of no response (#4742)
Signed-off-by: Ondrej Benkovsky <ondrej.benkovsky@wandera.com>
Diffstat (limited to 'plugin')
-rw-r--r-- | plugin/trace/trace.go | 9 | ||||
-rw-r--r-- | plugin/trace/trace_test.go | 24 |
2 files changed, 25 insertions, 8 deletions
diff --git a/plugin/trace/trace.go b/plugin/trace/trace.go index 4d3deb207..1b74dcbc3 100644 --- a/plugin/trace/trace.go +++ b/plugin/trace/trace.go @@ -149,7 +149,14 @@ func (t *trace) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) span.SetTag(t.tagSet.Type, req.Type()) span.SetTag(t.tagSet.Proto, req.Proto()) span.SetTag(t.tagSet.Remote, req.IP()) - span.SetTag(t.tagSet.Rcode, rcode.ToString(rw.Rcode)) + 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 + } + span.SetTag(t.tagSet.Rcode, rcode.ToString(rc)) if err != nil { otext.Error.Set(span, true) span.LogFields(otlog.Event("error"), otlog.Error(err)) diff --git a/plugin/trace/trace_test.go b/plugin/trace/trace_test.go index 233f63207..dae546f8d 100644 --- a/plugin/trace/trace_test.go +++ b/plugin/trace/trace_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/coredns/caddy" + "github.com/coredns/coredns/plugin" "github.com/coredns/coredns/plugin/pkg/dnstest" "github.com/coredns/coredns/plugin/pkg/rcode" "github.com/coredns/coredns/plugin/test" @@ -43,23 +44,33 @@ func TestTrace(t *testing.T) { cases := []struct { name string rcode int + status int question *dns.Msg - server string err error }{ { name: "NXDOMAIN", rcode: dns.RcodeNameError, + status: dns.RcodeSuccess, question: new(dns.Msg).SetQuestion("example.org.", dns.TypeA), }, { name: "NOERROR", rcode: dns.RcodeSuccess, + status: dns.RcodeSuccess, question: new(dns.Msg).SetQuestion("example.net.", dns.TypeCNAME), }, { name: "SERVFAIL", rcode: dns.RcodeServerFailure, + status: dns.RcodeSuccess, + question: new(dns.Msg).SetQuestion("example.net.", dns.TypeA), + err: errors.New("test error"), + }, + { + name: "No response written", + rcode: dns.RcodeServerFailure, + status: dns.RcodeServerFailure, question: new(dns.Msg).SetQuestion("example.net.", dns.TypeA), err: errors.New("test error"), }, @@ -71,13 +82,12 @@ func TestTrace(t *testing.T) { m := mocktracer.New() tr := &trace{ Next: test.HandlerFunc(func(_ context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) { - m := new(dns.Msg) - m.SetRcode(r, tc.rcode) - w.WriteMsg(m) - if tc.err != nil { - return tc.rcode, tc.err + if plugin.ClientWrite(tc.status) { + m := new(dns.Msg) + m.SetRcode(r, tc.rcode) + w.WriteMsg(m) } - return tc.rcode, nil + return tc.status, tc.err }), every: 1, tracer: m, |