diff options
Diffstat (limited to 'middleware/trace')
-rw-r--r-- | middleware/trace/setup.go | 4 | ||||
-rw-r--r-- | middleware/trace/trace.go | 25 | ||||
-rw-r--r-- | middleware/trace/trace_test.go | 33 |
3 files changed, 52 insertions, 10 deletions
diff --git a/middleware/trace/setup.go b/middleware/trace/setup.go index 4538e5f1d..a6eb8c340 100644 --- a/middleware/trace/setup.go +++ b/middleware/trace/setup.go @@ -34,9 +34,9 @@ func setup(c *caddy.Controller) error { return nil } -func traceParse(c *caddy.Controller) (*Trace, error) { +func traceParse(c *caddy.Controller) (*trace, error) { var ( - tr = &Trace{Endpoint: defEP, EndpointType: defEpType, every: 1, serviceName: defServiceName} + tr = &trace{Endpoint: defEP, EndpointType: defEpType, every: 1, serviceName: defServiceName} err error ) diff --git a/middleware/trace/trace.go b/middleware/trace/trace.go index 1b09e2914..3413fa681 100644 --- a/middleware/trace/trace.go +++ b/middleware/trace/trace.go @@ -15,12 +15,17 @@ import ( ) // Trace holds the tracer and endpoint info -type Trace struct { +type Trace interface { + middleware.Handler + Tracer() ot.Tracer +} + +type trace struct { Next middleware.Handler ServiceEndpoint string Endpoint string EndpointType string - Tracer ot.Tracer + tracer ot.Tracer serviceName string clientServer bool every uint64 @@ -28,8 +33,12 @@ type Trace struct { Once sync.Once } +func (t *trace) Tracer() ot.Tracer { + return t.tracer +} + // OnStartup sets up the tracer -func (t *Trace) OnStartup() error { +func (t *trace) OnStartup() error { var err error t.Once.Do(func() { switch t.EndpointType { @@ -42,7 +51,7 @@ func (t *Trace) OnStartup() error { return err } -func (t *Trace) setupZipkin() error { +func (t *trace) setupZipkin() error { collector, err := zipkin.NewHTTPCollector(t.Endpoint) if err != nil { @@ -50,7 +59,7 @@ func (t *Trace) setupZipkin() error { } recorder := zipkin.NewRecorder(collector, false, t.ServiceEndpoint, t.serviceName) - t.Tracer, err = zipkin.NewTracer(recorder, zipkin.ClientServerSameSpan(t.clientServer)) + t.tracer, err = zipkin.NewTracer(recorder, zipkin.ClientServerSameSpan(t.clientServer)) if err != nil { return err } @@ -58,12 +67,12 @@ func (t *Trace) setupZipkin() error { } // Name implements the Handler interface. -func (t *Trace) Name() string { +func (t *trace) Name() string { return "trace" } // ServeDNS implements the middleware.Handle interface. -func (t *Trace) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) { +func (t *trace) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) (int, error) { trace := false if t.every > 0 { queryNr := atomic.AddUint64(&t.count, 1) @@ -73,7 +82,7 @@ func (t *Trace) ServeDNS(ctx context.Context, w dns.ResponseWriter, r *dns.Msg) } } if span := ot.SpanFromContext(ctx); span == nil && trace { - span := t.Tracer.StartSpan("servedns") + span := t.Tracer().StartSpan("servedns") defer span.Finish() ctx = ot.ContextWithSpan(ctx, span) } diff --git a/middleware/trace/trace_test.go b/middleware/trace/trace_test.go new file mode 100644 index 000000000..37dec2065 --- /dev/null +++ b/middleware/trace/trace_test.go @@ -0,0 +1,33 @@ +package trace + +import ( + "testing" + + "github.com/mholt/caddy" +) + +// CreateTestTrace creates a trace middleware to be used in tests +func CreateTestTrace(config string) (*caddy.Controller, *trace, error) { + c := caddy.NewTestController("dns", config) + m, err := traceParse(c) + return c, m, err +} + +func TestTrace(t *testing.T) { + _, m, err := CreateTestTrace(`trace`) + if err != nil { + t.Errorf("Error parsing test input: %s", err) + return + } + if m.Name() != "trace" { + t.Errorf("Wrong name from GetName: %s", m.Name()) + } + err = m.OnStartup() + if err != nil { + t.Errorf("Error starting tracing middleware: %s", err) + return + } + if m.Tracer() == nil { + t.Errorf("Error, no tracer created") + } +} |