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

     1  // +build tracer_static,tracer_static_jaeger
     2  
     3  package impl
     4  
     5  import (
     6  	"fmt"
     7  	"io"
     8  	"strconv"
     9  
    10  	opentracing "github.com/opentracing/opentracing-go"
    11  	log "github.com/sirupsen/logrus"
    12  	jaegercfg "github.com/uber/jaeger-client-go/config"
    13  	jaegerlog "github.com/uber/jaeger-client-go/log"
    14  )
    15  
    16  type traceConfigMapper func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error)
    17  
    18  var configMapper = map[string]traceConfigMapper{
    19  	"service_name": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
    20  		traceCfg.ServiceName = value
    21  		return nil, nil
    22  	},
    23  	"debug": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
    24  		return []jaegercfg.Option{jaegercfg.Logger(jaegerlog.StdLogger)}, nil
    25  	},
    26  	"sampler": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
    27  		if traceCfg.Sampler == nil {
    28  			traceCfg.Sampler = &jaegercfg.SamplerConfig{}
    29  		}
    30  
    31  		traceCfg.Sampler.Type = value
    32  		return nil, nil
    33  	},
    34  	"sampler_param": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
    35  		if traceCfg.Sampler == nil {
    36  			traceCfg.Sampler = &jaegercfg.SamplerConfig{}
    37  		}
    38  		valuef, err := strconv.ParseFloat(value, 64)
    39  		if err != nil {
    40  			return nil, fmt.Errorf("sampler_param must be a float: %w", ErrConfiguration)
    41  		}
    42  
    43  		traceCfg.Sampler.Param = valuef
    44  		return nil, nil
    45  	},
    46  	"http_endpoint": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
    47  		if traceCfg.Reporter == nil {
    48  			traceCfg.Reporter = &jaegercfg.ReporterConfig{}
    49  		}
    50  		traceCfg.Reporter.CollectorEndpoint = value
    51  		return nil, nil
    52  	},
    53  	"udp_endpoint": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
    54  		if traceCfg.Reporter == nil {
    55  			traceCfg.Reporter = &jaegercfg.ReporterConfig{}
    56  		}
    57  		traceCfg.Reporter.LocalAgentHostPort = value
    58  		return nil, nil
    59  	},
    60  }
    61  
    62  func jaegerTracerFactory(config map[string]string) (opentracing.Tracer, io.Closer, error) {
    63  	traceCfg, err := jaegercfg.FromEnv()
    64  	if err != nil {
    65  		return nil, nil, err
    66  	}
    67  	options := []jaegercfg.Option{}
    68  
    69  	// Convert the configuration map into a jaeger configuration
    70  	for k, v := range config {
    71  		mapper := configMapper[k]
    72  		if k == keyStrictConnectionParsing {
    73  			continue
    74  		}
    75  
    76  		if mapper != nil {
    77  			o, err := mapper(traceCfg, v)
    78  			if err != nil {
    79  				return nil, nil, err
    80  			}
    81  			options = append(options, o...)
    82  		} else {
    83  			if config[keyStrictConnectionParsing] != "" {
    84  				return nil, nil, fmt.Errorf("jaeger tracer: invalid option: %s: %w", k, ErrConfiguration)
    85  			}
    86  
    87  			log.Printf("jaeger tracer: warning: ignoring unknown configuration option: %s", k)
    88  		}
    89  	}
    90  
    91  	return traceCfg.NewTracer(options...)
    92  }
    93  
    94  func init() { // nolint:gochecknoinits
    95  	registerTracer("jaeger", jaegerTracerFactory)
    96  }