1- // +build go1.9
2-
31package grpc_test
42
53import (
@@ -15,13 +13,23 @@ import (
1513 "google.golang.org/grpc/metadata"
1614 "google.golang.org/grpc/status"
1715
16+ "github.com/openzipkin/zipkin-go"
17+ zipkingrpc "github.com/openzipkin/zipkin-go/middleware/grpc"
1818 "github.com/openzipkin/zipkin-go/model"
19+ "github.com/openzipkin/zipkin-go/propagation/b3"
1920 service "github.com/openzipkin/zipkin-go/proto/testing"
21+ "github.com/openzipkin/zipkin-go/reporter/recorder"
2022)
2123
2224var (
25+ serverIdGenerator * sequentialIdGenerator
26+ serverReporter * recorder.ReporterRecorder
27+
2328 server * grpc.Server
2429 serverAddr string
30+
31+ customServer * grpc.Server
32+ customServerAddr string
2533)
2634
2735func TestGrpc (t * testing.T ) {
@@ -30,28 +38,53 @@ func TestGrpc(t *testing.T) {
3038}
3139
3240var _ = ginkgo .BeforeSuite (func () {
41+ var err error
42+
43+ serverReporter = recorder .NewReporter ()
44+ ep , _ := zipkin .NewEndpoint ("grpcServer" , "" )
45+ serverIdGenerator = newSequentialIdGenerator (0x1000000 )
46+ tracer , err := zipkin .NewTracer (
47+ serverReporter , zipkin .WithLocalEndpoint (ep ), zipkin .WithIDGenerator (serverIdGenerator ), zipkin .WithSharedSpans (false ))
48+
3349 lis , err := net .Listen ("tcp" , ":0" )
3450 gomega .Expect (lis , err ).ToNot (gomega .BeNil (), "failed to listen to tcp port" )
3551
36- server = grpc .NewServer ()
52+ server = grpc .NewServer (grpc . StatsHandler ( zipkingrpc . NewServerHandler ( tracer )) )
3753 service .RegisterHelloServiceServer (server , & TestHelloService {})
3854 go func () {
3955 _ = server .Serve (lis )
4056 }()
4157 serverAddr = lis .Addr ().String ()
58+
59+ customLis , err := net .Listen ("tcp" , ":0" )
60+ gomega .Expect (customLis , err ).ToNot (gomega .BeNil (), "failed to listen to tcp port" )
61+
62+ tracer , err = zipkin .NewTracer (
63+ serverReporter , zipkin .WithLocalEndpoint (ep ), zipkin .WithIDGenerator (serverIdGenerator ), zipkin .WithSharedSpans (true ))
64+ customServer = grpc .NewServer (grpc .StatsHandler (zipkingrpc .NewServerHandler (
65+ tracer ,
66+ zipkingrpc .ServerTags (map [string ]string {"default" : "tag" }))))
67+ service .RegisterHelloServiceServer (customServer , & TestHelloService {})
68+ go func () {
69+ _ = customServer .Serve (customLis )
70+ }()
71+ customServerAddr = customLis .Addr ().String ()
4272})
4373
4474var _ = ginkgo .AfterSuite (func () {
4575 server .Stop ()
76+ customServer .Stop ()
77+ _ = serverReporter .Close ()
4678})
4779
4880type sequentialIdGenerator struct {
4981 nextTraceId uint64
5082 nextSpanId uint64
83+ start uint64
5184}
5285
53- func newSequentialIdGenerator () * sequentialIdGenerator {
54- return & sequentialIdGenerator {1 , 1 }
86+ func newSequentialIdGenerator (start uint64 ) * sequentialIdGenerator {
87+ return & sequentialIdGenerator {start , start , start }
5588}
5689
5790func (g * sequentialIdGenerator ) SpanID (traceID model.TraceID ) model.ID {
@@ -69,27 +102,43 @@ func (g *sequentialIdGenerator) TraceID() model.TraceID {
69102 return id
70103}
71104
105+ func (g * sequentialIdGenerator ) reset () {
106+ g .nextTraceId = g .start
107+ g .nextSpanId = g .start
108+ }
109+
72110type TestHelloService struct {}
73111
74112func (s * TestHelloService ) Hello (ctx context.Context , req * service.HelloRequest ) (* service.HelloResponse , error ) {
75113 if req .Payload == "fail" {
76114 return nil , status .Error (codes .Aborted , "fail" )
77115 }
78116
117+ resp := & service.HelloResponse {
118+ Payload : "World" ,
119+ Metadata : map [string ]string {},
120+ SpanContext : map [string ]string {},
121+ }
122+
79123 md , ok := metadata .FromIncomingContext (ctx )
80124 if ! ok {
81125 return nil , errors .New ("could not parse incoming metadata" )
82126 }
83127
84- resp := & service.HelloResponse {
85- Payload : "World" ,
86- Metadata : map [string ]string {},
87- }
88-
89128 for k := range md {
90129 // Just append the first value for a key for simplicity since we don't use multi-value headers.
91130 resp .GetMetadata ()[k ] = md [k ][0 ]
92131 }
93132
133+ span := zipkin .SpanFromContext (ctx )
134+ if span != nil {
135+ spanCtx := span .Context ()
136+ resp .GetSpanContext ()[b3 .SpanID ] = spanCtx .ID .String ()
137+ resp .GetSpanContext ()[b3 .TraceID ] = spanCtx .TraceID .String ()
138+ if spanCtx .ParentID != nil {
139+ resp .GetSpanContext ()[b3 .ParentSpanID ] = spanCtx .ParentID .String ()
140+ }
141+ }
142+
94143 return resp , nil
95144}
0 commit comments