mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-03 18:53:13 -05:00 
			
		
		
		
	Dep helper (#2151)
* Add dep task to update go dependencies * Update go dependencies
This commit is contained in:
		
				
					committed by
					
						
						Miek Gieben
					
				
			
			
				
	
			
			
			
						parent
						
							8f8b81f56b
						
					
				
				
					commit
					0e8977761d
				
			
							
								
								
									
										197
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/bench_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										197
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/bench_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,197 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	opentracing "github.com/opentracing/opentracing-go"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var tags []string
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	tags = make([]string, 1000)
 | 
			
		||||
	for j := 0; j < len(tags); j++ {
 | 
			
		||||
		tags[j] = fmt.Sprintf("%d", randomID())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func executeOps(sp opentracing.Span, numEvent, numTag, numItems int) {
 | 
			
		||||
	for j := 0; j < numEvent; j++ {
 | 
			
		||||
		sp.LogEvent("event")
 | 
			
		||||
	}
 | 
			
		||||
	for j := 0; j < numTag; j++ {
 | 
			
		||||
		sp.SetTag(tags[j], nil)
 | 
			
		||||
	}
 | 
			
		||||
	for j := 0; j < numItems; j++ {
 | 
			
		||||
		sp.SetBaggageItem(tags[j], tags[j])
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func benchmarkWithOps(b *testing.B, numEvent, numTag, numItems int) {
 | 
			
		||||
	var r CountingRecorder
 | 
			
		||||
	t, err := NewTracer(&r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		b.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	benchmarkWithOpsAndCB(b, func() opentracing.Span {
 | 
			
		||||
		return t.StartSpan("test")
 | 
			
		||||
	}, numEvent, numTag, numItems)
 | 
			
		||||
	if int(r) != b.N {
 | 
			
		||||
		b.Fatalf("missing traces: expected %d, got %d", b.N, r)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func benchmarkWithOpsAndCB(b *testing.B, create func() opentracing.Span,
 | 
			
		||||
	numEvent, numTag, numItems int) {
 | 
			
		||||
	b.ResetTimer()
 | 
			
		||||
	for i := 0; i < b.N; i++ {
 | 
			
		||||
		sp := create()
 | 
			
		||||
		executeOps(sp, numEvent, numTag, numItems)
 | 
			
		||||
		sp.Finish()
 | 
			
		||||
	}
 | 
			
		||||
	b.StopTimer()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkSpan_Empty(b *testing.B) {
 | 
			
		||||
	benchmarkWithOps(b, 0, 0, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkSpan_100Events(b *testing.B) {
 | 
			
		||||
	benchmarkWithOps(b, 100, 0, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkSpan_1000Events(b *testing.B) {
 | 
			
		||||
	benchmarkWithOps(b, 1000, 0, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkSpan_100Tags(b *testing.B) {
 | 
			
		||||
	benchmarkWithOps(b, 0, 100, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkSpan_1000Tags(b *testing.B) {
 | 
			
		||||
	benchmarkWithOps(b, 0, 1000, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkSpan_100BaggageItems(b *testing.B) {
 | 
			
		||||
	benchmarkWithOps(b, 0, 0, 100)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkTrimmedSpan_100Events_100Tags_100BaggageItems(b *testing.B) {
 | 
			
		||||
	var r CountingRecorder
 | 
			
		||||
	t, err := NewTracer(
 | 
			
		||||
		&r,
 | 
			
		||||
		TrimUnsampledSpans(true),
 | 
			
		||||
		WithSampler(neverSample),
 | 
			
		||||
		TraceID128Bit(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		b.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	benchmarkWithOpsAndCB(b, func() opentracing.Span {
 | 
			
		||||
		sp := t.StartSpan("test")
 | 
			
		||||
		return sp
 | 
			
		||||
	}, 100, 100, 100)
 | 
			
		||||
	if int(r) != b.N {
 | 
			
		||||
		b.Fatalf("missing traces: expected %d, got %d", b.N, r)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func benchmarkInject(b *testing.B, format opentracing.BuiltinFormat, numItems int) {
 | 
			
		||||
	var r CountingRecorder
 | 
			
		||||
	tracer, err := NewTracer(&r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		b.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	sp := tracer.StartSpan("testing")
 | 
			
		||||
	executeOps(sp, 0, 0, numItems)
 | 
			
		||||
	var carrier interface{}
 | 
			
		||||
	switch format {
 | 
			
		||||
	case opentracing.TextMap, opentracing.HTTPHeaders:
 | 
			
		||||
		carrier = opentracing.HTTPHeadersCarrier(http.Header{})
 | 
			
		||||
	case opentracing.Binary:
 | 
			
		||||
		carrier = &bytes.Buffer{}
 | 
			
		||||
	default:
 | 
			
		||||
		b.Fatalf("unhandled format %d", format)
 | 
			
		||||
	}
 | 
			
		||||
	b.ResetTimer()
 | 
			
		||||
	for i := 0; i < b.N; i++ {
 | 
			
		||||
		err := tracer.Inject(sp.Context(), format, carrier)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			b.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func benchmarkExtract(b *testing.B, format opentracing.BuiltinFormat, numItems int) {
 | 
			
		||||
	var r CountingRecorder
 | 
			
		||||
	tracer, err := NewTracer(&r)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		b.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	sp := tracer.StartSpan("testing")
 | 
			
		||||
	executeOps(sp, 0, 0, numItems)
 | 
			
		||||
	var carrier interface{}
 | 
			
		||||
	switch format {
 | 
			
		||||
	case opentracing.TextMap, opentracing.HTTPHeaders:
 | 
			
		||||
		carrier = opentracing.HTTPHeadersCarrier(http.Header{})
 | 
			
		||||
	case opentracing.Binary:
 | 
			
		||||
		carrier = &bytes.Buffer{}
 | 
			
		||||
	default:
 | 
			
		||||
		b.Fatalf("unhandled format %d", format)
 | 
			
		||||
	}
 | 
			
		||||
	if err := tracer.Inject(sp.Context(), format, carrier); err != nil {
 | 
			
		||||
		b.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// We create a new bytes.Buffer every time for tracer.Extract() to keep
 | 
			
		||||
	// this benchmark realistic.
 | 
			
		||||
	var rawBinaryBytes []byte
 | 
			
		||||
	if format == opentracing.Binary {
 | 
			
		||||
		rawBinaryBytes = carrier.(*bytes.Buffer).Bytes()
 | 
			
		||||
	}
 | 
			
		||||
	b.ResetTimer()
 | 
			
		||||
	for i := 0; i < b.N; i++ {
 | 
			
		||||
		if format == opentracing.Binary {
 | 
			
		||||
			carrier = bytes.NewBuffer(rawBinaryBytes)
 | 
			
		||||
		}
 | 
			
		||||
		_, err := tracer.Extract(format, carrier)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			b.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkInject_TextMap_Empty(b *testing.B) {
 | 
			
		||||
	benchmarkInject(b, opentracing.TextMap, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkInject_TextMap_100BaggageItems(b *testing.B) {
 | 
			
		||||
	benchmarkInject(b, opentracing.TextMap, 100)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkInject_Binary_Empty(b *testing.B) {
 | 
			
		||||
	benchmarkInject(b, opentracing.Binary, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkInject_Binary_100BaggageItems(b *testing.B) {
 | 
			
		||||
	benchmarkInject(b, opentracing.Binary, 100)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkExtract_TextMap_Empty(b *testing.B) {
 | 
			
		||||
	benchmarkExtract(b, opentracing.TextMap, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkExtract_TextMap_100BaggageItems(b *testing.B) {
 | 
			
		||||
	benchmarkExtract(b, opentracing.TextMap, 100)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkExtract_Binary_Empty(b *testing.B) {
 | 
			
		||||
	benchmarkExtract(b, opentracing.Binary, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkExtract_Binary_100BaggageItems(b *testing.B) {
 | 
			
		||||
	benchmarkExtract(b, opentracing.Binary, 100)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										382
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/collector-http_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										382
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/collector-http_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,382 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io/ioutil"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/apache/thrift/lib/go/thrift"
 | 
			
		||||
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/zipkincore"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	interval    = 10 * time.Millisecond
 | 
			
		||||
	serverSleep = 100 * time.Millisecond
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestHttpCollector(t *testing.T) {
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	port := 10000
 | 
			
		||||
	server := newHTTPServer(t, port)
 | 
			
		||||
	c, err := NewHTTPCollector(fmt.Sprintf("http://localhost:%d/api/v1/spans", port))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		serviceName  = "service"
 | 
			
		||||
		methodName   = "method"
 | 
			
		||||
		traceID      = int64(123)
 | 
			
		||||
		spanID       = int64(456)
 | 
			
		||||
		parentSpanID = int64(0)
 | 
			
		||||
		value        = "foo"
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	span := makeNewSpan("1.2.3.4:1234", serviceName, methodName, traceID, spanID, parentSpanID, true)
 | 
			
		||||
	annotate(span, time.Now(), value, nil)
 | 
			
		||||
	if err := c.Collect(span); err != nil {
 | 
			
		||||
		t.Errorf("error during collection: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if err := c.Close(); err != nil {
 | 
			
		||||
		t.Fatalf("error during collection: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := 1, len(server.spans()); want != have {
 | 
			
		||||
		t.Fatal("never received a span")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gotSpan := server.spans()[0]
 | 
			
		||||
	if want, have := methodName, gotSpan.GetName(); want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := traceID, gotSpan.TraceID; want != have {
 | 
			
		||||
		t.Errorf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := spanID, gotSpan.ID; want != have {
 | 
			
		||||
		t.Errorf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := parentSpanID, *gotSpan.ParentID; want != have {
 | 
			
		||||
		t.Errorf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if want, have := 1, len(gotSpan.GetAnnotations()); want != have {
 | 
			
		||||
		t.Fatalf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gotAnnotation := gotSpan.GetAnnotations()[0]
 | 
			
		||||
	if want, have := value, gotAnnotation.GetValue(); want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestHttpCollector_Batch(t *testing.T) {
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	port := 10001
 | 
			
		||||
	server := newHTTPServer(t, port)
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		batchSize   = 5
 | 
			
		||||
		spanTimeout = 100 * time.Millisecond
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	c, err := NewHTTPCollector(fmt.Sprintf("http://localhost:%d/api/v1/spans", port),
 | 
			
		||||
		HTTPBatchSize(batchSize),
 | 
			
		||||
		HTTPBatchInterval(time.Duration(2*batchSize)*spanTimeout), // Make sure timeout won't cause this test to pass
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < batchSize-1; i++ {
 | 
			
		||||
		if err := c.Collect(&zipkincore.Span{}); err != nil {
 | 
			
		||||
			t.Errorf("error during collection: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = consistently(func() bool { return len(server.spans()) == 0 }, spanTimeout)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal("Client sent spans before batch size")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := c.Collect(&zipkincore.Span{}); err != nil {
 | 
			
		||||
		t.Errorf("error during collection: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	err = eventually(func() bool { return len(server.spans()) != batchSize }, time.Duration(batchSize)*time.Millisecond)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal("Client did not send spans when batch size reached")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestHttpCollector_BatchInterval(t *testing.T) {
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	port := 10002
 | 
			
		||||
	server := newHTTPServer(t, port)
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		batchSize     = 5
 | 
			
		||||
		batchInterval = 100 * time.Millisecond
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	start := time.Now()
 | 
			
		||||
	c, err := NewHTTPCollector(fmt.Sprintf("http://localhost:%d/api/v1/spans", port),
 | 
			
		||||
		HTTPBatchSize(batchSize), // Make sure batch won't make this test pass
 | 
			
		||||
		HTTPBatchInterval(batchInterval),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// send less spans than batchSize in the background
 | 
			
		||||
	lessThanBatchSize := batchSize - 1
 | 
			
		||||
	go func() {
 | 
			
		||||
		for i := 0; i < lessThanBatchSize; i++ {
 | 
			
		||||
			if err := c.Collect(&zipkincore.Span{}); err != nil {
 | 
			
		||||
				t.Errorf("error during collection: %v", err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	beforeInterval := batchInterval - (2 * interval) - time.Now().Sub(start)
 | 
			
		||||
	err = consistently(func() bool { return len(server.spans()) == 0 }, beforeInterval)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal("Client sent spans before timeout")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	afterInterval := batchInterval * 2
 | 
			
		||||
	err = eventually(func() bool { return len(server.spans()) == lessThanBatchSize }, afterInterval)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal("Client did not send spans after timeout")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestHttpCollector_NonBlockCollect tests that the Collect
 | 
			
		||||
// function is non-blocking, even when the server is slow.
 | 
			
		||||
// Use of the /api/v1/sleep endpoint registered in the server.
 | 
			
		||||
func TestHttpCollector_NonBlockCollect(t *testing.T) {
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	port := 10003
 | 
			
		||||
	newHTTPServer(t, port)
 | 
			
		||||
 | 
			
		||||
	c, err := NewHTTPCollector(fmt.Sprintf("http://localhost:%d/api/v1/sleep", port))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	start := time.Now()
 | 
			
		||||
	if err := c.Collect(&zipkincore.Span{}); err != nil {
 | 
			
		||||
		t.Errorf("error during collection: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if time.Now().Sub(start) >= serverSleep {
 | 
			
		||||
		t.Fatal("Collect is blocking")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestHttpCollector_MaxBatchSize(t *testing.T) {
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	port := 10004
 | 
			
		||||
	server := newHTTPServer(t, port)
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		maxBacklog = 5
 | 
			
		||||
		batchSize  = maxBacklog * 2 // make backsize bigger than backlog enable testing backlog disposal
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	c, err := NewHTTPCollector(fmt.Sprintf("http://localhost:%d/api/v1/spans", port),
 | 
			
		||||
		HTTPMaxBacklog(maxBacklog),
 | 
			
		||||
		HTTPBatchSize(batchSize),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < batchSize; i++ {
 | 
			
		||||
		c.Collect(makeNewSpan("", "", "", 0, int64(i), 0, false))
 | 
			
		||||
	}
 | 
			
		||||
	c.Close()
 | 
			
		||||
 | 
			
		||||
	for i, s := range server.spans() {
 | 
			
		||||
		if want, have := int64(i+maxBacklog), s.ID; want != have {
 | 
			
		||||
			t.Errorf("Span ID is wrong. want %d, have %d", want, have)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestHTTPCollector_RequestCallback(t *testing.T) {
 | 
			
		||||
	t.Parallel()
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		err      error
 | 
			
		||||
		port     = 10005
 | 
			
		||||
		server   = newHTTPServer(t, port)
 | 
			
		||||
		hdrKey   = "test-key"
 | 
			
		||||
		hdrValue = "test-value"
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	c, err := NewHTTPCollector(
 | 
			
		||||
		fmt.Sprintf("http://localhost:%d/api/v1/spans", port),
 | 
			
		||||
		HTTPRequestCallback(func(r *http.Request) {
 | 
			
		||||
			r.Header.Add(hdrKey, hdrValue)
 | 
			
		||||
		}),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if err = c.Collect(&zipkincore.Span{}); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if err = c.Close(); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if want, have := 1, len(server.spans()); want != have {
 | 
			
		||||
		t.Fatal("never received a span")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	headers := server.headers()
 | 
			
		||||
	if len(headers) == 0 {
 | 
			
		||||
		t.Fatalf("Collect request was not handled")
 | 
			
		||||
	}
 | 
			
		||||
	testHeader := headers.Get(hdrKey)
 | 
			
		||||
	if !strings.EqualFold(testHeader, hdrValue) {
 | 
			
		||||
		t.Errorf("Custom header not received. want %s, have %s", testHeader, hdrValue)
 | 
			
		||||
	}
 | 
			
		||||
	server.clearHeaders()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type httpServer struct {
 | 
			
		||||
	t            *testing.T
 | 
			
		||||
	zipkinSpans  []*zipkincore.Span
 | 
			
		||||
	zipkinHeader http.Header
 | 
			
		||||
	mutex        sync.RWMutex
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *httpServer) spans() []*zipkincore.Span {
 | 
			
		||||
	s.mutex.RLock()
 | 
			
		||||
	defer s.mutex.RUnlock()
 | 
			
		||||
	return s.zipkinSpans
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *httpServer) clearSpans() {
 | 
			
		||||
	s.mutex.Lock()
 | 
			
		||||
	defer s.mutex.Unlock()
 | 
			
		||||
	s.zipkinSpans = s.zipkinSpans[:0]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *httpServer) headers() http.Header {
 | 
			
		||||
	s.mutex.RLock()
 | 
			
		||||
	defer s.mutex.RUnlock()
 | 
			
		||||
	return s.zipkinHeader
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *httpServer) clearHeaders() {
 | 
			
		||||
	s.mutex.Lock()
 | 
			
		||||
	defer s.mutex.Unlock()
 | 
			
		||||
	s.zipkinHeader = make(http.Header, 0)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newHTTPServer(t *testing.T, port int) *httpServer {
 | 
			
		||||
	server := &httpServer{
 | 
			
		||||
		t:           t,
 | 
			
		||||
		zipkinSpans: make([]*zipkincore.Span, 0),
 | 
			
		||||
		mutex:       sync.RWMutex{},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	handler := http.NewServeMux()
 | 
			
		||||
 | 
			
		||||
	handler.HandleFunc("/api/v1/spans", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		contextType := r.Header.Get("Content-Type")
 | 
			
		||||
		if contextType != "application/x-thrift" {
 | 
			
		||||
			t.Fatalf(
 | 
			
		||||
				"except Content-Type should be application/x-thrift, but is %s",
 | 
			
		||||
				contextType)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// clone headers from request
 | 
			
		||||
		headers := make(http.Header, len(r.Header))
 | 
			
		||||
		for k, vv := range r.Header {
 | 
			
		||||
			vv2 := make([]string, len(vv))
 | 
			
		||||
			copy(vv2, vv)
 | 
			
		||||
			headers[k] = vv2
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		body, err := ioutil.ReadAll(r.Body)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatal(err)
 | 
			
		||||
		}
 | 
			
		||||
		buffer := thrift.NewTMemoryBuffer()
 | 
			
		||||
		if _, err = buffer.Write(body); err != nil {
 | 
			
		||||
			t.Error(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		transport := thrift.NewTBinaryProtocolTransport(buffer)
 | 
			
		||||
		_, size, err := transport.ReadListBegin()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Error(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		var spans []*zipkincore.Span
 | 
			
		||||
		for i := 0; i < size; i++ {
 | 
			
		||||
			zs := &zipkincore.Span{}
 | 
			
		||||
			if err = zs.Read(transport); err != nil {
 | 
			
		||||
				t.Error(err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			spans = append(spans, zs)
 | 
			
		||||
		}
 | 
			
		||||
		err = transport.ReadListEnd()
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Error(err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		server.mutex.Lock()
 | 
			
		||||
		defer server.mutex.Unlock()
 | 
			
		||||
		server.zipkinSpans = append(server.zipkinSpans, spans...)
 | 
			
		||||
		server.zipkinHeader = headers
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	handler.HandleFunc("/api/v1/sleep", func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
		time.Sleep(serverSleep)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		http.ListenAndServe(fmt.Sprintf(":%d", port), handler)
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	return server
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func consistently(assertion func() bool, atList time.Duration) error {
 | 
			
		||||
	deadline := time.Now().Add(atList)
 | 
			
		||||
	for time.Now().Before(deadline) {
 | 
			
		||||
		if !assertion() {
 | 
			
		||||
			return fmt.Errorf("failed")
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(interval)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func eventually(assertion func() bool, timeout time.Duration) error {
 | 
			
		||||
	deadline := time.Now().Add(timeout)
 | 
			
		||||
	for time.Now().Before(deadline) {
 | 
			
		||||
		if assertion() {
 | 
			
		||||
			return nil
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(interval)
 | 
			
		||||
	}
 | 
			
		||||
	return fmt.Errorf("failed")
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										194
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/collector-kafka_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										194
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/collector-kafka_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,194 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/Shopify/sarama"
 | 
			
		||||
	"github.com/apache/thrift/lib/go/thrift"
 | 
			
		||||
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/zipkincore"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type stubProducer struct {
 | 
			
		||||
	in     chan *sarama.ProducerMessage
 | 
			
		||||
	err    chan *sarama.ProducerError
 | 
			
		||||
	kdown  bool
 | 
			
		||||
	closed bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (p *stubProducer) AsyncClose() {}
 | 
			
		||||
func (p *stubProducer) Close() error {
 | 
			
		||||
	if p.kdown {
 | 
			
		||||
		return errors.New("Kafka is down")
 | 
			
		||||
	}
 | 
			
		||||
	p.closed = true
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
func (p *stubProducer) Input() chan<- *sarama.ProducerMessage     { return p.in }
 | 
			
		||||
func (p *stubProducer) Successes() <-chan *sarama.ProducerMessage { return nil }
 | 
			
		||||
func (p *stubProducer) Errors() <-chan *sarama.ProducerError      { return p.err }
 | 
			
		||||
 | 
			
		||||
func newStubProducer(kdown bool) *stubProducer {
 | 
			
		||||
	return &stubProducer{
 | 
			
		||||
		make(chan *sarama.ProducerMessage),
 | 
			
		||||
		make(chan *sarama.ProducerError),
 | 
			
		||||
		kdown,
 | 
			
		||||
		false,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var spans = []*zipkincore.Span{
 | 
			
		||||
	makeNewSpan("203.0.113.10:1234", "service1", "avg", 123, 456, 0, true),
 | 
			
		||||
	makeNewSpan("203.0.113.10:1234", "service2", "sum", 123, 789, 456, true),
 | 
			
		||||
	makeNewSpan("203.0.113.10:1234", "service2", "div", 123, 101112, 456, true),
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestKafkaProduce(t *testing.T) {
 | 
			
		||||
	p := newStubProducer(false)
 | 
			
		||||
	c, err := NewKafkaCollector(
 | 
			
		||||
		[]string{"192.0.2.10:9092"}, KafkaProducer(p),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, want := range spans {
 | 
			
		||||
		m := collectSpan(t, c, p, want)
 | 
			
		||||
		testMetadata(t, m)
 | 
			
		||||
		got := deserializeSpan(t, m.Value)
 | 
			
		||||
		testEqual(t, want, got)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestKafkaClose(t *testing.T) {
 | 
			
		||||
	p := newStubProducer(false)
 | 
			
		||||
	c, err := NewKafkaCollector(
 | 
			
		||||
		[]string{"192.0.2.10:9092"}, KafkaProducer(p),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if err = c.Close(); err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if !p.closed {
 | 
			
		||||
		t.Fatal("producer not closed")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestKafkaCloseError(t *testing.T) {
 | 
			
		||||
	p := newStubProducer(true)
 | 
			
		||||
	c, err := NewKafkaCollector(
 | 
			
		||||
		[]string{"192.0.2.10:9092"}, KafkaProducer(p),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	if err = c.Close(); err == nil {
 | 
			
		||||
		t.Error("no error on close")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestKafkaErrors(t *testing.T) {
 | 
			
		||||
	p := newStubProducer(true)
 | 
			
		||||
	errs := make(chan []interface{}, len(spans))
 | 
			
		||||
	lg := Logger(LoggerFunc(func(keyvals ...interface{}) error {
 | 
			
		||||
		for i := 0; i < len(keyvals); i += 2 {
 | 
			
		||||
			if keyvals[i] == "result" && keyvals[i+1] == "failed to produce msg" {
 | 
			
		||||
				errs <- keyvals
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return nil
 | 
			
		||||
	}))
 | 
			
		||||
	c, err := NewKafkaCollector(
 | 
			
		||||
		[]string{"192.0.2.10:9092"},
 | 
			
		||||
		KafkaProducer(p),
 | 
			
		||||
		KafkaLogger(lg),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
	for _, want := range spans {
 | 
			
		||||
		_ = collectSpan(t, c, p, want)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < len(spans); i++ {
 | 
			
		||||
		select {
 | 
			
		||||
		case <-errs:
 | 
			
		||||
		case <-time.After(100 * time.Millisecond):
 | 
			
		||||
			t.Fatalf("errors not logged. got %d, wanted %d", i, len(spans))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func collectSpan(t *testing.T, c Collector, p *stubProducer, s *zipkincore.Span) *sarama.ProducerMessage {
 | 
			
		||||
	var m *sarama.ProducerMessage
 | 
			
		||||
	rcvd := make(chan bool, 1)
 | 
			
		||||
	go func() {
 | 
			
		||||
		select {
 | 
			
		||||
		case m = <-p.in:
 | 
			
		||||
			rcvd <- true
 | 
			
		||||
			if p.kdown {
 | 
			
		||||
				p.err <- &sarama.ProducerError{
 | 
			
		||||
					Msg: m,
 | 
			
		||||
					Err: errors.New("kafka is down"),
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		case <-time.After(100 * time.Millisecond):
 | 
			
		||||
			rcvd <- false
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	if err := c.Collect(s); err != nil {
 | 
			
		||||
		t.Errorf("error during collection: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if !<-rcvd {
 | 
			
		||||
		t.Fatal("span message was not produced")
 | 
			
		||||
	}
 | 
			
		||||
	return m
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testMetadata(t *testing.T, m *sarama.ProducerMessage) {
 | 
			
		||||
	if m.Topic != "zipkin" {
 | 
			
		||||
		t.Errorf("produced to topic %q, want %q", m.Topic, "zipkin")
 | 
			
		||||
	}
 | 
			
		||||
	if m.Key != nil {
 | 
			
		||||
		t.Errorf("produced with key %q, want nil", m.Key)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func deserializeSpan(t *testing.T, e sarama.Encoder) *zipkincore.Span {
 | 
			
		||||
	bytes, err := e.Encode()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("error in encoding: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	s := zipkincore.NewSpan()
 | 
			
		||||
	mb := thrift.NewTMemoryBufferLen(len(bytes))
 | 
			
		||||
	_, _ = mb.Write(bytes)
 | 
			
		||||
	_ = mb.Flush(context.Background())
 | 
			
		||||
	pt := thrift.NewTBinaryProtocolTransport(mb)
 | 
			
		||||
	err = s.Read(pt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Errorf("error in decoding: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	return s
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func testEqual(t *testing.T, want *zipkincore.Span, got *zipkincore.Span) {
 | 
			
		||||
	if got.TraceID != want.TraceID {
 | 
			
		||||
		t.Errorf("trace_id %d, want %d", got.TraceID, want.TraceID)
 | 
			
		||||
	}
 | 
			
		||||
	if got.ID != want.ID {
 | 
			
		||||
		t.Errorf("id %d, want %d", got.ID, want.ID)
 | 
			
		||||
	}
 | 
			
		||||
	if got.ParentID == nil {
 | 
			
		||||
		if want.ParentID != nil {
 | 
			
		||||
			t.Errorf("parent_id %d, want %d", got.ParentID, want.ParentID)
 | 
			
		||||
		}
 | 
			
		||||
	} else if *got.ParentID != *want.ParentID {
 | 
			
		||||
		t.Errorf("parent_id %d, want %d", got.ParentID, want.ParentID)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										189
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/collector-scribe_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										189
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/collector-scribe_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,189 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"encoding/base64"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math/rand"
 | 
			
		||||
	"net"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/apache/thrift/lib/go/thrift"
 | 
			
		||||
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/scribe"
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/zipkincore"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestScribeCollector(t *testing.T) {
 | 
			
		||||
	server := newScribeServer(t)
 | 
			
		||||
 | 
			
		||||
	timeout := time.Second
 | 
			
		||||
	batchInterval := time.Millisecond
 | 
			
		||||
	c, err := NewScribeCollector(server.addr(), timeout, ScribeBatchSize(0), ScribeBatchInterval(batchInterval))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var (
 | 
			
		||||
		serviceName  = "service"
 | 
			
		||||
		methodName   = "method"
 | 
			
		||||
		traceID      = int64(123)
 | 
			
		||||
		spanID       = int64(456)
 | 
			
		||||
		parentSpanID = int64(0)
 | 
			
		||||
		value        = "foo"
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	span := makeNewSpan("1.2.3.4:1234", serviceName, methodName, traceID, spanID, parentSpanID, true)
 | 
			
		||||
	annotate(span, time.Now(), "foo", nil)
 | 
			
		||||
	if err := c.Collect(span); err != nil {
 | 
			
		||||
		t.Errorf("error during collection: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if err := c.Close(); err != nil {
 | 
			
		||||
		t.Fatalf("error during collection: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := 1, len(server.spans()); want != have {
 | 
			
		||||
		t.Fatalf("never received a span")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gotSpan := server.spans()[0]
 | 
			
		||||
	if want, have := methodName, gotSpan.GetName(); want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := traceID, gotSpan.TraceID; want != have {
 | 
			
		||||
		t.Errorf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := spanID, gotSpan.ID; want != have {
 | 
			
		||||
		t.Errorf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := parentSpanID, *gotSpan.ParentID; want != have {
 | 
			
		||||
		t.Errorf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if want, have := 1, len(gotSpan.GetAnnotations()); want != have {
 | 
			
		||||
		t.Fatalf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gotAnnotation := gotSpan.GetAnnotations()[0]
 | 
			
		||||
	if want, have := value, gotAnnotation.GetValue(); want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type scribeServer struct {
 | 
			
		||||
	t         *testing.T
 | 
			
		||||
	transport *thrift.TServerSocket
 | 
			
		||||
	address   string
 | 
			
		||||
	server    *thrift.TSimpleServer
 | 
			
		||||
	handler   *scribeHandler
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newScribeServer(t *testing.T) *scribeServer {
 | 
			
		||||
	protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()
 | 
			
		||||
	transportFactory := thrift.NewTFramedTransportFactory(thrift.NewTTransportFactory())
 | 
			
		||||
 | 
			
		||||
	var port int
 | 
			
		||||
	var transport *thrift.TServerSocket
 | 
			
		||||
	var err error
 | 
			
		||||
	for i := 0; i < 10; i++ {
 | 
			
		||||
		port = 10000 + rand.Intn(10000)
 | 
			
		||||
		transport, err = thrift.NewTServerSocket(fmt.Sprintf(":%d", port))
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Logf("port %d: %v", port, err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		break
 | 
			
		||||
	}
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatal(err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	handler := newScribeHandler(t)
 | 
			
		||||
	server := thrift.NewTSimpleServer4(
 | 
			
		||||
		scribe.NewScribeProcessor(handler),
 | 
			
		||||
		transport,
 | 
			
		||||
		transportFactory,
 | 
			
		||||
		protocolFactory,
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	go func() {
 | 
			
		||||
		_ = server.Serve()
 | 
			
		||||
	}()
 | 
			
		||||
 | 
			
		||||
	deadline := time.Now().Add(time.Second)
 | 
			
		||||
	for !canConnect(port) {
 | 
			
		||||
		if time.Now().After(deadline) {
 | 
			
		||||
			t.Fatal("server never started")
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(time.Millisecond)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &scribeServer{
 | 
			
		||||
		transport: transport,
 | 
			
		||||
		address:   fmt.Sprintf("127.0.0.1:%d", port),
 | 
			
		||||
		handler:   handler,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *scribeServer) addr() string {
 | 
			
		||||
	return s.address
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (s *scribeServer) spans() []*zipkincore.Span {
 | 
			
		||||
	return s.handler.spans()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type scribeHandler struct {
 | 
			
		||||
	t *testing.T
 | 
			
		||||
	sync.RWMutex
 | 
			
		||||
	entries []*scribe.LogEntry
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func newScribeHandler(t *testing.T) *scribeHandler {
 | 
			
		||||
	return &scribeHandler{t: t}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *scribeHandler) Log(ctx context.Context, messages []*scribe.LogEntry) (scribe.ResultCode, error) {
 | 
			
		||||
	h.Lock()
 | 
			
		||||
	defer h.Unlock()
 | 
			
		||||
	for _, m := range messages {
 | 
			
		||||
		h.entries = append(h.entries, m)
 | 
			
		||||
	}
 | 
			
		||||
	return scribe.ResultCode_OK, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (h *scribeHandler) spans() []*zipkincore.Span {
 | 
			
		||||
	h.RLock()
 | 
			
		||||
	defer h.RUnlock()
 | 
			
		||||
	spans := []*zipkincore.Span{}
 | 
			
		||||
	for _, m := range h.entries {
 | 
			
		||||
		decoded, err := base64.StdEncoding.DecodeString(m.GetMessage())
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			h.t.Error(err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		buffer := thrift.NewTMemoryBuffer()
 | 
			
		||||
		if _, err := buffer.Write(decoded); err != nil {
 | 
			
		||||
			h.t.Error(err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		transport := thrift.NewTBinaryProtocolTransport(buffer)
 | 
			
		||||
		zs := &zipkincore.Span{}
 | 
			
		||||
		if err := zs.Read(transport); err != nil {
 | 
			
		||||
			h.t.Error(err)
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		spans = append(spans, zs)
 | 
			
		||||
	}
 | 
			
		||||
	return spans
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func canConnect(port int) bool {
 | 
			
		||||
	c, err := net.Dial("tcp", fmt.Sprintf("127.0.0.1:%d", port))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	_ = c.Close()
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										110
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/collector_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										110
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/collector_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,110 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/thrift/gen-go/zipkincore"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var s = makeNewSpan("203.0.113.10:1234", "service1", "avg", 123, 456, 0, true)
 | 
			
		||||
 | 
			
		||||
func TestNopCollector(t *testing.T) {
 | 
			
		||||
	c := NopCollector{}
 | 
			
		||||
	if err := c.Collect(s); err != nil {
 | 
			
		||||
		t.Error(err)
 | 
			
		||||
	}
 | 
			
		||||
	if err := c.Close(); err != nil {
 | 
			
		||||
		t.Error(err)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type stubCollector struct {
 | 
			
		||||
	errid     int
 | 
			
		||||
	collected bool
 | 
			
		||||
	closed    bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *stubCollector) Collect(*zipkincore.Span) error {
 | 
			
		||||
	c.collected = true
 | 
			
		||||
	if c.errid != 0 {
 | 
			
		||||
		return fmt.Errorf("error %d", c.errid)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (c *stubCollector) Close() error {
 | 
			
		||||
	c.closed = true
 | 
			
		||||
	if c.errid != 0 {
 | 
			
		||||
		return fmt.Errorf("error %d", c.errid)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMultiCollector(t *testing.T) {
 | 
			
		||||
	cs := MultiCollector{
 | 
			
		||||
		&stubCollector{errid: 1},
 | 
			
		||||
		&stubCollector{},
 | 
			
		||||
		&stubCollector{errid: 2},
 | 
			
		||||
	}
 | 
			
		||||
	err := cs.Collect(s)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Fatal("wanted error, got none")
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := "error 1; error 2", err.Error(); want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	collectionError := err.(CollectionError).GetErrors()
 | 
			
		||||
	if want, have := 3, len(collectionError); want != have {
 | 
			
		||||
		t.Fatalf("want %d, have %d", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := cs[0].Collect(s).Error(), collectionError[0].Error(); want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := cs[1].Collect(s), collectionError[1]; want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := cs[2].Collect(s).Error(), collectionError[2].Error(); want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, c := range cs {
 | 
			
		||||
		if !c.(*stubCollector).collected {
 | 
			
		||||
			t.Error("collect not called")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMultiCollectorClose(t *testing.T) {
 | 
			
		||||
	cs := MultiCollector{
 | 
			
		||||
		&stubCollector{errid: 1},
 | 
			
		||||
		&stubCollector{},
 | 
			
		||||
		&stubCollector{errid: 2},
 | 
			
		||||
	}
 | 
			
		||||
	err := cs.Close()
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		t.Fatal("wanted error, got none")
 | 
			
		||||
	}
 | 
			
		||||
	if want, have := "error 1; error 2", err.Error(); want != have {
 | 
			
		||||
		t.Errorf("want %q, have %q", want, have)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, c := range cs {
 | 
			
		||||
		if !c.(*stubCollector).closed {
 | 
			
		||||
			t.Error("close not called")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func makeNewSpan(hostPort, serviceName, methodName string, traceID, spanID, parentSpanID int64, debug bool) *zipkincore.Span {
 | 
			
		||||
	timestamp := time.Now().UnixNano() / 1e3
 | 
			
		||||
	return &zipkincore.Span{
 | 
			
		||||
		TraceID:   traceID,
 | 
			
		||||
		Name:      methodName,
 | 
			
		||||
		ID:        spanID,
 | 
			
		||||
		ParentID:  &parentSpanID,
 | 
			
		||||
		Debug:     debug,
 | 
			
		||||
		Timestamp: ×tamp,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										134
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/concurrency_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										134
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/concurrency_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,134 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"strings"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	opentracing "github.com/opentracing/opentracing-go"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const op = "test"
 | 
			
		||||
 | 
			
		||||
func TestDebugAssertSingleGoroutine(t *testing.T) {
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		NewInMemoryRecorder(),
 | 
			
		||||
		EnableSpanPool(true),
 | 
			
		||||
		DebugAssertSingleGoroutine(true),
 | 
			
		||||
		TraceID128Bit(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	sp := tracer.StartSpan(op)
 | 
			
		||||
	sp.LogEvent("something on my goroutine")
 | 
			
		||||
	wait := make(chan struct{})
 | 
			
		||||
	var panicked bool
 | 
			
		||||
	go func() {
 | 
			
		||||
		defer func() {
 | 
			
		||||
			if r := recover(); r != nil {
 | 
			
		||||
				_, panicked = r.(*errAssertionFailed)
 | 
			
		||||
			}
 | 
			
		||||
			close(wait)
 | 
			
		||||
		}()
 | 
			
		||||
		sp.LogEvent("something on your goroutine")
 | 
			
		||||
	}()
 | 
			
		||||
	<-wait
 | 
			
		||||
	if !panicked {
 | 
			
		||||
		t.Fatal("expected a panic")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestDebugAssertUseAfterFinish(t *testing.T) {
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		NewInMemoryRecorder(),
 | 
			
		||||
		EnableSpanPool(true),
 | 
			
		||||
		DebugAssertUseAfterFinish(true),
 | 
			
		||||
		TraceID128Bit(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	const msg = "I shall be finished"
 | 
			
		||||
	for _, double := range []bool{false, true} {
 | 
			
		||||
		sp := tracer.StartSpan(op)
 | 
			
		||||
		sp.Log(opentracing.LogData{Event: msg})
 | 
			
		||||
		if double {
 | 
			
		||||
			sp.Finish()
 | 
			
		||||
		}
 | 
			
		||||
		var panicked bool
 | 
			
		||||
		func() {
 | 
			
		||||
			defer func() {
 | 
			
		||||
				r := recover()
 | 
			
		||||
				var assertionErr error
 | 
			
		||||
				assertionErr, panicked = r.(*errAssertionFailed)
 | 
			
		||||
				if !panicked && r != nil {
 | 
			
		||||
					panic(r)
 | 
			
		||||
				}
 | 
			
		||||
				if panicked && !strings.Contains(assertionErr.Error(), msg) {
 | 
			
		||||
					t.Fatalf("debug output did not contain log message '%s': %+v", msg, assertionErr)
 | 
			
		||||
				}
 | 
			
		||||
				spImpl := sp.(*spanImpl)
 | 
			
		||||
				// The panic should leave the Mutex unlocked.
 | 
			
		||||
				spImpl.Mutex.Lock()
 | 
			
		||||
				spImpl.Mutex.Unlock()
 | 
			
		||||
			}()
 | 
			
		||||
			sp.Finish()
 | 
			
		||||
		}()
 | 
			
		||||
		if panicked != double {
 | 
			
		||||
			t.Errorf("finished double = %t, but panicked = %t", double, panicked)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestConcurrentUsage(t *testing.T) {
 | 
			
		||||
	var cr CountingRecorder
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		&cr,
 | 
			
		||||
		EnableSpanPool(true),
 | 
			
		||||
		DebugAssertSingleGoroutine(true),
 | 
			
		||||
		TraceID128Bit(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	var wg sync.WaitGroup
 | 
			
		||||
	const num = 100
 | 
			
		||||
	wg.Add(num)
 | 
			
		||||
	for i := 0; i < num; i++ {
 | 
			
		||||
		go func() {
 | 
			
		||||
			defer wg.Done()
 | 
			
		||||
			for j := 0; j < num; j++ {
 | 
			
		||||
				sp := tracer.StartSpan(op)
 | 
			
		||||
				sp.LogEvent("test event")
 | 
			
		||||
				sp.SetTag("foo", "bar")
 | 
			
		||||
				sp.SetBaggageItem("boo", "far")
 | 
			
		||||
				sp.SetOperationName("x")
 | 
			
		||||
				csp := tracer.StartSpan(
 | 
			
		||||
					"csp",
 | 
			
		||||
					opentracing.ChildOf(sp.Context()))
 | 
			
		||||
				csp.Finish()
 | 
			
		||||
				defer sp.Finish()
 | 
			
		||||
			}
 | 
			
		||||
		}()
 | 
			
		||||
	}
 | 
			
		||||
	wg.Wait()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestDisableSpanPool(t *testing.T) {
 | 
			
		||||
	var cr CountingRecorder
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		&cr,
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parent := tracer.StartSpan("parent")
 | 
			
		||||
	parent.Finish()
 | 
			
		||||
	// This shouldn't panic.
 | 
			
		||||
	child := tracer.StartSpan(
 | 
			
		||||
		"child",
 | 
			
		||||
		opentracing.ChildOf(parent.Context()))
 | 
			
		||||
	child.Finish()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										74
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/log-materializers_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										74
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/log-materializers_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,74 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/opentracing/opentracing-go/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type obj struct {
 | 
			
		||||
	a int
 | 
			
		||||
	b string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func getLogFields() []log.Field {
 | 
			
		||||
	lazy := func(fv log.Encoder) {
 | 
			
		||||
		fv.EmitString("lazy", "logger")
 | 
			
		||||
	}
 | 
			
		||||
	return []log.Field{
 | 
			
		||||
		log.Bool("bool", true),
 | 
			
		||||
		log.String("string", "value"),
 | 
			
		||||
		log.Error(errors.New("an error")),
 | 
			
		||||
		log.Float32("float32", 32.123),
 | 
			
		||||
		log.Float64("float64", 64.123),
 | 
			
		||||
		log.Int("int", 42),
 | 
			
		||||
		log.Int32("int32", 32),
 | 
			
		||||
		log.Int64("int64", 64),
 | 
			
		||||
		log.Uint32("uint32", 32),
 | 
			
		||||
		log.Uint64("uint64", 64),
 | 
			
		||||
		log.Object("object", obj{a: 42, b: "string"}),
 | 
			
		||||
		log.Lazy(lazy),
 | 
			
		||||
		log.String("event", "EventValue"),
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMaterializeWithJSON(t *testing.T) {
 | 
			
		||||
	logFields := getLogFields()
 | 
			
		||||
	want := `{"bool":"true","error":"an error","event":"EventValue","float32":"32.123001","float64":"64.123000","int":"42","int32":"32","int64":"64","lazy":"logger","object":"{a:42 b:string}","string":"value","uint32":"32","uint64":"64"}`
 | 
			
		||||
	have, err := MaterializeWithJSON(logFields)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("expected json string, got error %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if want != string(have) {
 | 
			
		||||
		t.Errorf("want:\n%s\nhave\n%s", want, have)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestMaterializeWithLogFmt(t *testing.T) {
 | 
			
		||||
	logFields := getLogFields()
 | 
			
		||||
	want := `bool=true string=value error="an error" float32=32.123 float64=64.123 int=42 int32=32 int64=64 uint32=32 uint64=64 object="unsupported value type" event=EventValue`
 | 
			
		||||
	have, err := MaterializeWithLogFmt(logFields)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("expected logfmt string, got error %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if want != string(have) {
 | 
			
		||||
		t.Errorf("want:\n%s\nhave\n%s", want, have)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestStrictZipkinMaterializer(t *testing.T) {
 | 
			
		||||
	logFields := getLogFields()
 | 
			
		||||
	want := `EventValue`
 | 
			
		||||
	have, err := StrictZipkinMaterializer(logFields)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("expected string got error %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
	if want != string(have) {
 | 
			
		||||
		t.Errorf("want:\n%s\nhave\n%s", want, have)
 | 
			
		||||
	}
 | 
			
		||||
	logFields = []log.Field{log.String("SomeKey", "SomeValue")}
 | 
			
		||||
	if _, err = StrictZipkinMaterializer(logFields); err == nil {
 | 
			
		||||
		t.Errorf("expected error: %s, got nil", errEventLogNotFound)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										171
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/propagation_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										171
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/propagation_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,171 +0,0 @@
 | 
			
		||||
package zipkintracer_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/davecgh/go-spew/spew"
 | 
			
		||||
	opentracing "github.com/opentracing/opentracing-go"
 | 
			
		||||
 | 
			
		||||
	zipkintracer "github.com/openzipkin/zipkin-go-opentracing"
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/flag"
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type verbatimCarrier struct {
 | 
			
		||||
	zipkintracer.SpanContext
 | 
			
		||||
	b map[string]string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ zipkintracer.DelegatingCarrier = &verbatimCarrier{}
 | 
			
		||||
 | 
			
		||||
func (vc *verbatimCarrier) SetBaggageItem(k, v string) {
 | 
			
		||||
	vc.b[k] = v
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (vc *verbatimCarrier) GetBaggage(f func(string, string)) {
 | 
			
		||||
	for k, v := range vc.b {
 | 
			
		||||
		f(k, v)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (vc *verbatimCarrier) SetState(tID types.TraceID, sID uint64, pID *uint64, sampled bool, flags flag.Flags) {
 | 
			
		||||
	vc.SpanContext = zipkintracer.SpanContext{
 | 
			
		||||
		TraceID:      tID,
 | 
			
		||||
		SpanID:       sID,
 | 
			
		||||
		ParentSpanID: pID,
 | 
			
		||||
		Sampled:      sampled,
 | 
			
		||||
		Flags:        flags,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (vc *verbatimCarrier) State() (traceID types.TraceID, spanID uint64, parentSpanID *uint64, sampled bool, flags flag.Flags) {
 | 
			
		||||
	return vc.SpanContext.TraceID, vc.SpanContext.SpanID, vc.SpanContext.ParentSpanID, vc.SpanContext.Sampled, vc.SpanContext.Flags
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSpanPropagator(t *testing.T) {
 | 
			
		||||
	const op = "test"
 | 
			
		||||
	recorder := zipkintracer.NewInMemoryRecorder()
 | 
			
		||||
	tracer, err := zipkintracer.NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		zipkintracer.ClientServerSameSpan(true),
 | 
			
		||||
		zipkintracer.DebugMode(true),
 | 
			
		||||
		zipkintracer.TraceID128Bit(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// create root span so propagation test will include parentSpanID
 | 
			
		||||
	ps := tracer.StartSpan("root")
 | 
			
		||||
	defer ps.Finish()
 | 
			
		||||
 | 
			
		||||
	// client side span with parent span 'ps'
 | 
			
		||||
	sp := tracer.StartSpan(op, opentracing.ChildOf(ps.Context()))
 | 
			
		||||
	sp.SetBaggageItem("foo", "bar")
 | 
			
		||||
	tmc := opentracing.HTTPHeadersCarrier(http.Header{})
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		typ, carrier interface{}
 | 
			
		||||
	}{
 | 
			
		||||
		{zipkintracer.Delegator, zipkintracer.DelegatingCarrier(&verbatimCarrier{b: map[string]string{}})},
 | 
			
		||||
		{opentracing.Binary, &bytes.Buffer{}},
 | 
			
		||||
		{opentracing.HTTPHeaders, tmc},
 | 
			
		||||
		{opentracing.TextMap, tmc},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i, test := range tests {
 | 
			
		||||
		if err := tracer.Inject(sp.Context(), test.typ, test.carrier); err != nil {
 | 
			
		||||
			t.Fatalf("%d: %v", i, err)
 | 
			
		||||
		}
 | 
			
		||||
		injectedContext, err := tracer.Extract(test.typ, test.carrier)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Fatalf("%d: %v", i, err)
 | 
			
		||||
		}
 | 
			
		||||
		child := tracer.StartSpan(
 | 
			
		||||
			op,
 | 
			
		||||
			opentracing.ChildOf(injectedContext))
 | 
			
		||||
		child.Finish()
 | 
			
		||||
	}
 | 
			
		||||
	sp.Finish()
 | 
			
		||||
 | 
			
		||||
	spans := recorder.GetSpans()
 | 
			
		||||
	if a, e := len(spans), len(tests)+1; a != e {
 | 
			
		||||
		t.Fatalf("expected %d spans, got %d", e, a)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// The last span is the original one.
 | 
			
		||||
	exp, spans := spans[len(spans)-1], spans[:len(spans)-1]
 | 
			
		||||
	exp.Duration = time.Duration(123)
 | 
			
		||||
	exp.Start = time.Time{}.Add(1)
 | 
			
		||||
 | 
			
		||||
	for i, sp := range spans {
 | 
			
		||||
		if a, e := *sp.Context.ParentSpanID, exp.Context.SpanID; a != e {
 | 
			
		||||
			t.Fatalf("%d: ParentSpanID %d does not match expectation %d", i, a, e)
 | 
			
		||||
		} else {
 | 
			
		||||
			// Prepare for comparison.
 | 
			
		||||
			sp.Context.Flags &= flag.Debug  // other flags then Debug should be discarded in comparison
 | 
			
		||||
			exp.Context.Flags &= flag.Debug // other flags then Debug should be discarded in comparison
 | 
			
		||||
			sp.Context.SpanID, sp.Context.ParentSpanID = exp.Context.SpanID, exp.Context.ParentSpanID
 | 
			
		||||
			sp.Duration, sp.Start = exp.Duration, exp.Start
 | 
			
		||||
		}
 | 
			
		||||
		if a, e := sp.Context.TraceID, exp.Context.TraceID; a != e {
 | 
			
		||||
			t.Fatalf("%d: TraceID changed from %d to %d", i, e, a)
 | 
			
		||||
		}
 | 
			
		||||
		if exp.Context.ParentSpanID == nil {
 | 
			
		||||
			t.Fatalf("%d: Expected a ParentSpanID, got nil", i)
 | 
			
		||||
		}
 | 
			
		||||
		if p, c := sp.Context.ParentSpanID, exp.Context.ParentSpanID; p != c {
 | 
			
		||||
			t.Fatalf("%d: ParentSpanID changed from %d to %d", i, p, c)
 | 
			
		||||
		}
 | 
			
		||||
		if !reflect.DeepEqual(exp, sp) {
 | 
			
		||||
			t.Fatalf("%d: wanted %+v, got %+v", i, spew.Sdump(exp), spew.Sdump(sp))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestInvalidCarrier(t *testing.T) {
 | 
			
		||||
	recorder := zipkintracer.NewInMemoryRecorder()
 | 
			
		||||
	tracer, err := zipkintracer.NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		zipkintracer.ClientServerSameSpan(true),
 | 
			
		||||
		zipkintracer.DebugMode(true),
 | 
			
		||||
		zipkintracer.TraceID128Bit(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if _, err = tracer.Extract(zipkintracer.Delegator, "invalid carrier"); err == nil {
 | 
			
		||||
		t.Fatalf("Expected: %s, got nil", opentracing.ErrInvalidCarrier)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestB3Hex(t *testing.T) {
 | 
			
		||||
	recorder := zipkintracer.NewInMemoryRecorder()
 | 
			
		||||
	tracer, err := zipkintracer.NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		zipkintracer.TraceID128Bit(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < 1000; i++ {
 | 
			
		||||
		headers := http.Header{}
 | 
			
		||||
		tmc := opentracing.HTTPHeadersCarrier(headers)
 | 
			
		||||
		span := tracer.StartSpan("dummy")
 | 
			
		||||
		if err := tracer.Inject(span.Context(), opentracing.TextMap, tmc); err != nil {
 | 
			
		||||
			t.Fatalf("Expected nil, got error %+v", err)
 | 
			
		||||
		}
 | 
			
		||||
		if want1, want2, have := 32, 16, len(headers["X-B3-Traceid"][0]); want1 != have && want2 != have {
 | 
			
		||||
			t.Errorf("X-B3-TraceId hex length expected %d or %d, got %d", want1, want2, have)
 | 
			
		||||
		}
 | 
			
		||||
		if want, have := 16, len(headers["X-B3-Spanid"][0]); want != have {
 | 
			
		||||
			t.Errorf("X-B3-SpanId hex length expected %d, got %d", want, have)
 | 
			
		||||
		}
 | 
			
		||||
		span.Finish()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/recorder_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/recorder_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,29 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"sync/atomic"
 | 
			
		||||
	"testing"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestInMemoryRecorderSpans(t *testing.T) {
 | 
			
		||||
	recorder := NewInMemoryRecorder()
 | 
			
		||||
	var apiRecorder SpanRecorder = recorder
 | 
			
		||||
	span := RawSpan{
 | 
			
		||||
		Context:   SpanContext{},
 | 
			
		||||
		Operation: "test-span",
 | 
			
		||||
		Start:     time.Now(),
 | 
			
		||||
		Duration:  -1,
 | 
			
		||||
	}
 | 
			
		||||
	apiRecorder.RecordSpan(span)
 | 
			
		||||
	assert.Equal(t, []RawSpan{span}, recorder.GetSpans())
 | 
			
		||||
	assert.Equal(t, []RawSpan{}, recorder.GetSampledSpans())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type CountingRecorder int32
 | 
			
		||||
 | 
			
		||||
func (c *CountingRecorder) RecordSpan(r RawSpan) {
 | 
			
		||||
	atomic.AddInt32((*int32)(c), 1)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										52
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/sample_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										52
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/sample_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,52 +0,0 @@
 | 
			
		||||
package zipkintracer_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	zipkin "github.com/openzipkin/zipkin-go-opentracing"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestBoundarySampler(t *testing.T) {
 | 
			
		||||
	type triple struct {
 | 
			
		||||
		id   uint64
 | 
			
		||||
		salt int64
 | 
			
		||||
		rate float64
 | 
			
		||||
	}
 | 
			
		||||
	for input, want := range map[triple]bool{
 | 
			
		||||
		{123, 456, 1.0}:    true,
 | 
			
		||||
		{123, 456, 999}:    true,
 | 
			
		||||
		{123, 456, 0.0}:    false,
 | 
			
		||||
		{123, 456, -42}:    false,
 | 
			
		||||
		{1229998, 0, 0.01}: false,
 | 
			
		||||
		{1229999, 0, 0.01}: false,
 | 
			
		||||
		{1230000, 0, 0.01}: true,
 | 
			
		||||
		{1230001, 0, 0.01}: true,
 | 
			
		||||
		{1230098, 0, 0.01}: true,
 | 
			
		||||
		{1230099, 0, 0.01}: true,
 | 
			
		||||
		{1230100, 0, 0.01}: false,
 | 
			
		||||
		{1230101, 0, 0.01}: false,
 | 
			
		||||
		{1, 9999999, 0.01}: false,
 | 
			
		||||
		{999, 0, 0.99}:     true,
 | 
			
		||||
		{9999, 0, 0.99}:    false,
 | 
			
		||||
	} {
 | 
			
		||||
		sampler := zipkin.NewBoundarySampler(input.rate, input.salt)
 | 
			
		||||
		if have := sampler(input.id); want != have {
 | 
			
		||||
			t.Errorf("%#+v: want %v, have %v", input, want, have)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestCountingSampler(t *testing.T) {
 | 
			
		||||
	for n := 1; n < 100; n++ {
 | 
			
		||||
		sampler := zipkin.NewCountingSampler(float64(n) / 100)
 | 
			
		||||
		found := 0
 | 
			
		||||
		for i := 0; i < 100; i++ {
 | 
			
		||||
			if sampler(1) {
 | 
			
		||||
				found++
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if found != n {
 | 
			
		||||
			t.Errorf("want %d, have %d\n", n, found)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										252
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/span_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										252
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/span_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,252 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	opentracing "github.com/opentracing/opentracing-go"
 | 
			
		||||
	"github.com/opentracing/opentracing-go/ext"
 | 
			
		||||
	"github.com/opentracing/opentracing-go/log"
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestSpan_Baggage(t *testing.T) {
 | 
			
		||||
	recorder := NewInMemoryRecorder()
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		WithSampler(func(_ uint64) bool { return true }),
 | 
			
		||||
		WithLogger(&nopLogger{}),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	span := tracer.StartSpan("x")
 | 
			
		||||
	span.SetBaggageItem("x", "y")
 | 
			
		||||
	assert.Equal(t, "y", span.BaggageItem("x"))
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	spans := recorder.GetSpans()
 | 
			
		||||
	assert.Equal(t, 1, len(spans))
 | 
			
		||||
	assert.Equal(t, map[string]string{"x": "y"}, spans[0].Context.Baggage)
 | 
			
		||||
 | 
			
		||||
	recorder.Reset()
 | 
			
		||||
	span = tracer.StartSpan("x")
 | 
			
		||||
	span.SetBaggageItem("x", "y")
 | 
			
		||||
	baggage := make(map[string]string)
 | 
			
		||||
	span.Context().ForeachBaggageItem(func(k, v string) bool {
 | 
			
		||||
		baggage[k] = v
 | 
			
		||||
		return true
 | 
			
		||||
	})
 | 
			
		||||
	assert.Equal(t, map[string]string{"x": "y"}, baggage)
 | 
			
		||||
 | 
			
		||||
	span.SetBaggageItem("a", "b")
 | 
			
		||||
	baggage = make(map[string]string)
 | 
			
		||||
	span.Context().ForeachBaggageItem(func(k, v string) bool {
 | 
			
		||||
		baggage[k] = v
 | 
			
		||||
		return false // exit early
 | 
			
		||||
	})
 | 
			
		||||
	assert.Equal(t, 1, len(baggage))
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	spans = recorder.GetSpans()
 | 
			
		||||
	assert.Equal(t, 1, len(spans))
 | 
			
		||||
	assert.Equal(t, 2, len(spans[0].Context.Baggage))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSpan_Sampling(t *testing.T) {
 | 
			
		||||
	recorder := NewInMemoryRecorder()
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		WithSampler(func(_ uint64) bool { return true }),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	span := tracer.StartSpan("x")
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	assert.Equal(t, 1, len(recorder.GetSampledSpans()), "by default span should be sampled")
 | 
			
		||||
 | 
			
		||||
	recorder.Reset()
 | 
			
		||||
	span = tracer.StartSpan("x")
 | 
			
		||||
	ext.SamplingPriority.Set(span, 0)
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	assert.Equal(t, 0, len(recorder.GetSampledSpans()), "SamplingPriority=0 should turn off sampling")
 | 
			
		||||
 | 
			
		||||
	tracer, err = NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		WithSampler(func(_ uint64) bool { return false }),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	recorder.Reset()
 | 
			
		||||
	span = tracer.StartSpan("x")
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	assert.Equal(t, 0, len(recorder.GetSampledSpans()), "by default span should not be sampled")
 | 
			
		||||
 | 
			
		||||
	recorder.Reset()
 | 
			
		||||
	span = tracer.StartSpan("x")
 | 
			
		||||
	ext.SamplingPriority.Set(span, 1)
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	assert.Equal(t, 1, len(recorder.GetSampledSpans()), "SamplingPriority=1 should turn on sampling")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSpan_SingleLoggedTaggedSpan(t *testing.T) {
 | 
			
		||||
	recorder := NewInMemoryRecorder()
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		WithSampler(func(_ uint64) bool { return true }),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	span := tracer.StartSpan("x")
 | 
			
		||||
	span.LogEventWithPayload("event", "payload")
 | 
			
		||||
	span.LogFields(log.String("key_str", "value"), log.Uint32("32bit", 4294967295))
 | 
			
		||||
	span.SetTag("tag", "value")
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	spans := recorder.GetSpans()
 | 
			
		||||
	assert.Equal(t, 1, len(spans))
 | 
			
		||||
	assert.Equal(t, "x", spans[0].Operation)
 | 
			
		||||
	assert.Equal(t, 2, len(spans[0].Logs))
 | 
			
		||||
	assert.Equal(t, opentracing.Tags{"tag": "value"}, spans[0].Tags)
 | 
			
		||||
	fv := NewLogFieldValidator(t, spans[0].Logs[0].Fields)
 | 
			
		||||
	fv.
 | 
			
		||||
		ExpectNextFieldEquals("event", reflect.String, "event").
 | 
			
		||||
		ExpectNextFieldEquals("payload", reflect.Interface, "payload")
 | 
			
		||||
	fv = NewLogFieldValidator(t, spans[0].Logs[1].Fields)
 | 
			
		||||
	fv.
 | 
			
		||||
		ExpectNextFieldEquals("key_str", reflect.String, "value").
 | 
			
		||||
		ExpectNextFieldEquals("32bit", reflect.Uint32, "4294967295")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSpan_TrimUnsampledSpans(t *testing.T) {
 | 
			
		||||
	recorder := NewInMemoryRecorder()
 | 
			
		||||
	// Tracer that trims only unsampled but always samples
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		WithSampler(func(_ uint64) bool { return true }),
 | 
			
		||||
		TrimUnsampledSpans(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	span := tracer.StartSpan("x")
 | 
			
		||||
	span.LogFields(log.String("key_str", "value"), log.Uint32("32bit", 4294967295))
 | 
			
		||||
	span.SetTag("tag", "value")
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	spans := recorder.GetSpans()
 | 
			
		||||
	assert.Equal(t, 1, len(spans))
 | 
			
		||||
	assert.Equal(t, 1, len(spans[0].Logs))
 | 
			
		||||
	assert.Equal(t, opentracing.Tags{"tag": "value"}, spans[0].Tags)
 | 
			
		||||
	fv := NewLogFieldValidator(t, spans[0].Logs[0].Fields)
 | 
			
		||||
	fv.
 | 
			
		||||
		ExpectNextFieldEquals("key_str", reflect.String, "value").
 | 
			
		||||
		ExpectNextFieldEquals("32bit", reflect.Uint32, "4294967295")
 | 
			
		||||
 | 
			
		||||
	recorder.Reset()
 | 
			
		||||
	// Tracer that trims only unsampled and never samples
 | 
			
		||||
	tracer, err = NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		WithSampler(func(_ uint64) bool { return false }),
 | 
			
		||||
		TrimUnsampledSpans(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	span = tracer.StartSpan("x")
 | 
			
		||||
	span.LogFields(log.String("key_str", "value"), log.Uint32("32bit", 4294967295))
 | 
			
		||||
	span.SetTag("tag", "value")
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	spans = recorder.GetSpans()
 | 
			
		||||
	assert.Equal(t, 1, len(spans))
 | 
			
		||||
	assert.Equal(t, 0, len(spans[0].Logs))
 | 
			
		||||
	assert.Equal(t, 0, len(spans[0].Tags))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSpan_DropAllLogs(t *testing.T) {
 | 
			
		||||
	recorder := NewInMemoryRecorder()
 | 
			
		||||
	// Tracer that drops logs
 | 
			
		||||
	tracer, err := NewTracer(
 | 
			
		||||
		recorder,
 | 
			
		||||
		WithSampler(func(_ uint64) bool { return true }),
 | 
			
		||||
		DropAllLogs(true),
 | 
			
		||||
	)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	span := tracer.StartSpan("x")
 | 
			
		||||
	span.LogFields(log.String("key_str", "value"), log.Uint32("32bit", 4294967295))
 | 
			
		||||
	span.SetTag("tag", "value")
 | 
			
		||||
	span.Finish()
 | 
			
		||||
	spans := recorder.GetSpans()
 | 
			
		||||
	assert.Equal(t, 1, len(spans))
 | 
			
		||||
	assert.Equal(t, "x", spans[0].Operation)
 | 
			
		||||
	assert.Equal(t, opentracing.Tags{"tag": "value"}, spans[0].Tags)
 | 
			
		||||
	// Only logs are dropped
 | 
			
		||||
	assert.Equal(t, 0, len(spans[0].Logs))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestSpan_MaxLogSperSpan(t *testing.T) {
 | 
			
		||||
	for _, limit := range []int{5, 10, 15, 20, 30, 40, 50} {
 | 
			
		||||
		for _, numLogs := range []int{5, 10, 15, 20, 30, 40, 50, 60, 70, 80} {
 | 
			
		||||
			recorder := NewInMemoryRecorder()
 | 
			
		||||
			// Tracer that only retains the last <limit> logs.
 | 
			
		||||
			tracer, err := NewTracer(
 | 
			
		||||
				recorder,
 | 
			
		||||
				WithSampler(func(_ uint64) bool { return true }),
 | 
			
		||||
				WithMaxLogsPerSpan(limit),
 | 
			
		||||
			)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				t.Fatalf("Unable to create Tracer: %+v", err)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			span := tracer.StartSpan("x")
 | 
			
		||||
			for i := 0; i < numLogs; i++ {
 | 
			
		||||
				span.LogKV("eventIdx", i)
 | 
			
		||||
			}
 | 
			
		||||
			span.Finish()
 | 
			
		||||
 | 
			
		||||
			spans := recorder.GetSpans()
 | 
			
		||||
			assert.Equal(t, 1, len(spans))
 | 
			
		||||
			assert.Equal(t, "x", spans[0].Operation)
 | 
			
		||||
 | 
			
		||||
			logs := spans[0].Logs
 | 
			
		||||
			var firstLogs, lastLogs []opentracing.LogRecord
 | 
			
		||||
			if numLogs <= limit {
 | 
			
		||||
				assert.Equal(t, numLogs, len(logs))
 | 
			
		||||
				firstLogs = logs
 | 
			
		||||
			} else {
 | 
			
		||||
				assert.Equal(t, limit, len(logs))
 | 
			
		||||
				if len(logs) > 0 {
 | 
			
		||||
					numOld := (len(logs) - 1) / 2
 | 
			
		||||
					firstLogs = logs[:numOld]
 | 
			
		||||
					lastLogs = logs[numOld+1:]
 | 
			
		||||
 | 
			
		||||
					fv := NewLogFieldValidator(t, logs[numOld].Fields)
 | 
			
		||||
					fv = fv.ExpectNextFieldEquals("event", reflect.String, "dropped Span logs")
 | 
			
		||||
					fv = fv.ExpectNextFieldEquals(
 | 
			
		||||
						"dropped_log_count", reflect.Int, strconv.Itoa(numLogs-limit+1),
 | 
			
		||||
					)
 | 
			
		||||
					fv.ExpectNextFieldEquals("component", reflect.String, "zipkintracer")
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for i, lr := range firstLogs {
 | 
			
		||||
				fv := NewLogFieldValidator(t, lr.Fields)
 | 
			
		||||
				fv.ExpectNextFieldEquals("eventIdx", reflect.Int, strconv.Itoa(i))
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			for i, lr := range lastLogs {
 | 
			
		||||
				fv := NewLogFieldValidator(t, lr.Fields)
 | 
			
		||||
				fv.ExpectNextFieldEquals("eventIdx", reflect.Int, strconv.Itoa(numLogs-len(lastLogs)+i))
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										125
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/testutil_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										125
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/testutil_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,125 +0,0 @@
 | 
			
		||||
package zipkintracer
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/opentracing/opentracing-go/log"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// LogFieldValidator facilitates testing of Span.Log*() implementations.
 | 
			
		||||
//
 | 
			
		||||
// Usage:
 | 
			
		||||
//
 | 
			
		||||
//     fv := log.NewLogFieldValidator(t, someLogStructure.Fields)
 | 
			
		||||
//     fv.
 | 
			
		||||
//         ExpectNextFieldEquals("key1", reflect.String, "some string value").
 | 
			
		||||
//         ExpectNextFieldEquals("key2", reflect.Uint32, "4294967295")
 | 
			
		||||
//
 | 
			
		||||
// LogFieldValidator satisfies the log.Encoder interface and thus is able to
 | 
			
		||||
// marshal log.Field instances (which it takes advantage of internally).
 | 
			
		||||
type LogFieldValidator struct {
 | 
			
		||||
	t               *testing.T
 | 
			
		||||
	fieldIdx        int
 | 
			
		||||
	fields          []log.Field
 | 
			
		||||
	nextKey         string
 | 
			
		||||
	nextKind        reflect.Kind
 | 
			
		||||
	nextValAsString string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewLogFieldValidator returns a new validator that will test the contents of
 | 
			
		||||
// `fields`.
 | 
			
		||||
func NewLogFieldValidator(t *testing.T, fields []log.Field) *LogFieldValidator {
 | 
			
		||||
	return &LogFieldValidator{
 | 
			
		||||
		t:      t,
 | 
			
		||||
		fields: fields,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExpectNextFieldEquals facilitates a fluent way of testing the contents
 | 
			
		||||
// []Field slices.
 | 
			
		||||
func (fv *LogFieldValidator) ExpectNextFieldEquals(key string, kind reflect.Kind, valAsString string) *LogFieldValidator {
 | 
			
		||||
	if len(fv.fields) < fv.fieldIdx {
 | 
			
		||||
		_, file, line, _ := runtime.Caller(1)
 | 
			
		||||
		fv.t.Errorf("%s:%d Expecting more than the %v Fields we have", file, line, len(fv.fields))
 | 
			
		||||
	}
 | 
			
		||||
	fv.nextKey = key
 | 
			
		||||
	fv.nextKind = kind
 | 
			
		||||
	fv.nextValAsString = valAsString
 | 
			
		||||
	fv.fields[fv.fieldIdx].Marshal(fv)
 | 
			
		||||
	fv.fieldIdx++
 | 
			
		||||
	return fv
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitString satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitString(key, value string) {
 | 
			
		||||
	fv.validateNextField(key, reflect.String, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitBool satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitBool(key string, value bool) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Bool, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitInt satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitInt(key string, value int) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Int, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitInt32 satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitInt32(key string, value int32) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Int32, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitInt64 satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitInt64(key string, value int64) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Int64, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitUint32 satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitUint32(key string, value uint32) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Uint32, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitUint64 satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitUint64(key string, value uint64) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Uint64, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitFloat32 satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitFloat32(key string, value float32) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Float32, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitFloat64 satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitFloat64(key string, value float64) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Float64, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitObject satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitObject(key string, value interface{}) {
 | 
			
		||||
	fv.validateNextField(key, reflect.Interface, value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// EmitLazyLogger satisfies the Encoder interface
 | 
			
		||||
func (fv *LogFieldValidator) EmitLazyLogger(value log.LazyLogger) {
 | 
			
		||||
	fv.t.Error("Test infrastructure does not support EmitLazyLogger yet")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (fv *LogFieldValidator) validateNextField(key string, actualKind reflect.Kind, value interface{}) {
 | 
			
		||||
	// Reference the ExpectNextField caller in error messages.
 | 
			
		||||
	_, file, line, _ := runtime.Caller(4)
 | 
			
		||||
	if fv.nextKey != key {
 | 
			
		||||
		fv.t.Errorf("%s:%d Bad key: expected %q, found %q", file, line, fv.nextKey, key)
 | 
			
		||||
	}
 | 
			
		||||
	if fv.nextKind != actualKind {
 | 
			
		||||
		fv.t.Errorf("%s:%d Bad reflect.Kind: expected %v, found %v", file, line, fv.nextKind, actualKind)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	if fv.nextValAsString != fmt.Sprint(value) {
 | 
			
		||||
		fv.t.Errorf("%s:%d Bad value: expected %q, found %q", file, line, fv.nextValAsString, fmt.Sprint(value))
 | 
			
		||||
	}
 | 
			
		||||
	// All good.
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										13
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/types/traceid_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/types/traceid_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,13 +0,0 @@
 | 
			
		||||
package types
 | 
			
		||||
 | 
			
		||||
import "testing"
 | 
			
		||||
 | 
			
		||||
func TestTraceID(t *testing.T) {
 | 
			
		||||
 | 
			
		||||
	traceID := TraceID{High: 1, Low: 2}
 | 
			
		||||
 | 
			
		||||
	if len(traceID.ToHex()) != 32 {
 | 
			
		||||
		t.Errorf("Expected zero-padded TraceID to have 32 characters")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										50
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/wire/carrier_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										50
									
								
								vendor/github.com/openzipkin/zipkin-go-opentracing/wire/carrier_test.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,50 +0,0 @@
 | 
			
		||||
package wire_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing"
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/flag"
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/types"
 | 
			
		||||
	"github.com/openzipkin/zipkin-go-opentracing/wire"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestProtobufCarrier(t *testing.T) {
 | 
			
		||||
	var carrier zipkintracer.DelegatingCarrier = &wire.ProtobufCarrier{}
 | 
			
		||||
 | 
			
		||||
	traceID := types.TraceID{High: 1, Low: 2}
 | 
			
		||||
	var spanID, parentSpanID uint64 = 3, 0
 | 
			
		||||
	sampled := true
 | 
			
		||||
	flags := flag.Debug | flag.Sampled | flag.SamplingSet
 | 
			
		||||
	baggageKey, expVal := "key1", "val1"
 | 
			
		||||
 | 
			
		||||
	carrier.SetState(traceID, spanID, &parentSpanID, sampled, flags)
 | 
			
		||||
	carrier.SetBaggageItem(baggageKey, expVal)
 | 
			
		||||
	gotTraceID, gotSpanID, gotParentSpanId, gotSampled, gotFlags := carrier.State()
 | 
			
		||||
 | 
			
		||||
	if gotParentSpanId == nil {
 | 
			
		||||
		t.Errorf("Expected a valid parentSpanID of 0 got nil (no parent)")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if gotFlags&flag.IsRoot == flag.IsRoot {
 | 
			
		||||
		t.Errorf("Expected a child span with a valid parent span with id 0 got IsRoot flag")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if traceID != gotTraceID || spanID != gotSpanID || parentSpanID != *gotParentSpanId || sampled != gotSampled || flags != gotFlags {
 | 
			
		||||
		t.Errorf("Wanted state %d %d %d %t %d, got %d %d %d %t %d", spanID, traceID, parentSpanID, sampled, flags, gotTraceID, gotSpanID, *gotParentSpanId, gotSampled, gotFlags)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	gotBaggage := map[string]string{}
 | 
			
		||||
	f := func(k, v string) {
 | 
			
		||||
		gotBaggage[k] = v
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	carrier.GetBaggage(f)
 | 
			
		||||
	value, ok := gotBaggage[baggageKey]
 | 
			
		||||
	if !ok {
 | 
			
		||||
		t.Errorf("Expected baggage item %s to exist", baggageKey)
 | 
			
		||||
	}
 | 
			
		||||
	if value != expVal {
 | 
			
		||||
		t.Errorf("Expected key %s to be %s, got %s", baggageKey, expVal, value)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user