在分布式系统,尤其是微服务系统中,一次外部请求往往需要内部多个模块,多个中间件,多台机器的相互调用才能完成。在这一系列的调用中,可能有些是串行的,而有些是并行的。在这种情况下,我们如何才能确定这整个请求调用了哪些应用?哪些模块?哪些节点?以及它们的先后顺序和各部分的性能如何呢?
这就是涉及到链路追踪。
jaeger安装
|
|
api层添加链路追踪
链路追踪的起点在每次发起http请求的地方,这时候就需要一个拦截器来生成tracer
shop\api\user-api\middlewares\tracing.go
|
|
将这个中间件配置到需要链路追踪的router上
shop\api\user-api\initialize\router.go
全局都加
|
|
由于我们使用了负载均衡
,所以对于其他的grpc的链接要加一个拦截器,来将context加入到grpc服务中。
|
|
shop\api\user-api\util\otgrpc\client.go:31
修改源码
|
|
这里修改源码是拿到context中的tracer
和parentSpan
grpc集成jaeger
在服务端还有子的过程
client拦截器的原理
从context拿到父亲的span
|
|
通过metadata的机制,将它的内容写到metadata中去
|
|
然后通过shop\api\user-api\util\otgrpc\client.go:243
|
|
如何写到opentracing中去这是有一个标准,是由opentracing做的,如何提取也是由它来做的。
将服务端想要的信息注入到metadata中去,如果注入、拿数据我们不用关心。
在grpc服务端
|
|
只要在new grpcserver的时候添加一个服务端的拦截器就行
shop\service\user_srv\main.go
|
|
我们这边可以自己生成tracer,没有必要用服务端的tracer,我们只要处理好父子关系就好,当整个服务挂了之后cl.Close()
在grpc的服务中如何拿到tracer,
shop\service\user_srv\util\otgrpc\server.go:39
从context中拿到span
|
|
|
|
在服务中使用:
D:\repository\shop\service\user_srv\handler\user.go
|
|