Skip to content

Commit c4f4e7f

Browse files
committed
add tracer zipkin
1 parent a44f56c commit c4f4e7f

File tree

13 files changed

+375
-292
lines changed

13 files changed

+375
-292
lines changed

README.md

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ traceandtrace-go is go tracing lib. It integrate multi tracer such as jeager,zip
1313
- support http and gRPC (or both) tracing
1414
- support sampler, sampler type and collector env setting
1515

16+
## Version introduction
17+
- v1.0.3 support jeager and zipkin
18+
1619
## API
1720
[godoc](https://pkg.go.dev/github.com/codeandcode0x/traceandtrace-go)
1821

@@ -22,11 +25,12 @@ traceandtrace-go is go tracing lib. It integrate multi tracer such as jeager,zip
2225
| ---- | ---- |
2326
| TRACE_SAMPLER_TYPE | const/probabilistic/ratelimiting/remote |
2427
| TRACE_SAMPLER_PARAM | 0-1 |
25-
| TRACE_ENDPOINT | http://localhost:14268/api/traces |
26-
| TRACE_AGENT_HOST | localhost:6831 |
27-
| TRACE_REPORTER_LOG_SPANS | false/ture |
28+
| TRACE_ENDPOINT | http://localhost:14268/api/traces (jaeger) or http://localhost:9411/api/v2/spans (zipkin) |
29+
| TRACE_AGENT_HOST | localhost:6831 (jaeger) |
30+
| TRACE_REPORTER_LOG_SPANS | false or ture |
31+
| TRACE_TYPE | jaeger or zipkin |
2832

29-
## Ext field
33+
## Jaeger Ext field
3034
spanKind <br>
3135
component <br>
3236
samplingPriority <br>
@@ -45,23 +49,27 @@ httpMethod <br>
4549
dbUser <br>
4650
messageBusDestination <br>
4751

48-
## quick start
52+
## Quick Start
4953

50-
### start jaeger
54+
### Start Jaeger
5155

5256
```shell
53-
docker run \
57+
docker run -d --name jaeger \
58+
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
5459
-p 5775:5775/udp \
55-
-p 16686:16686 \
5660
-p 6831:6831/udp \
5761
-p 6832:6832/udp \
5862
-p 5778:5778 \
63+
-p 16686:16686 \
5964
-p 14268:14268 \
65+
-p 14250:14250 \
66+
-p 9411:9411 \
6067
ethansmart-docker.pkg.coding.net/istioalltime/roandocker/jaegertracing-all-in-one:1.22.0
6168

69+
6270
```
6371

64-
### import package
72+
### Import Package
6573

6674
```shell
6775
go get github.com/codeandcode0x/traceandtrace-go
@@ -70,14 +78,14 @@ go get github.com/codeandcode0x/traceandtrace-go
7078
### HTTP tracing
7179

7280
Create a trace on the http request method side.
73-
![http to grpc client](wiki/imgs/http_client.jpg)
81+
![http to grpc client](wiki/imgs/http_client_2.jpg)
7482
tags are map[string]string type, you can pass logs k-v, tag and field.
7583

7684

7785
### RPC tracing
7886
Create a trace on the rpc request method side
7987

80-
- **client**
88+
**client**
8189

8290
```go
8391
import (
@@ -94,11 +102,11 @@ if err != nil {
94102
}
95103
...
96104
```
97-
- **server**
105+
**server**
98106

99107
```go
100108
import (
101-
tracing "github.com/codeandcode0x/traceandtrace-go/wrapper/rpc"
109+
tracing "github.com/codeandcode0x/traceandtrace-go"
102110
)
103111

104112
//No need to request other rpc services
@@ -135,9 +143,9 @@ To call gRPC on the http server side, you need to add the parent context to the
135143
- By context WithCancel() create sub-coroutine sessions and manage coroutine tasks ;
136144
- every context will carry related data of parent trace and child span ;
137145

138-
![goroutine session](https://images2018.cnblogs.com/blog/1048291/201806/1048291-20180629074859717-1555813847.png)
146+
![goroutine session](wiki/imgs/goroutine.png)
139147

140-
### trace job control
148+
### Trace Job Control
141149
start and end trace job
142150

143151
```go

example/grpc/grpcClient.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ func main() {
1919
func gRPCExample() {
2020
address := "localhost:22530"
2121
defaultName := "ethan"
22-
rpcOption, closer := tracing.AddRpcClientTracing("RpcClientExample")
22+
rpcOption, closer := tracing.AddRpcClientTracing(
23+
"RpcClientExample",
24+
map[string]string{"version": "v1"})
2325
defer closer.Close()
2426

2527
// Set up a connection to the server.

example/grpc/grpcServer.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloRe
3232
}
3333

3434
func main() {
35-
rpcOption, closer, _ := tracing.AddRpcServerTracing("RpcServer")
35+
rpcOption, closer, _ := tracing.AddRpcServerTracing(
36+
"RpcServer",
37+
map[string]string{"version": "v1"})
3638
defer closer.Close()
3739

3840
lis, err := net.Listen("tcp", port)

example/http/httpClient.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,12 @@ func httpClient() {
2020
httpClient := &http.Client{}
2121
r, _ := http.NewRequest("GET", httpTogRPCSrcUrl, nil)
2222
// set tracing
23-
_, cancel := tracing.AddHttpTracing("HttpClent", "rpc/tracing GET", r.Header, map[string]string{"version": "v1"})
23+
_, cancel := tracing.AddHttpTracing(
24+
"HttpClient",
25+
"/rpc/tracing GET", r.Header,
26+
map[string]string{"version": "v1"})
27+
// or map[string]string{"traceType": "zipkin", "version": "v1"}), traceType : jaeger (default) or zipkin
28+
// or export TRACE_TYPE=zipkin or jaeger
2429
defer cancel()
2530
// send reqeust
2631
response, _ := httpClient.Do(r)

example/http/httpServer.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"time"
1010

1111
tracing "github.com/codeandcode0x/traceandtrace-go"
12-
pb "github.com/codeandcode0x/traceandtrace-go/example/helloworld/proto"
12+
pb "github.com/codeandcode0x/traceandtrace-go/example/protos/helloworld"
1313
"google.golang.org/grpc"
1414
)
1515

@@ -20,8 +20,10 @@ func main() {
2020
// http to gRPC
2121
func httpServer() {
2222
http.HandleFunc("/rpc/tracing", func(w http.ResponseWriter, r *http.Request) {
23-
log.Println(".............. header ", r.Header)
24-
pctx, cancel := tracing.AddHttpTracing("HttpServer", "/rpc/tracing GET", r.Header, map[string]string{"version": "v1"})
23+
pctx, cancel := tracing.AddHttpTracing(
24+
"HttpServer",
25+
"/rpc/tracing GET", r.Header,
26+
map[string]string{"version": "v1"})
2527
defer cancel()
2628
// rpc tracing
2729
result := RpcClient(pctx)
@@ -33,7 +35,9 @@ func httpServer() {
3335

3436
//grpc request
3537
func RpcClient(ptx context.Context) string {
36-
rpcOption, closer := tracing.AddRpcClientTracing("RpcClient")
38+
rpcOption, closer := tracing.AddRpcClientTracing(
39+
"RpcClient",
40+
map[string]string{"version": "v1"})
3741
defer closer.Close()
3842
address := "localhost:22530"
3943
conn, err := grpc.Dial(address, grpc.WithInsecure(), rpcOption)

reporter_jobs.go

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"io"
2323
"log"
2424
"net/http"
25+
"os"
26+
"strings"
2527

2628
tracing "github.com/codeandcode0x/traceandtrace-go/tracer"
2729
opentracing "github.com/opentracing/opentracing-go"
@@ -52,26 +54,46 @@ func GenerateTracingJobs(pch chan<- context.Context, parent context.Context, svc
5254
// do trace reporter
5355
func doTask(ch chan context.Context, parent context.Context,
5456
svc, spanName string, header http.Header, tags map[string]string, traceType string) {
55-
//定义 tracer, closer
57+
//define tracer, closer
5658
var tracer opentracing.Tracer
5759
var closer io.Closer
5860
var ctx context.Context
61+
//init tracer
62+
tracer, closer = SelectInitTracer(svc, map[string]string{"traceType": traceType})
63+
ctx = tracing.AddHttpTracer(svc, spanName, parent, header, tracer, tags)
64+
//close
65+
defer closer.Close()
66+
ch <- ctx
67+
}
68+
69+
//select init tracer
70+
func SelectInitTracer(svc string, param ...map[string]string) (opentracing.Tracer, io.Closer) {
71+
var tracer opentracing.Tracer
72+
var closer io.Closer
73+
// get tracer type
74+
traceType := JAEGER_TRACER
75+
if tType := os.Getenv("TRACE_TYPE"); tType != "" {
76+
traceType = tType
77+
} else if len(param) > 0 {
78+
if _, exist := param[0]["traceType"]; exist {
79+
traceType = strings.ToLower(param[0]["traceType"])
80+
}
81+
}
82+
5983
// select reporter type
6084
switch traceType {
6185
case "jaeger":
6286
tracer, closer = tracing.InitJaeger(svc)
63-
ctx = tracing.AddTracer(svc, spanName, parent, header, tracer, tags)
6487
break
6588
case "zipkin":
66-
log.Println("create zipkin tracing job")
89+
tracer, closer = tracing.InitZipkin(svc)
6790
break
6891
case "skywalking":
6992
log.Println("create skywalking tracing job")
7093
break
7194
default:
7295
break
7396
}
74-
75-
defer closer.Close()
76-
ch <- ctx
97+
//return
98+
return tracer, closer
7799
}

tracer/grpc_tracer.go

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package traceandtracego
2+
3+
import (
4+
logger "log"
5+
6+
opentracing "github.com/opentracing/opentracing-go"
7+
"golang.org/x/net/context"
8+
"google.golang.org/grpc"
9+
"google.golang.org/grpc/metadata"
10+
)
11+
12+
//声明 tracer
13+
var tracer opentracing.Tracer
14+
15+
//text map reader
16+
type TextMapReader struct {
17+
metadata.MD
18+
}
19+
20+
//text map writer
21+
type TextMapWriter struct {
22+
metadata.MD
23+
}
24+
25+
//RPC Client Dial Option
26+
func ClientDialOption(parentTracer opentracing.Tracer) grpc.DialOption {
27+
tracer = parentTracer
28+
return grpc.WithUnaryInterceptor(grpcClientInterceptor)
29+
}
30+
31+
//RPC Server Dial Option
32+
func ServerDialOption(tracer opentracing.Tracer) grpc.ServerOption {
33+
return grpc.UnaryInterceptor(grpcServerInterceptor)
34+
}
35+
36+
//RPC Client 拦截器
37+
func grpcClientInterceptor(
38+
ctx context.Context,
39+
method string,
40+
req, reply interface{},
41+
cc *grpc.ClientConn,
42+
invoker grpc.UnaryInvoker,
43+
opts ...grpc.CallOption) (err error) {
44+
45+
//从context中获取metadata
46+
md, ok := metadata.FromIncomingContext(ctx)
47+
if !ok {
48+
md = metadata.New(nil)
49+
} else {
50+
//如果对metadata进行修改,那么需要用拷贝的副本进行修改
51+
md = md.Copy()
52+
}
53+
//carrier := opentracing.TextMapCarrier{}
54+
carrier := TextMapWriter{md}
55+
//父类 context
56+
var currentContext opentracing.SpanContext
57+
//从 context 中获取原始的 span
58+
parentSpan := opentracing.SpanFromContext(ctx)
59+
if parentSpan != nil {
60+
currentContext = parentSpan.Context()
61+
} else {
62+
//否则创建 span
63+
span := tracer.StartSpan(method)
64+
defer span.Finish()
65+
currentContext = span.Context()
66+
}
67+
//将 span 的 context 信息注入到 carrier 中
68+
e := tracer.Inject(currentContext, opentracing.TextMap, carrier)
69+
if e != nil {
70+
logger.Fatalln("tracer inject failed", e)
71+
}
72+
//创建一个新的 context,把 metadata 附带上
73+
ctx = metadata.NewOutgoingContext(ctx, md)
74+
return invoker(ctx, method, req, reply, cc, opts...)
75+
}
76+
77+
//RPC Server 拦截器
78+
func grpcServerInterceptor(
79+
ctx context.Context,
80+
req interface{},
81+
info *grpc.UnaryServerInfo,
82+
handler grpc.UnaryHandler) (resp interface{}, err error) {
83+
//从context中获取metadata。md.(type) == map[string][]string
84+
md, ok := metadata.FromIncomingContext(ctx)
85+
if !ok {
86+
md = metadata.New(nil)
87+
} else {
88+
//如果对metadata进行修改,那么需要用拷贝的副本进行修改。(FromIncomingContext的注释)
89+
md = md.Copy()
90+
}
91+
carrier := TextMapReader{md}
92+
tracer := opentracing.GlobalTracer()
93+
spanContext, e := tracer.Extract(opentracing.TextMap, carrier)
94+
if e != nil {
95+
logger.Fatalln("extract span context err", e)
96+
}
97+
98+
span := tracer.StartSpan(info.FullMethod, opentracing.ChildOf(spanContext))
99+
defer span.Finish()
100+
ctx = opentracing.ContextWithSpan(ctx, span)
101+
102+
return handler(ctx, req)
103+
}
104+
105+
//text map writer set
106+
func (t TextMapWriter) Set(key, val string) {
107+
t.MD[key] = append(t.MD[key], val)
108+
}
109+
110+
// 读取 metadata 中的 span 信息
111+
func (t TextMapReader) ForeachKey(handler func(key, val string) error) error { //不能是指针
112+
for key, val := range t.MD {
113+
for _, v := range val {
114+
if err := handler(key, v); err != nil {
115+
return err
116+
}
117+
}
118+
}
119+
return nil
120+
}

0 commit comments

Comments
 (0)