博客
关于我
走完线上 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/

    你可能感兴趣的文章
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>
    Numix Core 开源项目教程
    查看>>
    numpy
    查看>>
    NumPy 或 Pandas:将数组类型保持为整数,同时具有 NaN 值
    查看>>
    numpy 或 scipy 有哪些可能的计算可以返回 NaN?
    查看>>
    numpy 数组 dtype 在 Windows 10 64 位机器中默认为 int32
    查看>>
    numpy 数组与矩阵的乘法理解
    查看>>
    NumPy 数组拼接方法-ChatGPT4o作答
    查看>>
    numpy 用法
    查看>>
    Numpy 科学计算库详解
    查看>>
    Numpy.fft.fft和numpy.fft.fftfreq有什么不同
    查看>>
    Numpy.ndarray对象不可调用
    查看>>
    Numpy:按多个条件过滤行?
    查看>>
    Numpy:条件总和
    查看>>
    numpy、cv2等操作图片基本操作
    查看>>
    numpy判断对应位置是否相等,all、any的使用
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>