链路跟踪 - 进程内服务 (gRPC导出器)
Code Source: https://github.com/gogf/examples/tree/main/observability/trace/inprocess-grpc
简介
本示例演示了如何使用GoFrame和基于gRPC的OpenTelemetry导出器在进程内服务中实现分布式跟踪。主要展示:
- 使用gRPC导出器配置单进程跟踪
- 跟踪函数调用和操作
- 通过gRPC传播跟踪上下文
- 可视化分布式跟踪
环境要求
- Go 1.22 或更高版本
- GoFrame框架
- GoFrame OpenTelemetry gRPC跟踪
目录结构
.
├── main.go # 带gRPC跟踪的主应用程序
├── go.mod # Go模块文件
└── go.sum # Go模块校验和
前置条件
- 运行Jaeger实例:
docker run --rm --name jaeger \
-e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 4317:4317 \
-p 4318:4318 \
-p 14250:14250 \
-p 14268:14268 \
-p 14269:14269 \
-p 9411:9411 \
jaegertracing/all-in-one:1.55
使用说明
-
运行应用程序:
go run main.go
-
查看跟踪: 在浏览器中打开 http://localhost:16686 查看Jaeger UI中的跟踪信息。
实现说明
本示例演示了:
-
用户数据操作
GetUser(ctx, id) // 检索完整的用户数据
├── GetInfo(ctx, id) // 获取基本用户信息
├── GetDetail(ctx, id) // 获取详细用户信息
└── GetScores(ctx, id) // 获取用户成绩 -
跟踪上下文流程
// 创建带gRPC上下文的根span
ctx, span := gtrace.NewSpan(ctx, "main")
defer span.End()
// 创建带gRPC元数据的子span
ctx, span := gtrace.NewSpan(ctx, "GetUser")
defer span.End() -
错误处理
// 处理不存在的用户ID
if id == 100 {
return g.Map{
"id": 100,
"name": "john",
"gender": 1,
}
}
return nil -
基于gRPC的跟踪导出
// 初始化gRPC跟踪导出器
shutdown, err = otlpgrpc.Init(serviceName, endpoint, traceToken)
if err != nil {
g.Log().Fatal(ctx, err)
}
defer shutdown(ctx)
示例输出
对于用户ID 100:
{
"id": 100,
"name": "john",
"gender": 1,
"site": "https://goframe.org",
"email": "john@goframe.org",
"math": 100,
"english": 60,
"chinese": 50
}
对于不存在的用户ID:
{}