package common import ( "fmt" "io" "time" "github.com/opentracing/opentracing-go" "github.com/uber/jaeger-client-go" jaegercfg "github.com/uber/jaeger-client-go/config" "github.com/uber/jaeger-lib/metrics" ) func NewJaegerTracer(serviceName, addr string) (opentracing.Tracer, io.Closer, error) { // Sample configuration for testing. Use constant sampling to sample every trace // and enable LogSpan to log every span via configured Logger. cfg := jaegercfg.Configuration{ Sampler: &jaegercfg.SamplerConfig{ Type: jaeger.SamplerTypeConst, Param: 1, }, Reporter: &jaegercfg.ReporterConfig{ LogSpans: true, BufferFlushInterval: 1 * time.Second, }, } cfg.ServiceName = serviceName // Example logger and metrics factory. Use github.com/uber/jaeger-client-go/log // and github.com/uber/jaeger-lib/metrics respectively to bind to real logging and metrics // frameworks. jLogger := &jaegerLogger{} jMetricsFactory := metrics.NullFactory metricsFactory := metrics.NullFactory metrics := jaeger.NewMetrics(metricsFactory, nil) sender, err := jaeger.NewUDPTransport(addr, 0) if err != nil { fmt.Println("could not initialize jaeger sender:", err.Error()) return nil, nil, err } repoter := jaeger.NewRemoteReporter(sender, jaeger.ReporterOptions.Metrics(metrics)) return cfg.NewTracer( jaegercfg.Logger(jLogger), jaegercfg.Metrics(jMetricsFactory), jaegercfg.Reporter(repoter), ) } type jaegerLogger struct{} func (l *jaegerLogger) Error(msg string) { fmt.Println("ERROR:", msg) } // Infof logs a message at info priority func (l *jaegerLogger) Infof(msg string, args ...interface{}) { fmt.Println(msg, args) }