一、基本介绍
在链路跟踪中, TraceID
作为在各个服务间传递的唯一标识,用于串联服务间请求关联关系,是非常重要的一项数据。 TraceID
是通过 Context
参数传递的,如果使用框架的 glog
日志组件,那么在日志打印中将会自动读取 TraceID
记录到日志内容中。因此也建议大家使用框架的 glog
日志组件来打印日志,便于完美地支持链路跟踪特性。
二、TraceID的注入
1、客户端
如果使用 GoFrame
框架的 Client
,那么所有的请求将会自带 TraceID
的注入。 GoFrame
的 TraceID
使用的是 OpenTelemetry
规范,是由十六进制字符组成的的 32
字节字符串。
强烈建议大家统一使用 gclient
组件,不仅功能全面而且自带链路跟踪能力。
2、服务端
如果使用 GoFrame
框架的 Server
,如果请求带有 TraceID
,那么将会自动承接到 Context
中;否则,将会自动注入标准的 TraceID
,并传递给后续逻辑。
三、TraceID的获取
1、客户端
如果使用 GoFrame
框架的 Client
,这里有三种方式。
1)自动生成TraceID(推荐)
通过 gctx.New/WithCtx
方法创建一个带有 TraceID
的 Context
,该 Context
参数用于传递给请求方法。随后可以通过 gctx.CtxId
方法获取整个链路的 TraceID
。相关方法:
// New creates and returns a context which contains context id.
func New() context.Context
// WithCtx creates and returns a context containing context id upon given parent context `ctx`.
func WithCtx(ctx context.Context) context.Context
使用 WithCtx
方法时,如果给定的 ctx
参数本身已经带有 TraceID
,那么它将会直接使用该 TraceID
,并不会新建。