关于Prometheus CLR异常指标异常峰值及排查工具的问询
.NET Framework应用异常监控问题解答
查询语句的正确性分析
increase(windows_netframework_clrexceptions_exceptions_thrown_total{instance="servername:9182"}[1m])语法本身合法,但出现60万次的异常峰值大概率是统计逻辑问题:
increase()计算指定时间窗口内的计数器增量,但如果容器内应用进程发生重启(比如应用池回收、进程崩溃重启),计数器会重置为0,此时increase()会把重置后的累计值误算为增量,导致数值虚高。建议改用rate()函数,它能自动处理计数器重置场景,调整后的查询语句:rate(windows_netframework_clrexceptions_exceptions_thrown_total{instance="servername:9182"}[1m])- 检查
instance标签是否精准,避免匹配到多个重复监控目标,导致数据叠加放大。
查看异常类型的工具
- Windows事件查看器:通过
docker exec进入容器后,运行eventvwr.msc打开事件查看器,在Windows日志 -> 应用程序中查找.NET Runtime相关日志,里面会记录未处理异常的类型、堆栈信息。 - PerfView工具:微软官方性能分析工具,可捕获ETW(Event Tracing for Windows)事件,选择
Microsoft-Windows-DotNETRuntime/Exception提供者,能收集所有抛出的托管异常(包括已捕获的),还能关联非托管异常的调用栈信息。 - 应用内日志记录:在ASP.NET MVC应用中,通过全局异常过滤器(
HandleErrorAttribute)或者Global.asax的Application_Error事件,用log4net、NLog等日志框架记录异常类型、堆栈,直接定位应用内的异常来源。
非托管异常的统计说明
windows_netframework_clrexceptions_exceptions_thrown_total仅统计CLR托管异常。非托管库抛出的原生异常(如C++ SEH异常),只有当被CLR捕获并包装为SEHException时,才会被该计数器统计。如果非托管异常未被托管代码处理,需查看Windows日志 -> 系统中的相关报错,或用PerfView捕获非托管事件来分析。
内容的提问来源于stack exchange,提问作者minhtuanta
相关产品推荐
相关产品推荐

