2018-01-10 16:48:04 +00:00
|
|
|
package zipkin
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
|
|
|
|
2018-04-16 15:42:03 +00:00
|
|
|
"github.com/containous/traefik/log"
|
2018-07-03 08:02:03 +00:00
|
|
|
"github.com/opentracing/opentracing-go"
|
2018-01-10 16:48:04 +00:00
|
|
|
zipkin "github.com/openzipkin/zipkin-go-opentracing"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Name sets the name of this tracer
|
|
|
|
const Name = "zipkin"
|
|
|
|
|
|
|
|
// Config provides configuration settings for a zipkin tracer
|
|
|
|
type Config struct {
|
|
|
|
HTTPEndpoint string `description:"HTTP Endpoint to report traces to." export:"false"`
|
|
|
|
SameSpan bool `description:"Use ZipKin SameSpan RPC style traces." export:"true"`
|
|
|
|
ID128Bit bool `description:"Use ZipKin 128 bit root span IDs." export:"true"`
|
|
|
|
Debug bool `description:"Enable Zipkin debug." export:"true"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Setup sets up the tracer
|
|
|
|
func (c *Config) Setup(serviceName string) (opentracing.Tracer, io.Closer, error) {
|
|
|
|
collector, err := zipkin.NewHTTPCollector(c.HTTPEndpoint)
|
2018-02-15 09:28:03 +00:00
|
|
|
if err != nil {
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
2018-01-10 16:48:04 +00:00
|
|
|
recorder := zipkin.NewRecorder(collector, c.Debug, "0.0.0.0:0", serviceName)
|
|
|
|
tracer, err := zipkin.NewTracer(
|
|
|
|
recorder,
|
|
|
|
zipkin.ClientServerSameSpan(c.SameSpan),
|
|
|
|
zipkin.TraceID128Bit(c.ID128Bit),
|
|
|
|
zipkin.DebugMode(c.Debug),
|
|
|
|
)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
return nil, nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// Without this, child spans are getting the NOOP tracer
|
|
|
|
opentracing.SetGlobalTracer(tracer)
|
|
|
|
|
2018-04-16 15:42:03 +00:00
|
|
|
log.Debug("Zipkin tracer configured")
|
|
|
|
|
2018-01-10 16:48:04 +00:00
|
|
|
return tracer, collector, nil
|
|
|
|
}
|