tracing/impl/lightstep_tracer.go (59 lines of code) (raw):
//go:build tracer_static && tracer_static_lightstep
package impl
import (
"context"
"fmt"
"io"
lightstep "github.com/lightstep/lightstep-tracer-go"
opentracing "github.com/opentracing/opentracing-go"
log "github.com/sirupsen/logrus"
)
type lightstepCloser struct {
tracer lightstep.Tracer
}
func (c *lightstepCloser) Close() error {
lightstep.Close(context.Background(), c.tracer)
return nil
}
var lightstepConfigMapper = map[string]func(traceCfg *lightstep.Options, value string) error{
"service_name": func(options *lightstep.Options, value string) error {
options.Tags[lightstep.ComponentNameKey] = value
return nil
},
"access_token": func(options *lightstep.Options, value string) error {
options.AccessToken = value
return nil
},
}
func lightstepTracerFactory(config map[string]string) (opentracing.Tracer, io.Closer, error) {
options := lightstep.Options{
Tags: map[string]interface{}{},
}
// Convert the configuration map into a jaeger configuration
for k, v := range config {
mapper := lightstepConfigMapper[k]
if k == keyStrictConnectionParsing {
continue
}
if mapper != nil {
err := mapper(&options, v)
if err != nil {
return nil, nil, err
}
} else {
if config[keyStrictConnectionParsing] != "" {
return nil, nil, fmt.Errorf("lightstep tracer: invalid option: %s: %w", k, ErrConfiguration)
}
log.Printf("lightstep tracer: warning: ignoring unknown configuration option: %s", k)
}
}
if options.AccessToken == "" {
return nil, nil, fmt.Errorf("failed to parse access_token from config: %q: %w", config, ErrConfiguration)
}
tracer := lightstep.NewTracer(options)
if tracer == nil {
return nil, nil, fmt.Errorf("lightstep tracer: unable to create tracer, review log messages: %w", ErrConfiguration)
}
return tracer, &lightstepCloser{tracer}, nil
}
func init() { // nolint:gochecknoinits
registerTracer("lightstep", lightstepTracerFactory)
}