博客
关于我
走完线上 BUG 定位最后一公里
阅读量:183 次
发布时间:2019-02-27

本文共 1852 字,大约阅读时间需要 6 分钟。

线上线下环境隔离问题,常导致输入难以复现,定位bug效率低下,程序员们常陷入时间流逝的无底深渊。有没有一个简单快捷的解决方案呢?答案是有。

一个程序员的故事:周末12点,闹钟响起程序员小A勉强从睡梦中爬起来。手机通知栏显示无未接电话,拦截信箱也无警告短信,昨晚的发布顺利无误。小A松了口气,戴上BeatsSolo Pro耳机,阳光洒在头发上,美好地想着自己未来的发展。然而,手机突然响起消息提示音,寒意瞬间袭来。测试同学小C发来消息:"昨晚上线的代码好像有点问题,来公司看下?我在公司等你。"小A翻看群聊,发现老板的头像在群设置里赫然一闪而过。怀着各种复杂的心情,小A穿上20元的人字拖,前往西二旗公司。

抵达公司后,对话如期而至:"这段代码测试过,在我电脑上没问题啊"、"你重启下试试"、"是不是代码没上线"、"是不是谁把我代码冲掉了"、"你们测试数据是不是有问题呀"……一个下午、一个晚上、一个周末、小A的青春、甚至整个职业生涯,似乎都在这几个问题的回应中流逝。

这个小故事仅仅想说明一个现象:程序员的很多时间往往被线上bug修复占据。由于线上线下环境不一致、输入输出不一致等原因,许多bug定位效率低下,耗时巨长,导致程序员在面对线上bug时常常头疼不已,不由自主地想要甩锅给外在因素,确定问题出在自己身上后才开始排查。那么线上问题排查到底难在哪儿?让我们深入分析一下。

线上问题排查的基本步骤通常包括以下几个环节:

  • 找到能复现问题的输入
  • 判断该输入能否在日常环境中构造,无法构造则进入下一步
  • 查看线上环境日志,寻找异常输入相关的异常日志,辅助排查问题
  • 初步推断问题原因,尝试修复并增加日志输出,打包发布,重复步骤3直到定位根因
  • 在日常环境中构造相同输入,单点调试,定位问题
  • 然而,由于线上线下环境隔离的问题,线上的输入很多时候难以在日常环境中构造,大多数时候我们都在步骤2、3、4中循环,时间在循环中慢慢流逝。这确实是一种令人头疼的现状。那么是否有一款产品可以让用户方便快捷地实现这个目标呢?答案是阿里云的应用实时监控服务(ARMS)。

    ARMS是一款应用性能管理(APM)产品,包含应用监控、Prometheus监控和前端监控三大子产品,涵盖分布式应用、容器环境、浏览器、小程序、APP等领域的性能管理,能够实现全栈式性能监控和端到端全链路追踪诊断。ARMS最新推出了Arthas诊断功能,其第一个版本主要包含四个能力:

  • JVM概览:实时查看JVM内存、GC信息、操作系统信息、环境变量、系统变量等信息
  • 线程耗时分析:实时查看线程耗时情况,可查看每个线程实时的方法堆栈
  • 方法执行分析:实时抓取满足指定条件的方法执行明细、入出参数以及异常
  • 性能分析:通过火焰图形式展示系统性能瓶颈
  • Arthas功能使用起来也非常简单,下面我们将通过一个实际案例,详细讲解如何利用ARMS的Arthas诊断能力来定位线上问题。我们将重点分析方法执行不符合预期这一类问题。

    案例背景:product应用的com.alibabacloud.hipstershop.productserviceapi.service.ProductService@confirmInventory接口某次发布后平均响应时间(RT)达到了400ms,发布前平均RT在1ms以下。现在需要定位具体耗时的原因。

    进入ARMS Arthas诊断页面,输入相应的类名和方法名(如com.alibabacloud.xxx.xxx.xxx.ProductService,方法confirmInventory),点击确定后即可查看方法执行的详细信息。通过调整诊断参数(如设置方法耗时大于300ms的过滤条件),我们可以抓取到耗时较长的方法调用记录。进一步分析发现,该方法中存在Thread.sleep()方法的调用,这导致了响应时间的长延迟。查看方法源码后可以清楚地看到逻辑原因。

    通过ARMS的Arthas诊断功能,我们不仅可以快速定位问题,还能深入分析问题根源,极大地方便了线上问题的排查工作。ARMS的Arthas功能无疑是您线上问题诊断的利器,帮助您更快更方便地定位线上故障。

    最后要提的是,ARMS的Arthas诊断功能目前仅适用于部署在K8s集群中的Java应用,后续将支持ECS上的Java应用。对于企业级分布式应用服务的用户来说,ARMS提供了一体化的监控与诊断能力,您可以根据实际情况选择适合的产品体验ARMS的Arthas诊断功能。

    转载地址:http://wqeb.baihongyu.com/

    你可能感兴趣的文章
    NodeJS @kubernetes/client-node连接到kubernetes集群的方法
    查看>>
    Nodejs express 获取url参数,post参数的三种方式
    查看>>
    nodejs http小爬虫
    查看>>
    nodejs libararies
    查看>>
    nodejs npm常用命令
    查看>>
    NodeJS 导入导出模块的方法( 代码演示 )
    查看>>
    nodejs 的 Buffer 详解
    查看>>
    nodejs 读取xlsx文件内容
    查看>>
    nodejs 运行CMD命令
    查看>>
    nodejs-mime类型
    查看>>
    NodeJs——(11)控制权转移next
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    NodeJS、NPM安装配置步骤(windows版本)
    查看>>
    nodejs与javascript中的aes加密
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    Nodejs中的fs模块的使用
    查看>>
    nodejs包管理工具对比:npm、Yarn、cnpm、npx
    查看>>
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    nodejs字符与字节之间的转换
    查看>>