Kafka uses Yammer Metrics for metrics reporting in both the server and the client. This can be configured to report stats using pluggable stats reporters to hook up to your monitoring system. The easiest way to see the available metrics to fire up jconsole and point it at a running kafka client or server; this will all browsing all metrics with JMX.
可見kafka官方也是提倡使用jmx并且提供了jmx的調用給使用者以監控kafka.
本博文通過使用jmx調用kafka的幾個監測項屬性來講述下如何使用jmx來監控kafka.
有關Jmx的使用可以參考:
<a href="http://blog.csdn.net/u013256816/article/details/52800742">從零開始玩轉JMX(一)——簡介和Standard MBean</a>
<a href="http://blog.csdn.net/u013256816/article/details/52808328">從零開始玩轉JMX(二)——Condition</a>
<a href="http://blog.csdn.net/u013256816/article/details/52817247">從零開始玩轉JMX(三)——Model MBean</a>
<a href="http://blog.csdn.net/u013256816/article/details/52840067">從零開始玩轉JMX(四)——Apache Commons Modeler & Dynamic MBean</a>
在使用jmx之前需要確定kafka開啟了jmx監控,kafka啟動時要添加JMX_PORT=9999這一項,也就是:
部落客自行搭建了一個kafka叢集,隻有兩個節點。叢集中有一個topic(name=default_channel_kafka_zzh_demo),分為5個partition(0 1 2 3 4).
這裡讨論的kafka版本是0.8.1.x和0.8.2.x,這兩者在使用jmx監控時會有差異,差異展現在ObjectName之中。熟悉kafka的同學知道,kafka有topic和partition這兩個概念,topic中根據一定的政策來分為若幹個partitions, 這裡就以此舉例來看,
在0.8.1.x中有關此項的屬性的ObjectName(String值)為:
“kafka.log”:type=”Log”,name=”default_channel_kafka_zzh_demo-*-LogEndOffset”
而在0.8.2.x中有關的屬性的ObjectName為:
kafka.log:type=Log,name=LogEndOffset,topic=default_channel_kafka_zzh_demo,partition=0
是以在程式中要差別對待。
這裡采用三個監測項來示範如果使用jmx進行監控:
上面所說的offset (叢集中的一個topic下的所有partition的LogEndOffset值,即logSize)
sendCount(叢集中的一個topic下的發送總量,這個值是叢集中每個broker中此topic的發送量之和)
sendTps(叢集中的一個topic下的TPS, 這個值也是叢集中每個broker中此topic的發送量之和)
首先是針對單個kafka broker的。
注意代碼中對于兩種不同kafka版本的差別處理。對應前面所說的三個檢測項的方法為:
對于整個叢集的處理需要另外一個類來保證,總體上是對叢集中的每一個broker相應的值進行累加,且看代碼:
運作結果:
觀察運作結果可以發現 6000+4384 = 10384 = 2072+2084+2073+2083+2072,小夥伴們可以揣摩下原因。
可以通過jconsole連接配接service:jmx:rmi:///jndi/rmi://10.101.130.1:9999/jmxrmi或者service:jmx:rmi:///jndi/rmi://10.101.130.2:9999/jmxrmi來檢視相應的資料值。如下圖:

也可以通過指令行的形式來檢視某項資料,不過這裡要借助一個jar包:cmdline-jmxclient-0.10.3.jar,這個請自行下載下傳,網上很多。
将這個jar放入某一目錄,部落客這裡放在了linux系統下的/root/util目錄中,以offset舉例:
0.8.1.x版-讀取topic=default_channel_kafka_zzh_demo,partition=0的Value值:
0.8.2.x版-讀取topic=default_channel_kafka_zzh_demo,partition=0的Value值:
看出規律了嘛?如果還是沒有,部落客再提示一個小技巧,你可以用Jconsole打開相應的屬性,然後将滑鼠浮于其上,Jconsole會跳出tooltips來提示怎麼拼這些屬性的ObjectName.