vitess.io/vitess@v0.16.2/go/trace/plugin_datadog.go (about)

     1  package trace
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  
     7  	"github.com/opentracing/opentracing-go"
     8  	"github.com/spf13/pflag"
     9  	"gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentracer"
    10  	ddtracer "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
    11  )
    12  
    13  var (
    14  	dataDogHost string
    15  	dataDogPort string
    16  )
    17  
    18  func init() {
    19  	// If compiled with plugin_datadaog, ensure that trace.RegisterFlags
    20  	// includes datadaog tracing flags.
    21  	pluginFlags = append(pluginFlags, func(fs *pflag.FlagSet) {
    22  		fs.StringVar(&dataDogHost, "datadog-agent-host", "", "host to send spans to. if empty, no tracing will be done")
    23  		fs.StringVar(&dataDogPort, "datadog-agent-port", "", "port to send spans to. if empty, no tracing will be done")
    24  	})
    25  }
    26  
    27  func newDatadogTracer(serviceName string) (tracingService, io.Closer, error) {
    28  	if dataDogHost == "" || dataDogPort == "" {
    29  		return nil, nil, fmt.Errorf("need host and port to datadog agent to use datadog tracing")
    30  	}
    31  
    32  	opts := []ddtracer.StartOption{
    33  		ddtracer.WithAgentAddr(dataDogHost + ":" + dataDogPort),
    34  		ddtracer.WithServiceName(serviceName),
    35  		ddtracer.WithDebugMode(true),
    36  		ddtracer.WithSampler(ddtracer.NewRateSampler(samplingRate.Get())),
    37  	}
    38  
    39  	if enableLogging {
    40  		opts = append(opts, ddtracer.WithLogger(&traceLogger{}))
    41  	}
    42  
    43  	t := opentracer.New(opts...)
    44  
    45  	opentracing.SetGlobalTracer(t)
    46  
    47  	return openTracingService{Tracer: &datadogTracer{actual: t}}, &ddCloser{}, nil
    48  }
    49  
    50  var _ io.Closer = (*ddCloser)(nil)
    51  
    52  type ddCloser struct{}
    53  
    54  func (ddCloser) Close() error {
    55  	ddtracer.Stop()
    56  	return nil
    57  }
    58  
    59  func init() {
    60  	tracingBackendFactories["opentracing-datadog"] = newDatadogTracer
    61  }
    62  
    63  var _ tracer = (*datadogTracer)(nil)
    64  
    65  type datadogTracer struct {
    66  	actual opentracing.Tracer
    67  }
    68  
    69  func (dt *datadogTracer) GetOpenTracingTracer() opentracing.Tracer {
    70  	return dt.actual
    71  }