gitlab.com/gitlab-org/labkit@v1.21.0/tracing/impl/lightstep_tracer.go (about)

     1  // +build tracer_static,tracer_static_lightstep
     2  
     3  package impl
     4  
     5  import (
     6  	"context"
     7  	"fmt"
     8  	"io"
     9  
    10  	lightstep "github.com/lightstep/lightstep-tracer-go"
    11  	opentracing "github.com/opentracing/opentracing-go"
    12  	log "github.com/sirupsen/logrus"
    13  )
    14  
    15  type lightstepCloser struct {
    16  	tracer lightstep.Tracer
    17  }
    18  
    19  func (c *lightstepCloser) Close() error {
    20  	lightstep.Close(context.Background(), c.tracer)
    21  	return nil
    22  }
    23  
    24  var lightstepConfigMapper = map[string]func(traceCfg *lightstep.Options, value string) error{
    25  	"service_name": func(options *lightstep.Options, value string) error {
    26  		options.Tags[lightstep.ComponentNameKey] = value
    27  		return nil
    28  	},
    29  	"access_token": func(options *lightstep.Options, value string) error {
    30  		options.AccessToken = value
    31  		return nil
    32  	},
    33  }
    34  
    35  func lightstepTracerFactory(config map[string]string) (opentracing.Tracer, io.Closer, error) {
    36  	options := lightstep.Options{
    37  		Tags: map[string]interface{}{},
    38  	}
    39  
    40  	// Convert the configuration map into a jaeger configuration
    41  	for k, v := range config {
    42  		mapper := lightstepConfigMapper[k]
    43  		if k == keyStrictConnectionParsing {
    44  			continue
    45  		}
    46  
    47  		if mapper != nil {
    48  			err := mapper(&options, v)
    49  			if err != nil {
    50  				return nil, nil, err
    51  			}
    52  		} else {
    53  			if config[keyStrictConnectionParsing] != "" {
    54  				return nil, nil, fmt.Errorf("lightstep tracer: invalid option: %s: %w", k, ErrConfiguration)
    55  			}
    56  
    57  			log.Printf("lightstep tracer: warning: ignoring unknown configuration option: %s", k)
    58  		}
    59  	}
    60  
    61  	if options.AccessToken == "" {
    62  		return nil, nil, fmt.Errorf("failed to parse access_token from config: %q: %w", config, ErrConfiguration)
    63  	}
    64  
    65  	tracer := lightstep.NewTracer(options)
    66  	if tracer == nil {
    67  		return nil, nil, fmt.Errorf("lightstep tracer: unable to create tracer, review log messages: %w", ErrConfiguration)
    68  	}
    69  
    70  	return tracer, &lightstepCloser{tracer}, nil
    71  }
    72  
    73  func init() { // nolint:gochecknoinits
    74  	registerTracer("lightstep", lightstepTracerFactory)
    75  }