71 lines
2.3 KiB
Go
71 lines
2.3 KiB
Go
package zipkin
|
|
|
|
import (
|
|
"io"
|
|
"time"
|
|
|
|
"github.com/containous/traefik/v2/pkg/log"
|
|
"github.com/opentracing/opentracing-go"
|
|
zipkinot "github.com/openzipkin-contrib/zipkin-go-opentracing"
|
|
"github.com/openzipkin/zipkin-go"
|
|
"github.com/openzipkin/zipkin-go/reporter/http"
|
|
)
|
|
|
|
// 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." json:"httpEndpoint,omitempty" toml:"httpEndpoint,omitempty" yaml:"httpEndpoint,omitempty"`
|
|
SameSpan bool `description:"Use Zipkin SameSpan RPC style traces." json:"sameSpan,omitempty" toml:"sameSpan,omitempty" yaml:"sameSpan,omitempty" export:"true"`
|
|
ID128Bit bool `description:"Use Zipkin 128 bit root span IDs." json:"id128Bit,omitempty" toml:"id128Bit,omitempty" yaml:"id128Bit,omitempty" export:"true"`
|
|
SampleRate float64 `description:"The rate between 0.0 and 1.0 of requests to trace." json:"sampleRate,omitempty" toml:"sampleRate,omitempty" yaml:"sampleRate,omitempty" export:"true"`
|
|
}
|
|
|
|
// SetDefaults sets the default values.
|
|
func (c *Config) SetDefaults() {
|
|
c.HTTPEndpoint = "http://localhost:9411/api/v2/spans"
|
|
c.SameSpan = false
|
|
c.ID128Bit = true
|
|
c.SampleRate = 1.0
|
|
}
|
|
|
|
// Setup sets up the tracer
|
|
func (c *Config) Setup(serviceName string) (opentracing.Tracer, io.Closer, error) {
|
|
// create our local endpoint
|
|
endpoint, err := zipkin.NewEndpoint(serviceName, "0.0.0.0:0")
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// create our sampler
|
|
sampler, err := zipkin.NewBoundarySampler(c.SampleRate, time.Now().Unix())
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// create the span reporter
|
|
reporter := http.NewReporter(c.HTTPEndpoint)
|
|
|
|
// create the native Zipkin tracer
|
|
nativeTracer, err := zipkin.NewTracer(
|
|
reporter,
|
|
zipkin.WithLocalEndpoint(endpoint),
|
|
zipkin.WithSharedSpans(c.SameSpan),
|
|
zipkin.WithTraceID128Bit(c.ID128Bit),
|
|
zipkin.WithSampler(sampler),
|
|
)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
// wrap the Zipkin native tracer with the OpenTracing Bridge
|
|
tracer := zipkinot.Wrap(nativeTracer)
|
|
|
|
// Without this, child spans are getting the NOOP tracer
|
|
opentracing.SetGlobalTracer(tracer)
|
|
|
|
log.WithoutContext().Debug("Zipkin tracer configured")
|
|
|
|
return tracer, reporter, nil
|
|
}
|