本章节的示例代码位于:https://github.com/gogf/gf/tree/master/example/trace/grpc_with_db

目录结构

Protocol

这里使用到了第三方的 开源项目,用于注入自定义的Golang struct标签。这里不详细介绍,感兴趣的小伙伴可以自行了解。未来Katyusha微服务框架的官网文档也会做对这块详细介绍,包括GRPC工程目录、开发规范、开发工具、拦截器、注册发现、负载均衡等设计话题。

GRPC Server

服务端代码简要说明:

1、首先,客户端也是需要通过jaeger.Init方法初始化Jaeger

2、可以看到,业务逻辑和之前HTTP示例项目完全一致,只是接入层修改为了GRPC协议。

3、我们仍然通过缓存适配器的方式注入Redis缓存:

5、这里也是通过Cache方法启用ORM的缓存特性,之前已经做过介绍,这里不再赘述。

GRPC Client

客户端代码简要说明:

1、首先,客户端也是需要通过jaeger.Init方法初始化Jaeger

效果查看

启动服务端:

链路跟踪-GRPC示例 - 图2

启动客户端:

这里客户端的执行最后报了一个错误,那是我们故意为之,目的是演示GRPC报错时的链路信息展示。我们打开jaeger查看一下链路跟踪信息:

链路跟踪-GRPC示例 - 图4

可以看到本次请求涉及到两个服务:tracing-grpc-clienttracing-grpc-server,即客户端和服务端。整个请求链路涉及到17span,客户端5span,服务端12span,并且产生了个错误。我们点击查看详情:

我们点击查看一下最后接口调用错误的span情况:

链路跟踪-GRPC示例 - 图6

查看Process中的Log信息可以看到,是由于传递的参数为-1,不满足校验规则,因此在数据校验的时候报错返回了。

由于ormredislogging组件在之前的章节中已经介绍过链路信息,因此我们这里主要介绍GRPC Client&Server的链路信息。

链路跟踪-GRPC示例 - 图8

Event/Log说明
grpc.metadata.outgoingGRPC客户端请求提交的Metadata信息,可能会比较大。
grpc.request.baggageGRPC客户端请求提交的Baggage信息,用于服务间链路信息传递。
grpc.request.message

GRPC客户端请求提交的Message数据,可能会比较大,最大只记录512KB,如果超过该大小则忽略。仅对Unary请求类型有效。

grpc.response.messageGRPC客户端请求接收返回的的Message信息,可能会比较大。仅对Unary请求类型有效。

GRPC Server

链路跟踪-GRPC示例 - 图10

GRPC Server端的Attributes含义同GRPC Client,在同一请求中,打印的数据基本一致。

GRPC Server端的EventsGRPC Client不同的是,在同一请求中,服务端接收到的metadata为,其他同GRPC Client