tracing/impl/jaeger_tracer.go (81 lines of code) (raw):
//go:build tracer_static && tracer_static_jaeger
package impl
import (
"fmt"
"io"
"strconv"
opentracing "github.com/opentracing/opentracing-go"
log "github.com/sirupsen/logrus"
jaegercfg "github.com/uber/jaeger-client-go/config"
jaegerlog "github.com/uber/jaeger-client-go/log"
)
type traceConfigMapper func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error)
var configMapper = map[string]traceConfigMapper{
"service_name": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
traceCfg.ServiceName = value
return nil, nil
},
"debug": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
return []jaegercfg.Option{jaegercfg.Logger(jaegerlog.StdLogger)}, nil
},
"sampler": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
if traceCfg.Sampler == nil {
traceCfg.Sampler = &jaegercfg.SamplerConfig{}
}
traceCfg.Sampler.Type = value
return nil, nil
},
"sampler_param": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
if traceCfg.Sampler == nil {
traceCfg.Sampler = &jaegercfg.SamplerConfig{}
}
valuef, err := strconv.ParseFloat(value, 64)
if err != nil {
return nil, fmt.Errorf("sampler_param must be a float: %w", ErrConfiguration)
}
traceCfg.Sampler.Param = valuef
return nil, nil
},
"http_endpoint": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
if traceCfg.Reporter == nil {
traceCfg.Reporter = &jaegercfg.ReporterConfig{}
}
traceCfg.Reporter.CollectorEndpoint = value
return nil, nil
},
"udp_endpoint": func(traceCfg *jaegercfg.Configuration, value string) ([]jaegercfg.Option, error) {
if traceCfg.Reporter == nil {
traceCfg.Reporter = &jaegercfg.ReporterConfig{}
}
traceCfg.Reporter.LocalAgentHostPort = value
return nil, nil
},
}
func jaegerTracerFactory(config map[string]string) (opentracing.Tracer, io.Closer, error) {
traceCfg, err := jaegercfg.FromEnv()
if err != nil {
return nil, nil, err
}
options := []jaegercfg.Option{}
// Convert the configuration map into a jaeger configuration
for k, v := range config {
mapper := configMapper[k]
if k == keyStrictConnectionParsing {
continue
}
if mapper != nil {
o, err := mapper(traceCfg, v)
if err != nil {
return nil, nil, err
}
options = append(options, o...)
} else {
if config[keyStrictConnectionParsing] != "" {
return nil, nil, fmt.Errorf("jaeger tracer: invalid option: %s: %w", k, ErrConfiguration)
}
log.Printf("jaeger tracer: warning: ignoring unknown configuration option: %s", k)
}
}
return traceCfg.NewTracer(options...)
}
func init() { // nolint:gochecknoinits
registerTracer("jaeger", jaegerTracerFactory)
}