走完线上 BUG 定位最后一公里

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 因为线上线下环境隔离的问题,线上的输入很多时候难以在日常环境中构造,定位 bug 效率低下。是否有简单快捷的办法呢?

一个小故事


周末12点的闹钟在回龙观均价3000的出租屋急促的响起,程序员小A慵懒的拿过手机,滑开手机通知栏,没有未接电话,点开手机的拦截信箱,没有报警短信,昨晚的发布一定很顺利。小A幸福的伸了个懒腰。戴上3000块的BeatsSolo Pro,音乐逐渐响起来,小A缓缓的闭上了眼睛,正午的阳光从窗户漫进来,撒在小A稀疏的头发上。此时的小A正在脑海中勾勒着自己美好的未来。房东说:十年前住在这间屋的小B,现在已经是某度的T10 大佬,五年前住在这儿的小T,现在已经在某条带领200人的团队,想到这儿,小A的嘴角微微上扬,那我也一定不会太差吧~


嘀嘀..耳机里传来两声消息提示音,小A心里咯噔一声,刺骨的寒意弥漫开来,北京三月的阳光突然就不暖了。小A用力的微微睁开双眼,通知栏测试同学小C的头像一闪而过。


xx线上BUG紧急修复群

小C: “@小A 昨晚上线的代码好像有点有问题,来公司看下?我在公司等你。”

点开群设置,老板的头像赫然在列。


怀着愧疚、徘徊、悔恨、无奈、愤怒的心情,小A翻身穿上他在路边买的价值20元的人字拖,坐上了前往西二旗的地铁十号线。


不久,西二旗某办公室传来了亘古不变的对话,“这段代码测试过,在我电脑上没问题啊”、"你重启下试试"、“是不是代码没上线”、“是不是谁把我代码冲掉了”、“你们测试数据是不是有问题呀”……于是一个下午过去了、一个晚上过去了、一个周末过去了、一个程序员的青春过去了、一个程序员本就不长的职业生涯过去了。


一个小总结


上面这个虚构的小故事只是想说明一个简单的现象,程序员的很多时间被线上bug fix占据。因为线上线下环境不一致、输入输出不一等等原因,很多bug定位起来效率低下,耗时巨长,导致很多时候程序员遇到线上bug总是头疼不已,不由自主的想要甩锅给外在因素,在确定是自己的问题的时候再排查问题。那么线上问题排查到底难在哪儿?首先来看看我们排查线上问题的一个基本步骤,这个步骤一般是排查大多数线上问题的步骤。


步骤1:找到能复现问题的输入;

步骤2:判断该输入能否在日常环境构造, 如果能,调到步骤5。如果不能,继续步骤3;

步骤3查看线上环境日志,看能否找到异常输入相关的异常日志,辅助排查问题;

步骤4初步推断问题原因,尝试修复并加上更多日志输出。然后打包、发布。重复步骤3直到定位根因;

步骤5日常构造相同输入,单点调试,定位问题;


实际的场景中,因为线上线下环境隔离的问题,线上的输入很多时候难以在日常环境中构造,大多数时候我们都在步骤2、3、4中循环,于是时间就在循环中慢慢的流逝了。


上面做这么多步骤其实对于查问题而言就是希望可以知道当某段代码执行不符合预期的时候,这段代码的输入是什么,输出是什么,抛出了什么异常,以及代码中每一行的具体执行情况。那么是否有一款产品可以让用户方便快捷的实现这个目标呢?答案是有的。


聊一聊ARMS


阿里云的应用实时监控服务ARMS是一款应用性能管理(APM)产品,包含应用监控、Prometheus监控和前端监控三大子产品,涵盖分布式应用、容器环境、浏览器、小程序、APP 等领域的性能管理,能帮助用户实现全栈式性能监控和端到端全链路追踪诊断。


ARMS最新推出了Arthas诊断功能,其第一个版本主要包含四个能力,分别是JVM概览、线程耗时分析、方法执行分析以及性能分析:


  • JVM概览:查看实时的JVM内存、GC信息以及操作系统信息、环境变量、系统变量等信息。
  • 线程耗时分析:查看实时的线程耗时情况,并可查看每个线程实时的方法堆栈。
  • 方法执行分析:实时的抓取满足指定条件的方法执行明细、出入参数以及异常。
  • 性能分析:快捷的通过火焰图的的形式,展示系统性能瓶颈。


ARMS的Arthas功能使用起来也比较简单,详情可参照文档。下面来简单聊一聊如何利用ARMS的Arthas诊断能力来进行线上问题的定位。


聊一聊ARMS Arthas诊断


上一节简单介绍了下ARMS的Arthas诊断具备的能力,那么用这些能力能解决哪些线上问题呢?在这里,我们对线上问题进行了一个归纳总结,将其分为下面四类问题:


  • 方法执行不符合预期:包括方法执行耗时、方法返回值、方法抛出了异常等情况,表现在应用上可能是一些接口或者服务的RT增高,错误率增高,返回值异常等。
  • 进程CPU耗时突增:一般有代码死循环问题、FullGC导 GC线程耗时高、并发使用HashMap等。
  • 性能优化问题:主要用于分析性能瓶颈,辅助性能优化,包括 CPU 耗时、内存分配、锁竞争、itimer 等情况的性能分析。
  • 其他问题:比如初始化环境变量读取错误、内核版本不符合要求、类冲突等问题。


下面就以一个实际的demo来演示如何利用ARMS的Arthas来进行方法执行不符合预期这种问题的诊断,后续的文章会继续介绍如何利用Arthas进行其他类型问题的诊断。


利用ARMS Arthas诊断方法执行不符合预期类问题


问题背景:product 应用的com.alibabacloud.hipstershop.productserviceapi.service.ProductService@confirmInventory 接口某次发布后平均 RT 到达 400,发布以前的平均 RT 在 1ms 以下,如下图所示。现在想定位耗时具体耗在哪儿。


image.png图 1


首先,进入ARMS Arthas诊断的页面。当我们进行BUG定位的时候,首先需要知道出问题的类名和方法名,按照图示截图中的红色注释输入相应的类名和方法名。如果你是EDAS用户,可直接选择一个服务或者接口,后台会自动推断相应的实现类和方法。对应到本案例,对应的类是com.alibabacloud.xxx.xxx.xxx.ProductService,方法是confirmInventory。填写完毕后点击确定。


image.png

product[EDAS]

选择一个应用实例

应用总皖

producigrou16378989461615144172.20.1.171

应用详

检测Arthas是否

尝试挂载Arthas

检测Arthas是否

已下载

已挂载

按口调用

方法执行分析

线程耗时分析

性能分析

JVM概览

手件中心

com.alibabacloud.hipstershopprductseceapsecePr.

重货

com.alibabacloud.hipstrshop.productsericea

contirmlnventory

炎蒸库调用

填写类名

NOSQL调用

惰定

填写方法名

外部话用

MQ监控

主动创析

应用诊

实时诊断

异常分析

线程分析

日志分析NER

应用诊晰-Arthas诊断

应用环境

Problem

https:/larms.conoleliyunomm2

图 2


如下图所示,点击确定后可以得到confirmInventory方法执行的纪录,包含执行的入参,返回值异常以及方法执行明细。

image.png

确定

Com.albabacloud.hpstershop.productservicea

contirmlnventory

confirminventory

C

修改诊晰梦数查若方法陈码

异常:

执行耗时:

:2.89ms

入参:查看

返回值:查看

方法名:contimmlmventory

行号

调用方法

时间拍(ms)

调用信息

操作

com.alibabacloud.hipstrshop.rodu

vice.seryice.Producservicelmpls$Enhance

3ms

BySpringcqLIB$$4635de55.confirmlnven

tory

org.springtramewrork.cglb.oroxy.Meth

钻入

3ms

odlnterceptor.intercept

comalibabacloud.hipstershop.pro

-1

1ms

ductservice.scrvice.Productscrvicel

mpl.confirminwentory

小耗时:0,最大尾时:0.平均耗时:

钻入

63

0ms

java.lang.String.cquals

0,调用次数:2

com.alibabaclouc.hipstorshop.

钻入

64

0ms

productservice.utils.Commonuti

IgetLocallp

钻入

65

Oms

java.util.Random.kinit>

钻入

Oms

java.lang.String.spli

66

钻入

java.utilArraysaList

Oms

0ms

钻入

java.util.HashSet.cinit>

java.lang.string.equalslgnoreCa

0ms

钻入

图 3


但是这次执行的耗时2.89ms,不是我们预期中的一次耗时高调用。此时,可点击右上角修改诊断参数,设定抓取耗时大于300ms的方法调用(除此以外还可以设置更多的过滤条件,包括方法参数满足的条件等等,具体可查看文档


image.png

com.albabacloudhipstershop.oroducteiceapi.servicePr...

旗定

垂置(

COMalibabacLoudhiostershop.productservicea

confurmInventory

confirmLnventory

修改诊折菩绥

查看方法源码

异:

返回值:

方法名:confirmimvcntory执行耗时:2.89ms

查右

查右

诊断参数设置

调用方法

操作

行号

仅当龙出异常

com.alibabacloud.hptershopproductser

MIceSeniceProductsricemplEnhan

rBySpringcGLIBSS4635De55.confrmlnven

耗时大于

tory

300

org.springframework.cglib.proxyMeth

钻入

对象反序列化层级

odIntercoptor.intercepr

com.alibabacloud.hipstershop.pro

添加参敌

paramsp-xy

ductscrvice.serice.Productservicel

Value

mpl.confirmlnventory

+添加参数

63

佑入

java.tang.String.equals

Com.alibabacloud.nipstershop.

钻入

64

productservice.utils.Commonuti

确认

取消

LgetLocallp

佑入

65

Oms

java.util.Random.cinit

钻入

Oms

java.lang.Stringspit

66

钻入

Om

javautilArraysaList

java.uta.HashSet.cinit

钻入

Oms

java.lang.String.equalslanoreCa

钻入

Oms

图 4


点击确定后,点击右上角刷新图标再次诊断,这次抓取到一次耗时1501ms的方法调用,发现原来是在该方法的执行过程中,执行了Thread.sleep() 方法。


image.png

确定

重置

com.albabacloudhiostorshop.produccc

confirminventory

com.alibabacloud.hiptso.rdce

停改诊断参数查看方法源码

返回值:查看

异常:

执行耗时:1501.49ms

入梦:查看

方法名:contirmlnventory

行号

时间铺(ms)

操作

语用信息

调用方法

com.alibabacloud.hipstershop.productser

viceservice.ProductservicelmplssEnhance

1501ms

rBySpringcGLiB$$5abccood.confirmlnvent

org-springtramework.cglib.proxy.Meth

1501ms

odlnterceptor.intercept

com.alibabacloud.hipstershop.prod

1500ms

uctservice.service.Productservicelm

pl.conturminventory

最小耗时:0.最大耗时:0,平均耗时:

63

钻入

java.lang.String.equals

Oms

0,两用次数:2

com.alibabacloud.hipstershop.p

64

钻入

roductservice.utils.Commonutil.

Oms

getLocallp

65

站入

Oms

java.utii.Random.cinit

钻入

Oms

java.lang.String.split

66

钻入

Oms

java.utilArraysasList

钻入

java.util.HashSet.init

Oms

java.lang.String.equalslgnoreCa

67

Oms

钻入

73

站入

Oms

java.util.Set.contains

钻入

Oms

java.util.Random.nextint

77

钻入

Oms

java.lang.String.equals

钻入

1500ms

java.lang.Thread.sleep

钻入

95

0ms

java.util.List.iterator

钻入

java.util.iterator.hasNext

Oms

图5


到这里,你可能还会好奇,为什么会执行sleep方法呢?这块代码的逻辑是怎样的呢?点击右上角查看方法源码,一目了然的将方法源码与方法执行明细相结合。如下图所示,confirmInventory方法中执行的每一次方法调用最后会以“//-”为前缀展示该方法执行的耗时情况。


image.png图 6


此外,你还可以点击图5 ,列表最右侧的操作列的下钻,快捷的进一步分析confirmInventory调用的子方法的执行情况。这在根因比较深的场景下十分方便好用。


至此,完成了我们这个问题的一个定位演示。


相信ARMS的Arthas诊断功能一定给你留下了深刻的印象,也一定会成为您线上问题诊断的利器,帮助您更快更方便的诊断线上故障。


写在最后


点此快速免费体验ARMS功能此外,企业级分布式应用服务EDAS K8s作为一款一体化的产品,既具备了应用的托管能力,也集成了ARMS的监控诊断能力,同样可以体验ARMS的Arthas诊断功能,可根据您目前的实际情况选择一款产品来体 ARMS的Arthas诊断能力。


备注:上述功能目前仅对部署在K8s为集群中的Java应用有效,后续会支持部署的ECS上的Java应用。


扫码查看更多中间件技术干货和案例:

qrcode_for_gh_94efc5c3f960_344.jpg


相关文章
|
10月前
|
数据处理
如何快速定位现网 BUG
如何快速定位现网 BUG
54 0
|
10月前
|
运维 监控 前端开发
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
记一次线上 bug 的排查分析过程及总结
|
存储 运维 监控
如何定位线上问题?
「你是怎么定位线上问题的?」 这个面试题我在两年社招的时候遇到过,前几天面试也遇到了。我觉得我每一次都答得中规中矩,今天来梳理复盘下,下次又被问到的时候希望可以答得更好。
110 0
|
SQL 关系型数据库 MySQL
线上数据删错了咋办???
线上数据删错了咋办???
153 1
|
Web App开发 JavaScript 前端开发
多个网站遇大面积采集求解决方案
网站URL被大面积扫描采集,关键是IP还多,今天禁止了些IP,但是明天新的IP又来了,主要集中在台州 丽水这些地方,求帮助。 我尝试在服务器安全组禁止IP,但是每天的IP各种各样,心累 39.173.105.217 - - [29/Jul/2022:18:51:16 +0800] "GET /e/3a1e8f5df55c8a23/ HTTP/1.1" 200 60243 "https://mip.english28.com/" "Mozilla/5.0唉,主要是禁止也禁止不完,各种不同的IP都有,请求帮助一个思路,
667 0
多个网站遇大面积采集求解决方案
|
前端开发 JavaScript 程序员
如何追踪线上错误
如何追踪线上错误
149 0
如何追踪线上错误
|
运维 监控 数据可视化
不改一行代码定位线上性能问题
性能问题。 大致的现象是: 我们提供出去的一个 OpenAPI 反应时快时慢,快的时候几十毫秒,慢的时候几秒钟才响应。
|
运维 监控 Java
助你秒级定位线上问题!
经常做后端服务开发的同学,或多或
助你秒级定位线上问题!
|
消息中间件 监控 搜索推荐
线上广告投放出现bug,如何实时发现?
小叽导读:电商平台的搜索广告数据处理链路通常较长,链路中的任一节点出现异常或数据延迟,都有可能会对广告主以及平台造成“资损”影响。 传统的测试手段对全链路功能的测试缺乏有效和全面的测试手段。我们期望可以做到线上广告错误投放问题的实时发现。同时,通过不同的触发检测方式,做到数据变更的各个环节的有效覆盖。
4061 0
线上广告投放出现bug,如何实时发现?
|
缓存 监控 前端开发
惊魂48小时,阿里工程师如何紧急定位线上内存泄露?
云计算场景下的大规模分布式系统中,网络异常、磁盘IO异常、时钟跳变、操作系统异常乃至软件本身可能存在bugs等,均给分布式系统正确运行带来了挑战。持续的监控报警完善是打造稳定高可用分布式系统过程中非常重要的工作,这个也就要求我们研发同学从细节处入手,本文将介绍的场景是针对线上报警的一丝异常,抽丝剥茧找到内存泄露的root cause,全程48小时,跟进修复了潜在风险隐患,并进一步丰富完善监控报警体系的过程。
394 0
惊魂48小时,阿里工程师如何紧急定位线上内存泄露?