1、问题
最近接到一个新需求,要求监控hive服务。监控这里,目前已知的大数据平台组件比如FusionInsight、CDH对服务的监控做的就很好,无奈,我司的产品属于小本经营,自己从apache里面拿来hive源码,然后直接改点配置文件,就准备上线。只是突然发现hive的监控还没有,目前只能调用hive 监控webui来监控,访问hive的jmx接口来做。但是我们自身还是想对hive的jmx进行一个包装,嵌入到自己的系统中。这里对新增了需求,要求对hive metric进行一番了解。
2、hive metric体系
源码所在位置:
metric的核心类为:CodahaleMetrics,依赖的是第三方度量库。该库的详细功能可以参考下文:
https://blog.csdn.net/houzhizhen/article/details/71540496
对于hive metric的源码解释可以看下面的博客:
https://blog.csdn.net/dabokele/article/details/84449789
3、疑问:
阅读上述博客以及相关源码后,可以知道hive metric的reporter有两种方式:json和jmx
在web界面可以通过访问http://hiveserver2Ip:10002/jmx就可以获取一个json结果。
这个json结果的实现类为:JMXJsonServlet,这个servlet只是tomcat中的servlet,用于实现http请求的处理,json结果的返回。但是并没有显示的看到CodahaleMetrics的调用。
不过,最后还是发现了一些蛛丝马迹,这里就需要对jmx的原理有一定的了解:
4、jmx基本原理
这里上个图,也是借鉴别人的博客,链接找不到了,如介意,我立马删掉,要发扬这种分享精神!
一句话总结:
(1)java进程中需要启动MBeanServer,mbean需要注册在mbs中,每个mbs可以使用http协议、rmi协议进行访问,其实说到底都是对socket编程的一种封装
(2)java服务的业务server也是对socket编程的一种封装。
5、继续
回到上文中的问题JMXJsonServlet和CodahaleMetrics是怎么关联上的?
这里有个核心代码:
MBeanServer的初始化:
JMXJsonServlet类 使用ManagementFactory.getPlatformMBeanServer()来初始化,通过该方法获取的MBeanServer这个对象是一个单例
@Override
public void init() throws ServletException {
// Retrieve the MBean server
mBeanServer = ManagementFactory.getPlatformMBeanServer();
jsonFactory = new JsonFactory();
}
CodahaleMetrics类中也使用了使用ManagementFactory.getPlatformMBeanServer()来初始化
//register JVM metrics
registerAll("gc", new GarbageCollectorMetricSet());
registerAll("buffers", new BufferPoolMetricSet(ManagementFactory.getPlatformMBeanServer()));
registerAll("memory", new MemoryUsageGaugeSet());
registerAll("threads", new ThreadStatesGaugeSet());
registerAll("classLoading", new ClassLoadingGaugeSet());
目前只是发现了这样的关系,但是CodahaleMetrics类的比较庞大,目前还没有了解到它是具体如何使用的。后续继续补充