hyperf / hyperf

🚀 A coroutine framework that focuses on hyperspeed and flexibility. Building microservice or middleware with ease.

Home Page:https://www.hyperf.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[QUESTION] JsonRPC + Zipkin 无法追踪到请求微服务后的链路

tiancheng-66 opened this issue · comments

Before you submit an issue, please be sure to search through existing issues as well as search through the documentation

  • [] I've searched all existing issues
  • [] I've read all relevant documentation I could find

Describe your question

调用链路为 consumer -> provider1 -> provider2
三个服务均按照官网文档配置了Middleware 和 Aspect

image image

但是根据调用链路去查询只能查到请求provider1的request 看不到provider1 后面的链路了
image

其他服务有上报嘛?hyperf的tracer只是负责当前服务的上报和requestid传递。Aspect里面默认配置是有RpcAspect的。
image

其他服务有上报嘛?hyperf的tracer只是负责当前服务的上报和requestid传递。Aspect里面默认配置是有RpcAspect的。 image

tracer传递到服务提供者之后 服务提供者不会自动解析传过来的tracer_id把整个链路拼起来吗

目前我从消费者端去请求服务提供者的链路能捕获到,后面服务提供者的IO操作就都捕获不到了

你在provider2拿不到tracerid?RpcAspect是有tracerid组装逻辑的。

  1. 确认provider2能否拿到tracerid
  2. 确认provider2的trace上报配置是否正常
  3. 确认provider的Aspect是否配置了正确的Aspect,默认有一些,但是我看了一下默认是没有JSONAspect的。
image

你在provider2拿不到tracerid?RpcAspect是有tracerid组装逻辑的。

  1. 确认provider2能否拿到tracerid
  2. 确认provider2的trace上报配置是否正常
  3. 确认provider的Aspect是否配置了正确的Aspect,默认有一些,但是我看了一下默认是没有JSONAspect的。
image

1.我不知道该如何查看provider2的tracerid 目前我拿到tracerid的方法是通过consumer的middleware(Hyperf\Tracer\Middleware\TraceMiddleware)
2.我因为拿不到provider1和provider2的tracerid所以只能在zipkin中通过serviceName来查询 但是没有数据。因为我consumer是从controller中调用的jsonrpc去请求provider1 所以有请求provider1的记录
image
3.我确认正确配置了aspect (consumer和provider我都有做这个配置)

config/autoload/aspects.php:

return [
    RpcAspect::class,
    \Hyperf\Tracer\Aspect\JsonRpcAspect::class,
    Hyperf\Tracer\Aspect\CoroutineAspect::class,
];
  1. 你从provider2中的TracerMiddleware打印traceid,与其他几个provider核对一下看看是否一致。
  2. 你在provider、provider1中使用什么方式调用其他服务的,

刚刚翻了一下源码,似乎hyperf的jsonrpc并没有实现对traceid的组装。

这一步可能需要你自己完成,包括上报等。

https://github.com/hyperf/tracer/blob/2f52ab4c491cbccc90fdd472c2bdc434b2bf9db2/src/Aspect/RpcAspect.php#L59-L100

  1. 你从provider2中的TracerMiddleware打印traceid,与其他几个provider核对一下看看是否一致。
  2. 你在provider、provider1中使用什么方式调用其他服务的,

刚刚翻了一下源码,似乎hyperf的jsonrpc并没有实现对traceid的组装。

这一步可能需要你自己完成,包括上报等。

https://github.com/hyperf/tracer/blob/2f52ab4c491cbccc90fdd472c2bdc434b2bf9db2/src/Aspect/RpcAspect.php#L59-L100

1.我测试了一下 通过JsonPrc请求 provider1 和 provider2 都没有走TracerMiddleware,如果走JsonRpc进来的数据应该是不会走到中间件的
2.我的调用方法是:
consumer 调用 provider1 的 order 方法 去拿到订单信息
image
image
image

之后在provider1 的 order方法中 调用 provider2 的pay方法 拿到支付链接 返回给 consumer,目前走到这个order方法之后 zipkin也不会上报链路信息
image

TraceMiddleware是基于HTTP的中间件,你JSONRPC拿不到是正常的。建议自己通过重新封装JsonRpcTransportor,对send加上一层封装层传递meta信息,然后在consumer这边接收数据时候进行反解meta与trace上报。

TraceMiddleware是基于HTTP的中间件,你JSONRPC拿不到是正常的。建议自己通过重新封装JsonRpcTransportor,对send加上一层封装层传递meta信息,然后在consumer这边接收数据时候进行反解meta与trace上报。

好的 谢谢!