背景
笔者所在公司目前处于监控相对较少的情况,除却一些成熟的云产品监控 JVM 情况 和机器CPU外,目前项目内部对于线程池依然是黑盒的状态,由此需寻找一种轻量级的监控方法,借此实现监控线程。
在此过程中,发现一些可以用于实现的技术,所以诞生了这篇文章用于总结与讨论。
需求
- 需要记录 各大中间件组件线程池(Tomcat,RediSsion, Druid)
- 目前项目已经存在使用中的线程池和一些私自NEW的线程对象, 需要无缝加入这些线程的监控
- 轻量级(市面上存在成熟的线程池监控方法,但项目不适用于投入过多新资源做这种生产级别监控)
- 记录的信息主要是线程的个数,记录所在时间点内活跃线程的主要对象,活跃数,活跃时间(笔者所在系统经常偶发CPU暴涨,随后又下降,虽根据暴涨时间点的线程栈猜出是三方组件客户端连接池设置异常,但由于缺少监控和自身技术原因,无法分析与明确是否为确切原因,所以借此想获取更多系统的运行信息,从而开始此篇调研之路)
JMX(Java Management Extensions),监控管理框架
一种程序语言自身自带的框架,由笔者自身的学习来看,该框架可以动态的获取本地程序内部中的所有信息,包括程序的CPU,内存,各大组件线程池中的线程等等信息,且支持动态的修改程序中的对象数据(比如修改某个非配置类bean中的某个值,而不用停止程序),且支持远程连接修改。
笔者稍后会出一篇学习JMX的心得,主要涵盖JMX用于监控管理的应用和程序设计。目前从结果来看,假设程序中加入定时器,获取所有线程的存活时间进行打印,满足笔者所需要求。
生产级别监控解决方案
笔者暂不做了解,一般这种方案会携带各大组件,甚至一些成熟云产品自身就带有无侵入式的产品。可以做到成熟的监控,监控和响应能力也很强,但是伴随而来也是成本的考虑,所以暂不做该方面的了解
三方开源组件()
一些三方的轻量级的开源组件也可以做到监控各类线程池与资源的功能,一般照着用就好,在此指出笔者看到的一些开源组件如:Dynamictp 等(实在是了解甚少)
但是笔者多数是对于如何实现监控的原理很感兴趣,所以也会观摩此类组件的源码,用于学习。
总结
从目前来看,笔者倾向于使用三方开源或者是JMX自己编写逻辑打印日志。