Tracing 系统是监控的一个方面
基础层面跟踪
有很多工具是可以在 k8s 这种容器化环境里自动追踪到, 服务间的调用的. 甚至记录下一些性能相关的信息, 并生成链路的图表
Tracing 系统 侧重
- ELK/EFK - 侧重 log
- Promethuse - 侧重 metrics
- Tracing 侧重链路, 兼顾 log 和 metrics
Golang 生态下的例子
初试设定
- 一个 backend 组合服务
- 一个 jwt auth 服务
— Login 接口会根据 userID 生成 jwt token
我们就跟踪这个路径
创建 tracer
package tracing |
在 main 里初始化
确定 Service Name
tracing.Init("todo-backend-service") |
创建 span
func LoginHandler(c *gin.Context) { |
获取 userID, 子 span
ctx := opentracing.ContextWithSpan(context.Background(), span) |
// NewUID - generate uid for a user |
1. 通过 http 调用 auth 服务
tracing 的相关信息是在 header 里带给目标服务的
ext.SpanKindRPCClient.Set(span) |
2. 通过 grpc 调用 auth 服务
初始化 grpc conn, 注意使用 otgrpc
|
- … 生成 protobuf
- …生成 go 文件
- …调用
- otgrpc 会帮助把 trace 信息 序列化反序列,已保持连贯
被调用 Auth 端 http
Extract 出 tracer
tracer := tracing.Tracer |
被调用 RPC
StartSpanFromContext
span, childCtx := opentracing.StartSpanFromContext(ctx, "SayHello") |
设置 tag
span.SetTag("UID", reqParams.ID)
携带 log
span.LogKV("event", "jwt success", "token", token)
跟踪后台 Jaeger
使用 docker 或者二进制直接启动
IMG
- 链路记录
- RPC 记录详情
- HTTP 记录详情
- 比较 记录详情
我们可以明显看到 rpc 方式在性能上的优势…