基于opentelemetry
和zerolog
实现的链路追踪利器。
全局初始化 指定名字的trace,以及数据导出方式。目前支持stdout,http,grpc
func main(){
shutdown, err := trace.InitProvider("afocus", trace.ExportStdOut())
if err != nil {
log.Fatal(err)
}
defer shutdown()
// todo
}
使用Start开启一个trace 并使用其End方法结束trace.
trace 使用context.Context传递
t, ctx := trace.Start(parentCtx, "执行10次sleep")
defer t.End()
for i:=0;i<10;i++{
// 子任务
ts, _ := trace.Start(ctx, fmt.Sprintf("执行第%d次",i+1))
time.Sleep(time.Second)
ts.End()
}
一般情况下trace会携带一些属性,通过属性我们可以更将详细的了解过程
uid := 1234
// 一开始设置
t, ctx := trace.Start(parentCtx, "做一次请求", trace.Attribute("uid",uid))
defer t.End()
// 中途设置
t.SetAttribute(trace.Attribute("uid",uid))
func main(){
shutdown, err := trace.InitProvider("my service", trace.ExportStdOut())
checkerr(err)
defer shutdown()
// todo
}
trace的日志基于zerolog
并自动携带trace信息...
与日志结合起来主要是 为了通过trace可以找到日志 反之 通过一条日志 可以找到整个链路
t, ctx := trace.Start(parentCtx, "做一次请求", trace.Attribute("uid",uid))
defer t.End()
t.Log().Info().Msg("xxxxx)
很多操作通过封装自动启用trace,可以有效的简化代码。如数据库操作,接口请求等
这里已经封装了一些常用的功能
- http
- gorm
- redis
- gin
- amqp