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 }