4.2版本tars框架服务没有数据上报
Opened this issue · 9 comments
环境:
SkyAPM-php-sdk:4.2
php:7.2.23
swoole:4.4.6
tars:2.2.5
bug描述
按照文档安装一切顺利,swoole服务可以正常上报,但是tars框架的服务没有数据上报。
没有输出错误日志和其他异常日志
是不支持tars框架吗?
@heyanlong 大佬有时间指教下吗?
通过日志打印发现tars的函数入口函数应该是App\Core\{closure},对应的类应该是App\Core\Tars
但是在php_skywalking.h头文件中,定义的函数是onRequest,定义的类是Tars\core\Server,会导致请求不能开启一个trace。
在修改了php_skywalking.h的函数为App\Core\{closure},类App\Core\Tars后,却发现虽然请求进入了sky_request_init函数,但是数据依然没有上报,manager.cc文件的Manager::consumer消费并没有执行,而且接口无响应(无限等待中)
然后在应用程序日志显示:
[2022-08-22 17:03:24 $32586.0] WARNING swManager_check_exit_status: worker#2[pid=27167] abnormal exit, status=0, signal=11
A bug occurred in Swoole-v4.4.6, please report it.
The Swoole developers probably don't know about it,
and unless you report it, chances are it won't be fixed.
You can read How to report a bug doc before submitting any bug reports:swoole/swoole-src#2000
Please do not send bug reports in the mailing list or personal letters.
The issue page is also suitable to submit feature requests.
请求的这个worker进程直接退出,信号为11,意思是读取了非法的内存。不知道为啥会这样。
定位到了SKYWALKING_G(is_swoole) = true;这一行,只要注释掉这一行,就不会报signal=11进程异常退出
需要看一下tars的入口函数是什么。可以发一个最小代码吗?目前e2e没有包含tars测试。
需要看一下tars的入口函数是什么。可以发一个最小代码吗?目前e2e没有包含tars测试。
tars的入口应该是没错的,我最开始出现问题的地方应该是我们这边的项目覆盖了onRequest回调,是在App\Core\Tars里。
现在的问题是进程会异常退出,报signal 11,我调试了一下,发现是在PHP里http request对象的指针地址读取错误,我目前发现了两处疑似导致问题的地方:
1 调用SKYWALKING_G(is_swoole) = true;赋值,因此我改用其他全局变量的方式实现这个逻辑,就能够恢复正常。
2 调用sky_find_swoole_fd函数就会出现,此处没有找到好的解法,我尝试注释此行,用常量1返回就可以,这里不知道怎么替换
重写onRequest没关系,还是会继续处理swoole的onRequest
重写onRequest没关系,还是会继续处理swoole的onRequest
现在的问题是
1 调用SKYWALKING_G(is_swoole) = true;赋值,因此我改用其他全局变量的方式实现这个逻辑,就能够恢复正常。
2 调用sky_find_swoole_fd函数就会出现,此处没有找到好的解法,我尝试注释此行,用常量1返回就可以
这两处会导致php服务读取http request header时,指针地址错误,这个问题我怎么看源码都看不出问题来,怀疑是swoole的bug。
发一下你怎么改的,再发一下demo代码,我本地测试一下。