mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 02:03:20 -04:00 
			
		
		
		
	* core: remove HostAddresses() config.HostAddresses() is a weird function that gathers some data from the server and returns a string. It is *only* used the trace plugin, to figure out what server starts the trace. Looks to be better to fit in the with metrics.WithServer label on the trace itself to show which server handled the trace. Remove HostAddresses() and cleanup trace a small bit.:w * lint
		
			
				
	
	
		
			104 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package trace implements OpenTracing-based tracing
 | |
| package trace
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 	"sync"
 | |
| 	"sync/atomic"
 | |
| 
 | |
| 	"github.com/coredns/coredns/plugin"
 | |
| 	"github.com/coredns/coredns/plugin/metrics"
 | |
| 	// Plugin the trace package.
 | |
| 	_ "github.com/coredns/coredns/plugin/pkg/trace"
 | |
| 
 | |
| 	ddtrace "github.com/DataDog/dd-trace-go/opentracing"
 | |
| 	"github.com/miekg/dns"
 | |
| 	ot "github.com/opentracing/opentracing-go"
 | |
| 	zipkin "github.com/openzipkin/zipkin-go-opentracing"
 | |
| )
 | |
| 
 | |
| type trace struct {
 | |
| 	Next            plugin.Handler
 | |
| 	Endpoint        string
 | |
| 	EndpointType    string
 | |
| 	tracer          ot.Tracer
 | |
| 	serviceEndpoint string
 | |
| 	serviceName     string
 | |
| 	clientServer    bool
 | |
| 	every           uint64
 | |
| 	count           uint64
 | |
| 	Once            sync.Once
 | |
| }
 | |
| 
 | |
| func (t *trace) Tracer() ot.Tracer {
 | |
| 	return t.tracer
 | |
| }
 | |
| 
 | |
| // OnStartup sets up the tracer
 | |
| func (t *trace) OnStartup() error {
 | |
| 	var err error
 | |
| 	t.Once.Do(func() {
 | |
| 		switch t.EndpointType {
 | |
| 		case "zipkin":
 | |
| 			err = t.setupZipkin()
 | |
| 		case "datadog":
 | |
| 			err = t.setupDatadog()
 | |
| 		default:
 | |
| 			err = fmt.Errorf("unknown endpoint type: %s", t.EndpointType)
 | |
| 		}
 | |
| 	})
 | |
| 	return err
 | |
| }
 | |
| 
 | |
| func (t *trace) setupZipkin() error {
 | |
| 
 | |
| 	collector, err := zipkin.NewHTTPCollector(t.Endpoint)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	recorder := zipkin.NewRecorder(collector, false, t.serviceEndpoint, t.serviceName)
 | |
| 	t.tracer, err = zipkin.NewTracer(recorder, zipkin.ClientServerSameSpan(t.clientServer))
 | |
| 
 | |
| 	return err
 | |
| }
 | |
| 
 | |
| func (t *trace) setupDatadog() error {
 | |
| 	config := ddtrace.NewConfiguration()
 | |
| 	config.ServiceName = t.serviceName
 | |
| 
 | |
| 	host := strings.Split(t.Endpoint, ":")
 | |
| 	config.AgentHostname = host[0]
 | |
| 
 | |
| 	if len(host) == 2 {
 | |
| 		config.AgentPort = host[1]
 | |
| 	}
 | |
| 
 | |
| 	tracer, _, err := ddtrace.NewTracer(config)
 | |
| 	t.tracer = tracer
 | |
| 	return err
 | |
| }
 | |
| 
 | |
| // Name implements the Handler interface.
 | |
| func (t *trace) Name() string { return "trace" }
 | |
| 
 | |
| // ServeDNS implements the plugin.Handle interface.
 | |
| func (t *trace) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) {
 | |
| 	trace := false
 | |
| 	if t.every > 0 {
 | |
| 		queryNr := atomic.AddUint64(&t.count, 1)
 | |
| 
 | |
| 		if queryNr%t.every == 0 {
 | |
| 			trace = true
 | |
| 		}
 | |
| 	}
 | |
| 	if span := ot.SpanFromContext(ctx); span == nil && trace {
 | |
| 		span := t.Tracer().StartSpan("servedns:" + metrics.WithServer(ctx))
 | |
| 		defer span.Finish()
 | |
| 		ctx = ot.ContextWithSpan(ctx, span)
 | |
| 	}
 | |
| 	return plugin.NextOrFailure(t.Name(), t.Next, ctx, w, r)
 | |
| }
 |