异常分析

Java应用开启应用监控后,ARMS即可开始监控Java应用,您可以在异常分析页面按照异常名称、接口名称、实例对异常次数、异常列表进行筛选分析,优化产生异常的代码。

ARMS的异常分析功能中,异常对应Java语言的Exception。由于存在try-catch机制,在一次接口调用中,异常不一定会被请求方所感知,多次try-catch会导致一个接口调用对应多个异常的情况。如果存在没有被捕获的异常,影响到了一次接口调用的返回结果,则构成一次错误。

查看异常分析

单击场景化分析页签,然后单击异常分析,即可查看。

pml0QhM7Lg

  • 在快捷筛选区域(图示①),您可以按异常名称、接口名称、实例对异常次数、异常列表进行筛选过滤。

  • 在趋势图区域(图示②),您可以查看应用在指定时间范围抛出该异常的次数,按照异常做堆叠展示。

    单击image.png图标,可以在弹出的对话框中查看该指标在某个时间段的统计情况或对比不同日期在同一时间段的统计情况,通过选择image.png图标可以切换柱状图、趋势图进行展示。

  • 在异常列表区域(图示③),您可以查看异常接口的名称、异常次数、占比、异常信息摘要等。

在异常列表,您可以执行以下操作:

  • 单击操作列的概览,可在右侧面板中查看该异常的异常数趋势、接口和实例维度的异常分布、异常堆栈等概览信息。

    YlA0xfR1uP

  • 单击操作列的调用链,可以查看该调用的链路详情。更多信息,请参见调用链分析

相关文档

应用监控详细的指标信息,请参见应用监控指标说明

常见问题

接口调用中异常次数大于接口请求次数

可能原因如下:

  • ARMS会在被埋点的方法抛出异常时记录异常次数。当一次接口调用过程中多个方法均抛出异常,且这些方法被ARMS探针自动埋点,则ARMS会在一次调用中记录多个异常。

  • 如果同一个异常从底层方法一直抛到顶层方法,且整个方法栈中有多个方法被ARMS埋点,则该异常会被记录多次。

探针版本升级后异常有变化

探针每次版本变化,对应的埋点方法可能增加或减少,相应地在这些埋点方法中抛出的异常也就有可能增加或减少。

接口中看到异常次数不为0,但是业务未捕获到相关异常

在多数被探针埋点的框架代码中,当某些异常在框架层内部捕获并处理,但并未抛到用户业务代码中时,探针能捕获此类异常,但是用户并不能感知到此类异常。

例如,使用MongoTemplate访问MongoDB未报错,但是在ARMS控制台看到有访问MongoDB报错,是因为MongoTemplate中封装了重试逻辑,在一次MongoTemplate的方法调用中,当遇到超时异常时会进行重试,并在多次重试失败后才抛出异常到调用方。所以,在使用MongoTemplate访问MongoDB并且底层有超时重试行为时,就有可能业务并没有看到异常,但是在ARMS控制台能看到异常。

异常栈与接口实际发生的异常不符合

ARMS探针为了提升数据处理和上报效率,会根据异常的异常类名、异常方法栈前三行、异常方法栈后三行生成一个字符串,然后通过CRC64编码为32位的字符串,并在第一次上报的时上报编码值与原始值,后续相同异常仅上报编码值,所以会有两种情况下导致出现异常栈与实际栈不符合:

  • 两个异常的实际完整方法栈不一致, 但是异常类名、异常方法栈前三行、后三行一致。此时,由于上述处理逻辑会导致编码值一致,从而出现问题。

  • 两个异常的异常类名、异常方法栈前三行、后三行不一致,但由于采用了CRC64这种非唯一性编码,所以仍然有可能两者的编码值一致,从而出现问题。

出现上述两种情况,都可以在自定义配置页面的异常高级过滤配置区域适当调大同类异常堆栈区分深度参数。image

应用长时间运行后(30天以上)异常只能看到一个ID

为了优化数据上报量,在一个异常第一次出现时,ARMS会针对异常进行编码并上报编码值与原始值到服务端,服务端会存储该编码值与原始值,存储过期时间为30天。当应用运行30天后,就可能出现无法再通过异常编码返差异常原始值的情况。

某些异常在ARMS控制台看不到

ARMS探针在默认情况下并不能捕获所有异常,只有被ARMS探针埋点的方法抛出的异常才能被ARMS探针采集到。

如果您的探针版本在4.1.12及以上,可以在自定义配置页面的探针开关设置区域打开异常插件,打开该插件后,ARMS会在每个异常实例创建的时候采集该异常数据。