/** * If mx4j-tools is in the classpath call maybeLoad to load the HTTP interface of mx4j. * * The default port is 8082. To override that provide e.g. -Dmx4jport=8083 * The default listen address is 0.0.0.0. To override that provide -Dmx4jaddress=127.0.0.1 * This feature must be enabled with -Dmx4jenable=true * * This is a Scala port of org.apache.cassandra.utils.Mx4jTool written by Ran Tavory for CASSANDRA-1068 * */
它通过调用maybeLoad函数实现基于http的mx4j监控,改函数方法名特别有趣,看完源码后我们可以更清楚作者的风趣了:
try { debug("Will try to load MX4j now, if it's in the classpath"); val mbs = ManagementFactory.getPlatformMBeanServer() val processorName = new ObjectName("Server:name=XSLTProcessor") val httpAdaptorClass = Class.forName("mx4j.tools.adaptor.http.HttpAdaptor") …… val xsltProcessorClass = Class.forName("mx4j.tools.adaptor.http.XSLTProcessor") …… info("mx4j successfuly loaded") true } catch { case e: ClassNotFoundException => { info("Will not load MX4J, mx4j-tools.jar is not in the classpath"); } case e => { warn("Could not start register mbean in JMX", e); } }
因为kafka源码包中并不提供mx4j-tools.jar,因此上述代码实际不能实现监控,你懂了maybeLoad的具体意义了吧??而且感觉开发者应该也有过相关jar包
Mx4jLoader在KafkaServer.scala中调用,因此每开启一个kafka broker实际上也对应开启了一个监控模块,由于没有对应的jar包,实际运行broker时就会出现:对应具体的classpath是什么?具体分析日志,运行broker时会出现以下日志:
上面显示了运行broker时会加载kafka中/core/lib_managed/scala_2.8.0/compile下的所有jar包,好,我们把对应的jar扔到该目录下吧。
mx4j-tool.jar可以在网站 上找到,具体使用3.0.1版本的jar包,也许你要问为什么:因为坑爹的1.1版本中根本没有诸如mx4j.tools.adaptor.http.HttpAdaptor等class。 将对应jar放到classpath下后,重新运行broker,日志如下:出现以上日志就表明你终于走到最后一步了,下面就是开启浏览器(具体输入ip:8082,如果你没有改kafka任何配置或源码,请一定记得端口是8082),happy你的成果吧,以下为最终监控界面结果:
感谢公司张大神的帮助,最后要说的是,记得参与kafka 官方论坛,浏览相关maillist。还有,如果你还不能翻墙,那建议你还是先学会翻墙吧。