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

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

最近帮新来的校招同学排查一个线上问题,问题本身不是很难,但是过程中踩到了一个arthas的坑,挺有意思的。

同时,也分享下在排查过程中使用的一些比较实用的工具,包括tcpdump、arthas、simpleHTTPServer等,希望能对大家有所帮助。

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的使用频率很高,熟练掌握对提高工作效率很有帮助。

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

 

3.2 报文抓取

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

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

1)安装工具

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

yum -y install net-tools

2)查看网络状态

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

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

 

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 服务(端口可自定义)。

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

 

python -m SimpleHTTPServer 18888 &

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

2)解析cap文件

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

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

 

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

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

 

 

对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中显示结果如下:

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

 

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

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

5.问题定位

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

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

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

 

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

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

 

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

 

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

 

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

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

 

所以,解决方案有两个。

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

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

 

6.进一步踩坑

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

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

 

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

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

 

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

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

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

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

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

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

这说明了什么?!!!!

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

一脚踩了个连环坑。。。

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

 

7.总结

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

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

 

都看到最后了,原创不易,点个关注,点个赞吧~

文章持续更新,可以微信搜索「阿丸笔记 」第一时间阅读,回复关键字【学习】有我准备的一线大厂面试资料。

知识碎片重新梳理,构建Java知识图谱:
github.com/saigu/JavaK…(历史文章查阅非常方便)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2607.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 修改开机启动项_如何设置开机自动启动项

    修改开机启动项_如何设置开机自动启动项点击“开始”,运行“msconfig”(windows7系统,在搜索条中直接输入msconfig,敲回车),弹出“系统配置”窗口,切换到“启动”,会打开到下面的画面。将不想随开机启动的项取消选择,然

  • 数字电路实验环境 (Quartus II 9.0)

    数字电路实验环境 (Quartus II 9.0)大家好,我是孙不坚1208,记录一下数字电路这门课的实验环境((QuartusII9.0))安装。所需文件网盘链接:https://pan.baidu.com/s/1VnCc4wR7HAOgxfyWjoUHjw提取码:0kjq安装教程仅限于学习,安装前先关闭各类杀毒软件,注意安装路径不能有中文,存放安装包的路径最好也不要有中文。我们首先在c盘建好相应的文件目录,然后进行安装在此目录下。一、安装QuartusII9.0等它稍微加载,出现下面这个界面。这里进行安装,无脑点击下一步

  • consolewriteline用法_reviewmodule

    consolewriteline用法_reviewmodule严格模式ES6的模块自动采用严格模式,不管你有没有在模块头部加上"usestrict";。严格模式的限制如下变量必须声明后再使用函数的参数不能有同名属性,否则报错不能

  • 技术串讲 CAS 有用

    技术串讲 CAS 有用

  • assert函数解析[通俗易懂]

    assert函数解析[通俗易懂]一、assert是宏明确一点:在C中,ASSERT是宏而不是函数。assert()是一个调试程序时经常使用的宏。在程序运行时它计算括号内的表达式。如果表达式为FALSE(0),程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常用来判断程序中是否出现了明显非法的数据,如果出现就终止程序以免导致严重后果,同时反馈错误发生“地点”。

  • 4g网络怎么设置网速更快(移动4g网速慢怎么办)

    转载自品略图书馆http://www.pinlue.com/article/2020/05/1618/5110522403532.html别人是4G网,你也是4G网,你却更慢,不妨这样设置,网速飞快提升随着5G网络的走近,人们越来越期待未来的生活,以后电视上电影里面不可能实现的在现实中可能都会实现,5G网络的到来,人们的生活又会有怎样翻天覆地的变化,不过现在5G网络还没有正式运用,可能要到明年才能正式普及,所大家手中用的手机都是搭载4G网络,而有人发现,别人是4G网,你也是4G网,你却更慢,不妨这.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号