单进程示例
Root Span
即链路中第一个span
对象。在这里的单进程场景中,往往需要手动创建一个。随后在方法内部创建的span
都会作为它的子级span
。
在分布式架构的服务间通信场景中,往往不需要开发者手动创建root span
,而是由客户端/服务端请求的拦截器来自动创建。
创建tracer
,生成root span
:
上述代码创建了一个root span
,并将该span
通过context
传递给GetUser
方法,以便在GetUser
方法中将追踪链继续延续下去。
方法间Span创建
并通过defer
的方式调用span.End
来结束一个Span
,这样可以很好地记录Span
生命周期(开始和结束)信息,这些信息都将会展示到链路跟踪系统中。其中gtrace.NewSpan
方法的第二个参数spanName
我们直接给定方法的名称即可,这样在链路展示中比较有识别性。
效果查看
执行完上面的程序后,终端输出:
打开Jaeger UI
: ,可以看到链路追踪的结果:
点击详情可以查看具体信息,包括span
的调用顺序、调用关系,执行时间轴,以及记录一些Attributes和Events
信息,极大的方便我们定位系统中的异常和发现性能瓶颈。:
其中的tracing-inprocess
是我们tracer
的名称,该名称往往是服务名称,由于我们这里只有一个进程和一个tracer
,因此这里只看得到一个服务名称。其中的为我们创建的root span
名称,其他的span
为基于该root span
创建的子级span
。由于我们在程序中调用了两次GetUser
方法,因此这里也展示了两次GetUser
方法的调用。每一次GetUser
调用的内部又分别去调用了GetIndo、GetDetail、GetScores
三个方法,方法间的调用层级关系展示得非常清晰明了,并且每个方法的调用时长都可以看得到。
关于其中每个span
记录的Tags
和Process
信息其实对应了OpenTelemetry
中的和Events
信息,这些信息我们放到后续章节去详细介绍。