接口大面积超时,翻遍监控只有 CPU、内存、GC,线程池的活跃数、队列长度、拒绝次数都没有,只能靠重启先恢复。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,线程池是进程内对象,不注册指标就不会出现在任何面板上。问题发生时只能靠 jstack 现场抓,事后复盘拿不到趋势。
「线程池监控缺失」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
Gauge.build().name("executor_queue_size").labelNames("pool")
.register().setChild(pool.getQueue().size());
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,把活跃数、池大小、队列长度、完成任务数、拒绝次数注册成指标;按池打标签 别把十几个池混成一条线;设置队列长度和拒绝次数的告警阈值;压测一次 确认曲线能反映压力变化。
最后用这个标准收尾,面板上每个池都有独立曲线,压测时队列长度和拒绝次数能看到明显变化。
