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  }