@@ -11,3 +11,113 @@ keywords:
11
11
- gRPC
12
12
- HTTP
13
13
---
14
+ ### 配置
15
+ Kratos tracing 中间件使用 opentelemetry 实现了链路追踪,分别实现了 client/server 的中间件并提供了 WithTracerProvider, WithPropagators 两个配置方法.
16
+
17
+ ### WithTracerProvider
18
+
19
+ ``` go
20
+ func WithTracerProvider (provider trace .TracerProvider ) Option {
21
+ return func (opts *options) {
22
+ opts.TracerProvider = provider
23
+ }
24
+ }
25
+ ```
26
+
27
+ WithTracerProvider 用于设置 tracing 的链路追踪程序的提供者,该方法接收一个 trace.TracerProvider.
28
+
29
+ ### WithPropagators
30
+
31
+ ``` go
32
+ func WithPropagators (propagators propagation .TextMapPropagator ) Option {
33
+ return func (opts *options) {
34
+ opts.Propagators = propagators
35
+ }
36
+ }
37
+ ```
38
+
39
+
40
+ WithPropagators 用于设置 tracing 的文本映射的传播器,该方法接收一个 propagation.TextMapPropagator
41
+
42
+ ### 使用方法
43
+
44
+ #### server 中使用 tracing 采集数据
45
+
46
+ ``` go
47
+ package server
48
+
49
+ func initTracer () func () {
50
+ // 创建一个 jaeger 的 pipeline,其他收集方式可以查看 opentelemetry 文档
51
+ flush , err := jaeger.InstallNewPipeline (
52
+ jaeger.WithCollectorEndpoint (" http://localhost:14268/api/traces" ),
53
+ jaeger.WithSDKOptions (
54
+ sdktrace.WithSampler (sdktrace.AlwaysSample ()),
55
+ sdktrace.WithResource (resource.NewWithAttributes (
56
+ semconv.ServiceNameKey .String (" kratos-trace" ),
57
+ attribute.String (" exporter" , " jaeger" ),
58
+ attribute.Float64 (" float" , 312.23 ),
59
+ )),
60
+ ),
61
+ )
62
+ if err != nil {
63
+ log.Fatal (err)
64
+ }
65
+ return flush
66
+ }
67
+ // NewGRPCServer new a gRPC server.
68
+ func NewGRPCServer (c *conf .Server , executor *service .ExecutorService ) *grpc .Server {
69
+ flush := initTracer ()
70
+ defer flush ()
71
+ // tr := otel.Tracer("component-main")
72
+ var opts = []grpc.ServerOption {
73
+ grpc.Middleware (
74
+ middleware.Chain (
75
+ tracing.Server (tracing.WithTracerProvider (otel.GetTracerProvider ())),
76
+ ),
77
+ ),
78
+ }
79
+ // ...
80
+ }
81
+ ```
82
+
83
+ #### client 中使用 tracing 采集数据
84
+
85
+ ``` go
86
+
87
+ func initTracer () func () {
88
+ // 创建一个 jaeger 的 pipeline,其他收集方式可以查看 opentelemetry 文档
89
+ flush , err := jaeger.InstallNewPipeline (
90
+ jaeger.WithCollectorEndpoint (" http://localhost:14268/api/traces" ),
91
+ jaeger.WithSDKOptions (
92
+ sdktrace.WithSampler (sdktrace.AlwaysSample ()),
93
+ sdktrace.WithResource (resource.NewWithAttributes (
94
+ semconv.ServiceNameKey .String (" kratos-trace" ),
95
+ attribute.String (" exporter" , " jaeger" ),
96
+ attribute.Float64 (" float" , 312.23 ),
97
+ )),
98
+ ),
99
+ )
100
+ if err != nil {
101
+ log.Fatal (err)
102
+ }
103
+ return flush
104
+ }
105
+ func grpcCli () (*grpc .ClientConn , error ) {
106
+ return grpc.DialInsecure (
107
+ context.Background (),
108
+ grpc.WithMiddleware (
109
+ tracing.Client (
110
+ tracing.WithTracerProvider (
111
+ otel.GetTracerProvider (),
112
+ ),
113
+ ),
114
+ ),
115
+ )
116
+ }
117
+ ```
118
+
119
+ ### References
120
+
121
+ * https://opentelemetry.io/
122
+ * https://github.com/open-telemetry/opentelemetry-go/tree/main/example
123
+ * https://pkg.go.dev/go.opentelemetry.io/otel
0 commit comments