mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	plugin/trace: fix rcode tag in case of no response (#4742)
Signed-off-by: Ondrej Benkovsky <ondrej.benkovsky@wandera.com>
This commit is contained in:
		| @@ -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)) | ||||
|   | ||||
| @@ -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, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user