Open fruitfish opened 1 year ago
status 101 是 websocket 协议升级状态码,正常。 arthas-tunnel-server 日志的报错提示没有对应的 arthas client 注册到 tunnel server 上, 先检查下agent的日志。
看了agent的日志,好像也没报错。
看了agent的日志,好像也没报错。
看agent日志, arthas attach时间超过了5秒。目前前端的逻辑是先调用 start 接口,然后5秒后连接arthas tunnel server,这时agent还没成功启动arthas导致了这个报错:
agent没成功启动arthas,这个要怎么排查了?
好像是请求中的id参数不对(可能是因为arthas没有成功启动,这个id不能使用?)
websocket handshake complete, uri: /ws?method=connectArthas&id=936ac95c54d24e4f84fcd0a9a4c103c4@192.168.xxx.xxx
我用日志中打印的id,去arthas tunnel server的web页面去请求,也是抛那个异常,页面也没有进入到arthas的控制台页面。
2023-11-01 10:02:09.517 INFO 50150 --- [rver-worker-3-1] c.a.a.t.server.TunnelSocketFrameHandler : websocket handshake complete, uri: /ws?method=connectArthas&id=936ac95c54d24e4f84fcd0a9a4c103c4@192.168.xxx.xxx
2023-11-01 10:02:09.518 INFO 50150 --- [rver-worker-3-1] c.a.a.t.server.TunnelSocketFrameHandler : try to connect to arthas agent, id: 936ac95c54d24e4f84fcd0a9a4c103c4@192.168.xxxx.xxx
2023-11-01 10:02:09.518 WARN 50150 --- [rver-worker-3-1] io.netty.channel.DefaultChannelPipeline : An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
java.lang.IllegalArgumentException: WebSocket close status code does NOT comply with RFC-6455: 2000
at io.netty.handler.codec.http.websocketx.CloseWebSocketFrame.requireValidStatusCode(CloseWebSocketFrame.java:202) ~[netty-codec-http-4.1.92.Final.jar!/:4.1.92.Final]
at io.netty.handler.codec.http.websocketx.CloseWebSocketFrame.<init>(CloseWebSocketFrame.java:69) ~[netty-codec-http-4.1.92.Final.jar!/:4.1.92.Final]
at com.alibaba.arthas.tunnel.server.TunnelSocketFrameHandler.connectArthas(TunnelSocketFrameHandler.java:219) ~[classes!/:3.7.1]
at com.alibaba.arthas.tunnel.server.TunnelSocketFrameHandler.userEventTriggered(TunnelSocketFrameHandler.java:71) ~[classes!/:3.7.1]
通过手动启动arthas,生成了一个id:HRINFHEF2OY7VVWGAAFK。用这个id去arthas tunnel server的web页面去请求,能够正常显示的
可以适当增加agent服务的部署资源,目前看是启动时间过长,超过了前端设置的5s(当然这是可以优化的点,前端应该等待arthas启动成功并注册到tunnel server上再发起连接,我不熟悉前端,你如果有兴趣,欢迎你提pr)
前端我也不太懂的。 老师,你说 agent 的日志中显示,arthas attach时间超过了5秒,这个在日志中是怎么看出来的。 另外再请教一下老师,调用了 start 接口后,是不是就启动了arthas;因为5s后还没有启动成功,导致连接arthas tunnel server失败。那arthas被唤起后(通过start 接口),最终是不是应该会启起来的,有方法验证吗?比如进到容器中,有没有方法可以看的;如果是arthas启动失败了,能查看失败的原因吗?感谢老师!
看了agent的日志,好像也没报错。
看agent日志, arthas attach时间超过了5秒。目前前端的逻辑是先调用 start 接口,然后5秒后连接arthas tunnel server,这时agent还没成功启动arthas导致了这个报错:
安装后可以通过arthas tunnel server的管理页面查看agent是否成功注册,如果成功注册,可以认为arthas启动成功,报错是这个5s超时导致的。
我测试了一下,好像只有在连接 tunnel server时指定 --app-name
参数才会在app列表也展示appname。
./as.sh --tunnel-server 'ws://10.1.xxx.xxx:7777/ws' --app-name testso
通过skywalking的arthas的页面点击connect后,arthas的管理页面没有显示app的信息,不知道是没指定 --app-name
不显示,还是arthas启动失败了压根没起来。
老师,还有其他方法可以排查吗?
我测试了一下,好像只有在连接 tunnel server时指定
--app-name
参数才会在app列表也展示appname。./as.sh --tunnel-server 'ws://10.1.xxx.xxx:7777/ws' --app-name testso
通过skywalking的arthas的页面点击connect后,arthas的管理页面没有显示app的信息,不知道是没指定
--app-name
不显示,还是arthas启动失败了压根没起来。老师,还有其他方法可以排查吗?
agent启动arthas时会用skywalking配置的agent name作为app-name参数,从日志看是启动成功了的,我没有其他的排查方向了,可能需要你自己调试下代码。
我这遇到同样的问题,分享下原因,参考下: 根本原因是:我这OAP是集群模式,每次ui这边点击connect都只会将集群中的一个节点的CommandQueue 加上start/stop。 agent来轮询是否唤起arthas的时候不一定会轮到这个节点。并且这个窗口期只有5秒。
解决思路: 1、将CommandQueue不要放到内存里面,用其他的集群来共享存储。例如redis 2、改下apm-webapp,针对arthas的start/stop接口不使用默认roundRobin模式,改为广播调用每个集群节点,使每个节点的内存CommandQueue都有值
老师,你好 skywalking oap的版本是9.6.0 , skywalking-agent的版本V9.0.0,使用k8s部署的,使用的skywalking helm的版本是v4.4.0. 以下是k8s集群中的skywalking服务
在UI的界面上可以显示arthas的窗口。arthas-tunnel-server 是部署在k8s集群外面的。
在arthas的窗口输入arthas-tunnel-server的ip:7777,点击 connect,就进入上图中那个黑色的窗口了,但窗口中没有显示其他信息了。 然后再点击 connect 就提示已连接。
查看了 arthas-tunnel-server 的日志,发现有报错。 感觉是arthas-tunnel-server部署在k8s集群外面,不能和k8s集群中的pod通信?
老师,这种问题有什么方式可以处理吗?谢谢!