线上问题排查,一不小心踩到阿里的 arthas坑了

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 线上问题排查,一不小心踩到阿里的 arthas坑了

1.问题描述


新开发的一个功能,简单来说,就是读取数据库的数据展示在前台。


本地启动服务调试,用postman调用api,返回数据显示正常,数据中的中文也正常。


但是部署到线上环境后,通过chrome浏览器调用和postman调用接口,返回的非中文数据正常,但是中文显示乱码。


2.排查思路


这个问题的第一反应是请求的content-type有问题。


不过在chrome浏览器中确认了请求的request和response的content-type都是application/json;charset=UTF-8,没有问题。


然后又google了一番乱码问题,基本上都是说的spring的HttpMessageConverter问题或者content-type,都无法解决。


只能深入排查一番了。


排查的主要思路就是先确定乱码是哪一步产生的。


  • 一个就是数据库里查出来地方,需要用抓个包确认下,不过我们本地服务调用是正确的,那么这一步应该没有问题。
  • 一个是应用服务返回的地方,需要用抓个包确认下。在线上部署环境里,用tcpdump把对应的应用服务返回数据时抓个包。
  • 一个就是代码逻辑中存在数据转换,这个需要通过arthas看看线上应用的运行时数据情况。


3.用tcpdump抓包看服务端响应


3.1 什么是tcpdump呢?


tcpdump是linux下的网络数据包截获分析工具。在linux的日常网络管理中,tcpdump的使用频率很高,熟练掌握对提高工作效率很有帮助。

10.jpg


3.2 报文抓取


为了获取对应服务的请求报文,需要登录对应的服务器(或者k8s的pod)使用tcpdump进行抓取。


作为一个暖男,我把从安装到使用都一步步记下来给你 :)


1)安装工具


如果你的服务器上没有安装过tcpdump,可以先执行以下命令安装


yum -y install net-tools


2)查看网络状态


如果服务上有多个网卡,可以通过以下命令查看


Netstat -i

60.png


3)部署抓包


tcpdump -i eth0 tcp -w xxx.cap


  • en0表示监听的网卡
  • tcp表示报文类型
  • -w 指定输出文件名


还有很多其他选项可以过滤使用,大家可以网上搜一下,这里就不展开了。


4)调用请求


部署了tcpdump后,对服务器发起api请求。这时候相关的tcp报文都会被输出到 xxx.cap文件中了。


3.3 报文解析


1)把xxx.cap文件发送本地

一般可以使用scp命令,直接发送


scp xxxx.cap admin@10.xxx.xxx.xxx:/path


在传输服务器的文件到本地时,如果scp不方便使用,比如一些防火墙限制。


也可以使用 python 在服务器上开启一个 web 服务(端口可自定义)。

61.jpg


python -m SimpleHTTPServer 18888 &


然后在本地使用 wget 下载文件即可。


2)解析cap文件


本地得到cap文件后,可以通过wireshark软件对cap文件进行解析,得到如下结果。

62.png


微信图片_20220421173817.png



对api的报文进行解析后,发现返回对中文已经是乱码了,确认了在服务端发出的响应内容中,已经是乱码了。


所以,只能继续排查应用本身的问题。


4.用arthas排查线上运行代码


Arthas 是Alibaba开源的Java诊断工具,当你遇到以下类似问题而束手无策时,都可以尝试使用Arthas(更详细的用法参考官方文档:https://arthas.aliyun.com/doc/quick-start.html):


  • 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  • 遇到问题无法在线上 debug,又不想频繁加日志再重新发布
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!


4.1 快速安装、启动


curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar


4.2 运行代码返回排查


本次排查,就使用了arthas的watch功能(更详细的用法参考官方文档:https://arthas.aliyun.com/doc/watch.html),能方便的观察到指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参。


我们先看看线上运行应用controller层对于请求的响应,无需添加日志重新部署,我们马上就能看到线上代码的返回结果。


watch xxx.xxx.controller method "{params,returnObj}" -x 2


然后发起api调用,在arthas中显示结果如下:

2.png

我们可以看到,这个controller方法返回的内容就是乱码了。


因此,说明是代码逻辑中存在转换的问题了。


5.问题定位


根据业务逻辑,基本能猜测是从业务中的 byte[] 转string的时候出现问题了。

找到对应代码如下,new string()时没有指定字符集:

3.png

因此会在转换过程中,默认读取系统变量的file.encoding作为字符集。

4.jpg


5.jpg


6.jpg


然后我们用arthas直接查看系统变量,果然不是utf8。

7.png


所以,解决方案有两个。


第一种是在new string(bytes) 指定字符集。

第二种就是设置系统变量file.encoding=utf-8。


5.进一步踩坑


我们一开始选择了代码修复,在代码中转换时指定字符集。

8.png


重新发布后,再用arthas观察一下,发现竟然还是乱码?!!


然后重新回头在代码中看了很久,一直找不到原因,陷入了僵局。。。


突然,随手看了下线上,发现线上已经显示正常了,纳尼?是arthas有问题?


然后google了一下,发现很多人碰到arthas显示中文乱码的问题。。。


解决方式也比较简单,启动arthas的时候,也指定一下字符集。


java -jar -Dfile.encoding=UTF-8 arthas-boot.jar


然后问题解决了。。。呵呵。。。


这时候再观察arthas的结果已经显示正常。


这说明了什么?!!!!


Arthas输出界面的时候,肯定在字符串转换的时候,也没有指定字符集。。。。

一脚踩了个连环坑。。。

9.jpg



6.总结


其实整个问题是比较粗浅的,就是最后这个arthas的中文乱码让人有点脑壳疼,哈哈哈。


当然,最主要还是简单分享下tcpdump、arthas、simpleHTTPServer这些小工具,希望能有所帮助吧。


目录
相关文章
|
Arthas 测试技术
Arthas排查生产环境CPU飚高问题
Arthas排查生产环境CPU飚高问题
171 0
Arthas排查生产环境CPU飚高问题
|
3月前
|
Arthas Java 测试技术
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
Java字节码文件、组成、详解、分析;常用工具,jclasslib插件、阿里arthas工具;如何定位线上问题;Java注解
Java字节码文件、组成,jclasslib插件、阿里arthas工具,Java注解
|
Arthas fastjson Java
使用arthas+mat排查故障
使用arthas+mat排查故障
102 1
|
Arthas Java 测试技术
Arthas 排查JVM问题总结
Arthas 排查JVM问题总结
450 0
Arthas 排查JVM问题总结
|
Arthas Java 测试技术
服务端接口响应慢怎么定位?阿里开源工具arthas帮你解决。
接口中又调用了三个方法,分别sleep了1秒,3秒,6秒,模拟代码逻辑耗时。 然后先下载arthas
|
Arthas 存储 运维
记Arthas实现一次CPU排查与代码热更新
线上代码经常会出现CPU占用过高的情况,按以往经验我会使用top指令,进一步借助于jstack去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,即使是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下Arthas,说是可以进行代码的热更新操作,正好来试一下。
450 0
|
Arthas 消息中间件 监控
临时排查线上问题,用它Arthas| Java Debug 笔记
临时排查线上问题,用它Arthas
380 0
临时排查线上问题,用它Arthas| Java Debug 笔记
|
Arthas 存储 运维
60-微服务技术栈(高级):在线检测工具Arthas(实现CPU排查与代码热更新)
线上代码经常会出现CPU占用过高的情况,按以往经验我会使用top指令,进一步借助于jstack去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,即使是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下Arthas,说是可以进行代码的热更新操作,正好来试一下。
415 0
|
Arthas 监控 Java
java线上项目排查,Arthas简单上手
java线上项目排查,Arthas简单上手
240 0
java线上项目排查,Arthas简单上手
|
Arthas NoSQL Java
线上服务器CPU100%的真相排查【Bug利器Arthas】
这起CPU100%的事故,由某个客户演示的bug暴露出来,气氛比较尴尬....
770 0
线上服务器CPU100%的真相排查【Bug利器Arthas】

热门文章

最新文章