SkyAPM/SkyAPM-php-sdk

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代码,我本地测试一下。