github.com/mattermosttest/mattermost-server/v5@v5.0.0-20200917143240-9dfa12e121f9/services/tracing/tracing.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package tracing 5 6 import ( 7 "io" 8 "time" 9 10 "github.com/mattermost/mattermost-server/v5/mlog" 11 opentracing "github.com/opentracing/opentracing-go" 12 "github.com/uber/jaeger-lib/metrics" 13 14 "context" 15 16 "github.com/uber/jaeger-client-go" 17 jaegercfg "github.com/uber/jaeger-client-go/config" 18 "github.com/uber/jaeger-client-go/zipkin" 19 ) 20 21 // Tracer is a wrapper around Jaeger OpenTracing client, used to properly de-initialize jaeger on exit 22 type Tracer struct { 23 closer io.Closer 24 } 25 26 type LogrusAdapter struct { 27 } 28 29 // Error - logrus adapter for span errors 30 func (LogrusAdapter) Error(msg string) { 31 mlog.Error(msg) 32 } 33 34 // Infof - logrus adapter for span info logging 35 func (LogrusAdapter) Infof(msg string, args ...interface{}) { 36 // we ignore Info messages from opentracing 37 } 38 39 // New instantiates Jaeger opentracing client with default options 40 // To override the defaults use environment variables listed here: https://github.com/jaegertracing/jaeger-client-go/blob/master/config/config.go 41 func New() (*Tracer, error) { 42 cfg := jaegercfg.Configuration{ 43 Sampler: &jaegercfg.SamplerConfig{ 44 Type: jaeger.SamplerTypeConst, 45 Param: 1, 46 }, 47 Reporter: &jaegercfg.ReporterConfig{ 48 LogSpans: true, 49 }, 50 } 51 52 zipkinPropagator := zipkin.NewZipkinB3HTTPHeaderPropagator() 53 54 closer, err := cfg.InitGlobalTracer( 55 "mattermost", 56 jaegercfg.Logger(LogrusAdapter{}), 57 jaegercfg.Metrics(metrics.NullFactory), 58 jaegercfg.Tag("serverStartTime", time.Now().UTC().Format(time.RFC3339)), 59 jaegercfg.Injector(opentracing.HTTPHeaders, zipkinPropagator), 60 jaegercfg.Extractor(opentracing.HTTPHeaders, zipkinPropagator), 61 jaegercfg.ZipkinSharedRPCSpan(true), 62 ) 63 if err != nil { 64 return nil, err 65 } 66 mlog.Info("Opentracing initialzed") 67 return &Tracer{ 68 closer: closer, 69 }, nil 70 } 71 72 func (t *Tracer) Close() error { 73 return t.closer.Close() 74 } 75 76 func StartRootSpanByContext(ctx context.Context, operationName string) (opentracing.Span, context.Context) { 77 return opentracing.StartSpanFromContext(ctx, operationName) 78 } 79 80 func StartSpanWithParentByContext(ctx context.Context, operationName string) (opentracing.Span, context.Context) { 81 parentSpan := opentracing.SpanFromContext(ctx) 82 83 if parentSpan == nil { 84 return StartRootSpanByContext(ctx, operationName) 85 } 86 87 return opentracing.StartSpanFromContext(ctx, operationName, opentracing.ChildOf(parentSpan.Context())) 88 }