2018-01-10 16:48:04 +00:00
|
|
|
package jaeger
|
|
|
|
|
|
|
|
import (
|
2018-08-01 11:52:03 +00:00
|
|
|
"fmt"
|
2018-01-10 16:48:04 +00:00
|
|
|
"io"
|
|
|
|
|
|
|
|
"github.com/containous/traefik/log"
|
|
|
|
"github.com/opentracing/opentracing-go"
|
|
|
|
jaegercfg "github.com/uber/jaeger-client-go/config"
|
2018-08-01 11:52:03 +00:00
|
|
|
"github.com/uber/jaeger-client-go/zipkin"
|
2018-01-10 16:48:04 +00:00
|
|
|
jaegermet "github.com/uber/jaeger-lib/metrics"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Name sets the name of this tracer
|
|
|
|
const Name = "jaeger"
|
|
|
|
|
|
|
|
// Config provides configuration settings for a jaeger tracer
|
|
|
|
type Config struct {
|
2018-01-18 16:24:03 +00:00
|
|
|
SamplingServerURL string `description:"set the sampling server url." export:"false"`
|
|
|
|
SamplingType string `description:"set the sampling type." export:"true"`
|
|
|
|
SamplingParam float64 `description:"set the sampling parameter." export:"true"`
|
|
|
|
LocalAgentHostPort string `description:"set jaeger-agent's host:port that the reporter will used." export:"false"`
|
2018-08-01 11:52:03 +00:00
|
|
|
Gen128Bit bool `description:"generate 128 bit span IDs." export:"true"`
|
|
|
|
Propagation string `description:"which propgation format to use (jaeger/b3)." export:"true"`
|
2018-01-10 16:48:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Setup sets up the tracer
|
|
|
|
func (c *Config) Setup(componentName string) (opentracing.Tracer, io.Closer, error) {
|
|
|
|
jcfg := jaegercfg.Configuration{
|
|
|
|
Sampler: &jaegercfg.SamplerConfig{
|
|
|
|
SamplingServerURL: c.SamplingServerURL,
|
|
|
|
Type: c.SamplingType,
|
|
|
|
Param: c.SamplingParam,
|
|
|
|
},
|
|
|
|
Reporter: &jaegercfg.ReporterConfig{
|
2018-01-18 16:24:03 +00:00
|
|
|
LogSpans: true,
|
|
|
|
LocalAgentHostPort: c.LocalAgentHostPort,
|
2018-01-10 16:48:04 +00:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
jMetricsFactory := jaegermet.NullFactory
|
|
|
|
|
2018-08-01 11:52:03 +00:00
|
|
|
opts := []jaegercfg.Option{
|
|
|
|
jaegercfg.Logger(&jaegerLogger{}),
|
|
|
|
jaegercfg.Metrics(jMetricsFactory),
|
|
|
|
jaegercfg.Gen128Bit(c.Gen128Bit),
|
|
|
|
}
|
|
|
|
|
|
|
|
switch c.Propagation {
|
|
|
|
case "b3":
|
|
|
|
p := zipkin.NewZipkinB3HTTPHeaderPropagator()
|
|
|
|
opts = append(opts,
|
|
|
|
jaegercfg.Injector(opentracing.HTTPHeaders, p),
|
|
|
|
jaegercfg.Extractor(opentracing.HTTPHeaders, p),
|
|
|
|
)
|
|
|
|
case "jaeger", "":
|
|
|
|
default:
|
|
|
|
return nil, nil, fmt.Errorf("unknown propagation format: %s", c.Propagation)
|
|
|
|
}
|
|
|
|
|
2018-01-10 16:48:04 +00:00
|
|
|
// Initialize tracer with a logger and a metrics factory
|
|
|
|
closer, err := jcfg.InitGlobalTracer(
|
|
|
|
componentName,
|
2018-08-01 11:52:03 +00:00
|
|
|
opts...,
|
2018-01-10 16:48:04 +00:00
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
log.Warnf("Could not initialize jaeger tracer: %s", err.Error())
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
2018-04-16 15:42:03 +00:00
|
|
|
log.Debug("Jaeger tracer configured")
|
2018-01-10 16:48:04 +00:00
|
|
|
|
|
|
|
return opentracing.GlobalTracer(), closer, nil
|
|
|
|
}
|