From 32f7fb8bff62eb68433c3e9d0cbda922c2690e8d Mon Sep 17 00:00:00 2001 From: Nic Cope Date: Tue, 9 Oct 2018 01:18:02 -0700 Subject: [PATCH] Make Zipkin trace rate configurable --- cmd/configuration.go | 1 + configuration/configuration.go | 1 + configuration/configuration_test.go | 3 +++ docs/configuration/tracing.md | 12 +++++++++--- integration/tracing_test.go | 6 +++--- middlewares/tracing/zipkin/zipkin.go | 11 +++++++---- 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/cmd/configuration.go b/cmd/configuration.go index d1e54ff23..d5bac0aa7 100644 --- a/cmd/configuration.go +++ b/cmd/configuration.go @@ -208,6 +208,7 @@ func NewTraefikDefaultPointersConfiguration() *TraefikConfiguration { SameSpan: false, ID128Bit: true, Debug: false, + SampleRate: 1.0, }, DataDog: &datadog.Config{ LocalAgentHostPort: "localhost:8126", diff --git a/configuration/configuration.go b/configuration/configuration.go index e8a4b2a18..2323e7d0d 100644 --- a/configuration/configuration.go +++ b/configuration/configuration.go @@ -206,6 +206,7 @@ func (gc *GlobalConfiguration) initTracing() { SameSpan: false, ID128Bit: true, Debug: false, + SampleRate: 1.0, } } if gc.Tracing.Jaeger != nil { diff --git a/configuration/configuration_test.go b/configuration/configuration_test.go index 2799f04fb..97a0a9fa9 100644 --- a/configuration/configuration_test.go +++ b/configuration/configuration_test.go @@ -120,6 +120,7 @@ func TestSetEffectiveConfigurationTracing(t *testing.T) { SameSpan: false, ID128Bit: true, Debug: false, + SampleRate: 1.0, }, }, }, @@ -138,6 +139,7 @@ func TestSetEffectiveConfigurationTracing(t *testing.T) { SameSpan: true, ID128Bit: true, Debug: true, + SampleRate: 0.02, }, }, expected: &tracing.Tracing{ @@ -148,6 +150,7 @@ func TestSetEffectiveConfigurationTracing(t *testing.T) { SameSpan: true, ID128Bit: true, Debug: true, + SampleRate: 0.02, }, }, }, diff --git a/docs/configuration/tracing.md b/docs/configuration/tracing.md index f49a3a38b..b06ad855a 100644 --- a/docs/configuration/tracing.md +++ b/docs/configuration/tracing.md @@ -100,7 +100,7 @@ Træfik supports three tracing backends: Jaeger, Zipkin and DataDog. spanNameLimit = 150 [tracing.zipkin] - # Zipking HTTP endpoint used to send data + # Zipkin HTTP endpoint used to send data # # Default: "http://localhost:9411/api/v1/spans" # @@ -112,17 +112,23 @@ Træfik supports three tracing backends: Jaeger, Zipkin and DataDog. # debug = false - # Use ZipKin SameSpan RPC style traces + # Use Zipkin SameSpan RPC style traces # # Default: false # sameSpan = false - # Use ZipKin 128 bit root span IDs + # Use Zipkin 128 bit root span IDs # # Default: true # id128Bit = true + + # The rate between 0.0 and 1.0 of requests to trace. + # + # Default: 1.0 + # + sampleRate = 0.2 ``` ## DataDog diff --git a/integration/tracing_test.go b/integration/tracing_test.go index d24cc79ce..eeacd6db4 100644 --- a/integration/tracing_test.go +++ b/integration/tracing_test.go @@ -85,7 +85,7 @@ func (s *TracingSuite) TestZipkinRateLimit(c *check.C) { err = try.GetRequest("http://127.0.0.1:8000/ratelimit", 500*time.Millisecond, try.StatusCodeIs(http.StatusTooManyRequests)) c.Assert(err, checker.IsNil) - err = try.GetRequest("http://"+s.ZipkinIP+":9411/api/v2/spans?serviceName=tracing", 10*time.Second, try.BodyContains("forward frontend1/backend1", "rate limit")) + err = try.GetRequest("http://"+s.ZipkinIP+":9411/api/v2/spans?serviceName=tracing", 20*time.Second, try.BodyContains("forward frontend1/backend1", "rate limit")) c.Assert(err, checker.IsNil) } @@ -109,7 +109,7 @@ func (s *TracingSuite) TestZipkinRetry(c *check.C) { err = try.GetRequest("http://127.0.0.1:8000/retry", 500*time.Millisecond, try.StatusCodeIs(http.StatusBadGateway)) c.Assert(err, checker.IsNil) - err = try.GetRequest("http://"+s.ZipkinIP+":9411/api/v2/spans?serviceName=tracing", 10*time.Second, try.BodyContains("forward frontend2/backend2", "retry")) + err = try.GetRequest("http://"+s.ZipkinIP+":9411/api/v2/spans?serviceName=tracing", 20*time.Second, try.BodyContains("forward frontend2/backend2", "retry")) c.Assert(err, checker.IsNil) } @@ -132,6 +132,6 @@ func (s *TracingSuite) TestZipkinAuth(c *check.C) { err = try.GetRequest("http://127.0.0.1:8000/auth", 500*time.Millisecond, try.StatusCodeIs(http.StatusUnauthorized)) c.Assert(err, checker.IsNil) - err = try.GetRequest("http://"+s.ZipkinIP+":9411/api/v2/spans?serviceName=tracing", 10*time.Second, try.BodyContains("entrypoint http", "auth basic")) + err = try.GetRequest("http://"+s.ZipkinIP+":9411/api/v2/spans?serviceName=tracing", 20*time.Second, try.BodyContains("entrypoint http", "auth basic")) c.Assert(err, checker.IsNil) } diff --git a/middlewares/tracing/zipkin/zipkin.go b/middlewares/tracing/zipkin/zipkin.go index cb4b88c15..90ed2bd56 100644 --- a/middlewares/tracing/zipkin/zipkin.go +++ b/middlewares/tracing/zipkin/zipkin.go @@ -2,6 +2,7 @@ package zipkin import ( "io" + "time" "github.com/containous/traefik/log" "github.com/opentracing/opentracing-go" @@ -13,10 +14,11 @@ 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"` + 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"` + SampleRate float64 `description:"The rate between 0.0 and 1.0 of requests to trace." export:"true"` } // Setup sets up the tracer @@ -31,6 +33,7 @@ func (c *Config) Setup(serviceName string) (opentracing.Tracer, io.Closer, error zipkin.ClientServerSameSpan(c.SameSpan), zipkin.TraceID128Bit(c.ID128Bit), zipkin.DebugMode(c.Debug), + zipkin.WithSampler(zipkin.NewBoundarySampler(c.SampleRate, time.Now().Unix())), ) if err != nil {