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  }