怎么监控线程池,才能帮助开发者快速定位线上错误?

本文探讨Java线程池监控,包括如何监控运行数据(推荐定时获取而非运行时埋点)、监控指标(如线程池负载、任务完成总量等)及其对性能的影响、数据存储策略(如使用时序数据库或MySQL)以及如何定义公共监控,重点介绍了监控图表的展示和数据交互模型。
摘要由CSDN通过智能技术生成

大部分情况下,线程池的运行情况对于使用者来说是个黑盒。

运行情况不可知,会导致生产出现事故问题排查困难,以及线程池参数难以定义

文章围绕线程池监控展开,讨论线程池如何监控、监控的指标以及监控数据的存储展示。

1. 如何监控运行数据

设想一下,如果想监控线程池的运行数据,你会怎么操作?

这里提供两种常规思路:

  1. 线程池运行时埋点,每一次运行任务都进行统计;

  2. 定时获取线程池的运行数据。

这里我推荐第二种。因为线程池的监控 API 会通过获取主锁来控制结果的相对准确性,性能相对较差,后面会详细说明。

为什么叫相对准确?

因为任务和线程的状态在计算过程中可能会动态变化,只能给到一个近似值,保证不了绝对准确。

模拟下定时采集线程池运行时数据的代码:

private ScheduledThreadPoolExecutor collectVesselExecutor;
String collectVesselTaskName = "client.scheduled.collect.data";collectVesselExecutor = new ScheduledThreadPoolExecutor(        new Integer(1),        ThreadFactoryBuilder.builder().daemon(true).prefix(collectVesselTaskName).build());
// 延迟 initialDelay 后循环调用. scheduleWithFixedDelay 每次执行时间为上一次任务结束时, 向后推一个时间间隔collectVesselExecutor.scheduleWithFixedDelay(        () -> runTimeGatherTask(),        properties.getInitialDelay(),        properties.getCollectInterval(),        TimeUnit.MILLISECONDS);

一般线程池分为两种方式创建,Spring Bean 和非 Spring Bean,假设创建的线程池是 Spring 管理的。

我们只需要在 Spring 容器启动成功后,延迟一段时间后开始采集运行数据就 OK 了。

不论线程池是否由 Spring 管理,采集的方式大致相同。一种从 Spring 容器取,一种是创建好线程池后放到一个自定义容器。

2. 监控的指标有哪些?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值