Micrometer的timer在record块抛出异常时是否仍会记录指标?
问题描述
简单示例如下:
fun main(): String? { val response: String? = null meterRegistry.timer("name").record { response = getResponse() // throws exception } return response }
该场景下getResponse()方法抛出异常,且main方法中没有做异常捕获处理,请问这种情况下对应的指标是否仍会被记录并同步到Grafana?
解答
结论
指标仍然会被正常记录并同步到Grafana
原因说明
Micrometer的Timer.record()方法底层用try-finally逻辑实现:进入代码块时就启动计时,无论代码块是正常返回还是抛出未捕获的异常,最终都会在finally块中完成计时数据的统计,对应的调用次数、本次请求的执行耗时都会被计入该Timer的指标数据。
只要你的指标采集链路(Micrometer对接监控存储、监控存储到Grafana的同步配置)没有故障,该条异常请求的指标就会正常同步到Grafana展示。
扩展提示
如果业务需要仅统计无异常的请求指标,可以自行调整逻辑:不在代码块外层套默认的record方法,仅在代码块执行成功后主动调用计时上报接口即可。
内容的提问来源于stack exchange,提问作者matthewfoldes
相关产品推荐
相关产品推荐

