基于Actuator的可修改配置的线程池监控
1.概要
之前公司因为使用线程池习惯不好,导致线程池负载负载过高。触发了拒绝策略,导致大量任务丢失。而并没有对这个情况进行监控,导致业务出现故障之后才发现抛出了拒绝异常。所以有必要对大量使用线程池的项目进行监控,并且最好能在不停机的情况下对线程池的参数进行修改,由此我们可以用线程池的hook方法去对线程池的状态进行埋点,并且通过Actuator做可视化监控,自定义Endpoint去修改线程池内部参数,实现可以动态修改线程池参数。
2.实现
1.导入Maven依赖
1 | pom复制代码 <dependency> |
2.编写ThreadPoolMonitor.java监控类
1 | java复制代码 |
3.实现ResizeableBlockingQueue.java可变队列
这里我们直接修改LinkedBlockingQueue的代码,把capacity去掉final,变成一个可变参数。再新增get和set方法。
1 | java复制代码/** |
4.实现ThreadPoolUtil.java
编写线程池工具类,通过Util去创建线程池,并且用HashMap去指向创建的线程池,之后可以通过这个HashMap去获取线程池。
1 | java复制代码/** |
5.实现线程池信息的实体类
实现线程池信息的实体类用来EndPoint返回数据
ThreadPoolDetailInfo.java
1 | java复制代码 |
ThreadPoolInfo.java
1 | java复制代码 |
6.编写EndPoint
通过actuator里的@RestControllerEndpoint注解可以添加Endpoints接口。本质上是和@Endpoint,@WebEndpoint作用是一样的,都是为服务增加actuator 接口,方便管理运行中的服务。但是有一个明显的不同是,@RestControllerEndpoint只支持Http方式的访问,不支持JMX的访问。而且,端点的方法上面只支持@GetMapping,@PostMapping,@DeleteMapping,@RequestMapping等,而不支持@ReadOperation,@WriteOperation,@DeleteOperation。而且它返回的格式是:application/json。
由于我司的监控系统只支持json格式,实际上使用Metrics和Grafana去监控会更好。
1 | java复制代码 |
7.使用线程池监控
- 注解
1 | java复制代码 @Async("asyncExecutor") |
- 直接使用
1 | java复制代码public void test() { |
1. 查看线程详情
1 | ruby复制代码http://localhost/actuator/threadpool/getThreadPoolListInfo //GET请求 |
返回:
1 | json复制代码 [ |
2. 查看线程池参数
1 | ini复制代码http://localhost/actuator/threadpool/getThreadPoolFixInfo?threadPoolName=asyncExecutor //GET请求 |
参数:
名称 | 类型 |
---|---|
threadPoolName | String |
返回:
1 | json复制代码 { |
3. 修改线程池参数
1 | ruby复制代码https://localhost/actuator/threadpool/setThreadPoolInfo //Post请求 |
参数:
名称 | 类型 | 备注 |
---|---|---|
threadPoolName | String | |
corePoolSize | int | 可变 |
maximumPoolSize | int | 可变 |
queueCapacity | int | 可变 |
queueType | String | 不可变 |
请求类型:json
返回: Boolean
以上完整代码在Github中
个人博客
作者水平有限,若有错误遗漏,请指出。
参考文章
本文转载自: 掘金