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 }