千家信息网

利用Arthas定位线上问题实例

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,前言Arthas是一个类似于Btrace的JVM在线调试分析工具,具体可参考我之前写的一篇博客:利用JVM在线调试工具排查线上问题。本文分享笔者刚遇到的一个问题,虽然不复杂,但是很典型。问题与分析过程
千家信息网最后更新 2024年12月12日利用Arthas定位线上问题实例

前言

Arthas是一个类似于Btrace的JVM在线调试分析工具,具体可参考我之前写的一篇博客:利用JVM在线调试工具排查线上问题。本文分享笔者刚遇到的一个问题,虽然不复杂,但是很典型。

问题与分析过程

昨天上线遇到一个问题,交易后给大数据平台异步送数,但是他们说没收到数据,因为我们没有打日志,所以没有直接的证据证明是他们的问题而不是我们的问题。

送数的原理大致如下,就是交易主线程把数据放到队列里,然后异步线程从队列里把数据取出来,发送到后台。

队列:BlockingQueue queue = new BlockingQueue();同步线程:void sendMsg(Message msg) {   queue.offer(msg);}异步线程:void consume() {   Message msg = queue.take();   while(msg != null) {       HttpClient.post(msg);       msg = queue.take();   }}

具体送数的代码如下( 加了行数):

38  public void consume(Map msg) {39        HttpClient httpClient = new HttpClient(cm);40        PostMethod method = new PostMethod(uri);41        method.addRequestHeader("context-type", "application/x-www-form-urlencoded");42        JSONObject json = new JSONObject(msg);43       NameValuePair[] params = new NameValuePair[2];44       params[0] = new NameValuePair("topic", topic);45       params[1] = new NameValuePair("value", json.toJSONString());46       //System.out.println(msg.toString());47       logger.info("BigDataHttp Send Json:" + json.toJSONString());48       method.addParameters(params);49      try {5051         httpClient.executeMethod(method);52         if(method.getStatusCode() == 200) {53              logger.info("BigDataHttp response(Success):"+ method.getResponseBodyAsString());54         } else {55              logger.info("BigDataHttp Response(error):" + method.getResponseBodyAsString());56         }57     } catch(Exception e) {58         logger.error(e.getMessage(), e);59     } finally {60         method.releaseConnection();61     }62  }

在日志里没有发现try里的异常,而比较遗憾的是,我们的日志虽然开了info级别,但是因为日志量太大,所以只开了交易上送和下发报文的日志,其他的日志都关了。

现在日志级别没法调,有没有办法能确定,请求返回了200,还是其他值呢?

可以用在线调试工具Arthas,我们使用Arthas的trace功能,查看这个类执行的详细步骤。

首先连接上这个JVM进程,pid为进程号。

java -jar arthas-boot.jar pid 

然后执行命令

trace xxx.util.bigDataUtil.BigDataHttpConsumer consume

这条命令的左右就是,追踪xxx.util.bigDataUtil.BigDataHttpConsumer类里consume方法的执行过程。

执行的结果如下,每一行最后的是代码行数,我们可以看一下,跟上面代码是一一对应的。

从代码中可以看到,如果返回码是200,那么它会执行第52行,如果返回码不是200,会执行55行,因此,我们通过trace功能确定执行了哪条语句,就可以知道到底返回没返回200,从结果来看,确定返回的不是200。

这样我们就有了确定的证据证明发给后台时返回非200,后台同事检查了自己的配置发现配置有误,是他们自己的问题。

问题 日志 代码 数据 线程 后台 工具 队列 交易 在线 功能 命令 就是 级别 结果 证据 过程 进程 分析 配置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库怎么取日期 榆树智能化网络技术质量推荐 喜悦网络技术有限公司 exp导出关联表数据库 存储服务器硬盘坏了全部得更换 h3c服务器配置管理ip 服务器接百兆交换机没反应 日常生活中的网络安全英语 机器人服务器可以安装多少个 软件开发系统生产商 信息网络安全教导员 万方数据库全文直达打不开 光大证券突然与服务器通讯异常 宁江区中小学生网络安全知识问答 网络技术服务包含网络安装吗 杭州兰德纵横网络技术股份 临沂天美网络技术有限公司 阿里巴巴数据库世界第一知乎 北京巨量引擎网络技术有限公司 天津市软件开发招聘会 web服务器之间可以互相连接吗 网络安全教育ppt课件大学生 与税控服务器交互出现异常 学软件开发来得及吗 飞轮数据库融资 中景信网络技术有限公司 网络安全事件分析发展前景 数据库触发器安全 定时任务执行数据库重复 外文数据库采用主题检索语言
0