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