from:https://m.oschina.net/u/719192?ft=&p=2
現(xiàn)在很多公司都遵循一個(gè)準(zhǔn)則,沒有監(jiān)控的程序不能上線,可見監(jiān)控的重要性。這里先介紹下ActiveMQ都需要監(jiān)控的內(nèi)容。
監(jiān)控硬件物理空間是否充足:
ActiveMQ有3個(gè)重要的參數(shù),存儲(chǔ)空間百分比,內(nèi)存空間百分比和臨時(shí)空間百分比。這三個(gè)參數(shù)的意義很明顯,如果值到了100,則表明硬件空間已滿,Broker不能再接受任何的消息了,除非有消息消費(fèi)并且刪除,Broker才可以再接收消息。
如果這些值長(zhǎng)時(shí)間都比較高,接近閥值,則表示硬件的配置不能滿足要求,建議更換硬件,或者給予ActiveMQ的環(huán)境配置比較小,建議給予更多的資源給ActiveMQ。
如果平時(shí)保持在一個(gè)穩(wěn)定值,有一段時(shí)間突然增高,則有兩種可能。一種可能是用戶量大增(當(dāng)然大家都希望是這樣),另一種可能是某個(gè)或者某幾個(gè)消息消費(fèi)者死機(jī)了。需要人工干預(yù)重啟。
還有一種可能是平時(shí)保持在一個(gè)穩(wěn)定值,但是一段時(shí)間內(nèi)突然降低了,則表示消息的生產(chǎn)者可能出現(xiàn)問題了。
監(jiān)控隊(duì)列:
如果ActiveMQ使用隊(duì)列,需要監(jiān)控隊(duì)列的未消費(fèi)消息數(shù)量,消費(fèi)者數(shù)量,消息入隊(duì)和出隊(duì)的數(shù)量。
未消費(fèi)消息數(shù)量的含義和監(jiān)控硬件的內(nèi)存和硬盤空間差不多,過多的消息堆積可能是有消息消費(fèi)者死機(jī)。
消費(fèi)者數(shù)量應(yīng)該是一個(gè)相對(duì)固定的值,這個(gè)值減少,就直接表示有的消費(fèi)者已經(jīng)死機(jī)。
消息入隊(duì)和出隊(duì)數(shù)量如果增長(zhǎng)緩慢或者不增長(zhǎng),則表示消息發(fā)送者已經(jīng)死機(jī)。一般是通過增量監(jiān)控。
監(jiān)控主題:
如果ActiveMQ使用主題,需要監(jiān)控的內(nèi)容和隊(duì)列相似,但是沒有未消費(fèi)的消息數(shù)量。這里指的注意的是,ActiveMQ提供Advisory Message,用于幫助使用統(tǒng)計(jì)一些額外信息,詳細(xì)情況在后面介紹。
監(jiān)控訂閱者:
同樣,如果ActiveMQ使用主題,訂閱者的信息就十分重要。需要監(jiān)控已經(jīng)下線的訂閱者。
介紹完需要監(jiān)控的內(nèi)容,下面介紹一下ActiveMQ提供的幾種監(jiān)控方法。
Web Console監(jiān)控:
之所以先介紹這個(gè),是因?yàn)閃eb Console是最簡(jiǎn)單的,不需要任何配置就能使用的監(jiān)控方式。同時(shí)也是最直觀的監(jiān)控方式。
直接在瀏覽器訪問http://activemq-host:8161/admin/。把localhost換成你activemq啟動(dòng)機(jī)器的ip,端口號(hào)默認(rèn)是8161,可以在${ACTIVEMQ_HOME}/conf/jetty.xml中修改。默認(rèn)的用戶名和密碼都是admin。
進(jìn)入頁面首先看到

其中下面的紅色框中標(biāo)示出的就是硬件物理空間。
然后點(diǎn)擊上面紅色框可以進(jìn)入隊(duì)列的監(jiān)控頁面。

可以看到上面所提到的隊(duì)列的一些重要數(shù)據(jù)。點(diǎn)擊傍邊的Topics可以進(jìn)入主題監(jiān)控頁面,大致差不多,就不截圖了。
下面看一下訂閱者監(jiān)控界面。

需要重點(diǎn)關(guān)注的是中間紅色框圈住的部分,是離線的訂閱者。
這樣的頁面一目了然,非常適合人類觀看。但是缺點(diǎn)是,不適合程序直接抓數(shù)據(jù),寫監(jiān)控腳本,自動(dòng)報(bào)警等。這時(shí)你一定發(fā)現(xiàn)了這張圖右邊紅色框部分。分別提供了隊(duì)列,主題和訂閱者的xml數(shù)據(jù),下圖是隊(duì)列的xml數(shù)據(jù)。

這樣就便于程序去訪問這些數(shù)據(jù)。但是缺點(diǎn)是數(shù)據(jù)不夠全,且xml也不如json容易解析,用shell腳本解析的話比較麻煩。shell解析的話,命令行的方式才是最舒服的。
命令行監(jiān)控:
ActiveMQ當(dāng)然也提供了命令行監(jiān)控的方式。執(zhí)行${ACTIVEMQ_HOME}/bin/activemq,會(huì)列出命令行的使用幫助。請(qǐng)注意雖然Windows平臺(tái)也可以使用這個(gè)命令行,但是僅僅限于啟動(dòng)ActiveMQ實(shí)例,其他命令都不能很好的支持,所以這里所說的命令行方式,都是在Linux平臺(tái)上的。

限于篇幅,這里只是截取了重要的部分??梢钥吹矫钚刑峁┝?6個(gè)命令,包括start,stop,restart,console等啟動(dòng)停止實(shí)例相關(guān)的命令。還有一些控制ActiveMQ Broker的命令,如create,purge等。這里主要介紹幾個(gè)監(jiān)控可能用得到的命令
activemq status,顯示當(dāng)前的ActiveMQ是否運(yùn)行正常,并且能顯示pid。

activemq list,列出當(dāng)前Broker名字。
activemq bstat,顯示當(dāng)前Broker的統(tǒng)計(jì)信息。
activemq query,根據(jù)篩選條件顯示Broker的統(tǒng)計(jì)信息。如:activemq query -QQueue=string_queue,是只顯示string_queue這個(gè)隊(duì)列的統(tǒng)計(jì)信息。更多使用方法可以使用activemq query --help顯示幫助。
activemq browse,可以查詢當(dāng)前Broker為被消費(fèi)的消息,會(huì)顯示消息的詳細(xì)信息,如消息頭,消息內(nèi)容,優(yōu)先級(jí)等。類似于數(shù)據(jù)庫的查詢功能。有自己的一套查詢語法但是不是很復(fù)雜,同樣可以使用activemq browse --help顯示幫助。需要注意的是,只有Queue才可以查詢,Topic是不可以的,所以這個(gè)功能雖然強(qiáng)大,但是有點(diǎn)雞肋。
activemq dstat,比較有用的一個(gè)功能,可以用來查詢隊(duì)列的關(guān)鍵數(shù)值,如隊(duì)列大小,生產(chǎn)者消費(fèi)者數(shù)量,消息出隊(duì)入隊(duì)統(tǒng)計(jì)等。還可以支持通過類別查詢,如只查詢隊(duì)列或者只查詢主題。

個(gè)人認(rèn)為,activemq status和activemq dstat是比較常用的兩個(gè)監(jiān)控命令,可以使用shell,然后grep/awk解析。命令行雖然方便,但是明顯缺失必要的信息,如硬件使用百分比,訂閱者下線信息等。至少目前不能完成監(jiān)控的全部工作,希望以后可以持續(xù)完善功能。
JMX監(jiān)控:
由Java開發(fā)的程序,一般都是支持JMX監(jiān)控的,ActiveMQ也不例外。JMX監(jiān)控是最全的,任何細(xì)節(jié)都可以通過JMX獲取。如果遠(yuǎn)程連接JMX監(jiān)控需要一些額外的配置。本機(jī)直接連接不需要,但是由于ActiveMQ是部署在linux上,所以應(yīng)該很少有人會(huì)直接連接本地的JMX,除非是本地開發(fā)調(diào)試階段。
1. 修改/etc/hosts 檢查hosts文件設(shè)置,不用127.0.0.1,用實(shí)際IP地址。
2. 修改${ACTIVEMQ_HOME}/bin/active文件。找到下面幾行,是連續(xù)的。應(yīng)該都是注釋掉的,解除注釋,開啟遠(yuǎn)程連接JMX,端口號(hào)默認(rèn)是11099。
ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=11099 " ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote"
3. 修改JMX用戶和密碼文件,必須是當(dāng)前用戶只讀,別的用戶無權(quán)限。否則啟動(dòng)時(shí)會(huì)報(bào)異常。
chmod 400 ${ACTIVEMQ_HOME}/conf/jmx.*
其中jmx.access是用戶權(quán)限配置文件,jmx.password是用戶密碼配置文件。
配置到此,就可以使用jconsole等客戶端連接了。啟動(dòng)jconsle,選擇遠(yuǎn)程進(jìn)程,填寫remotehost:11099。其中remotehost是ActiveMQ所在機(jī)器的ip地址,11099是配置文件中開啟的監(jiān)聽端口號(hào)。默認(rèn)用戶名是admin,密碼是activemq。默認(rèn)用戶名和密碼可以在jmx.access和jmx.password修改。連接之后如下圖所示:

可以看到,從左側(cè)樹形菜單可以找到ActiveMQ的mbean,然后可以查看任何公開的JMX屬性。
如果你配置完了前3步,仍然不能遠(yuǎn)程連接JMX,請(qǐng)繼續(xù)下面的配置。
4. 查看${ACTIVEMQ_HOME}/conf/activemq.xml中的broker節(jié)點(diǎn)中useJmx="true"屬性。這個(gè)屬性可以沒有或者為true,但是不可以是false。
5. 修改${ACTIVEMQ_HOME}/conf/activemq.xml中的broker節(jié)點(diǎn)中找到managementContext節(jié)點(diǎn),修改如下:
<managementContext> <managementContext createConnector="true" connectorPort="11099" /> </managementContext>
其中connectorPort是你想發(fā)布的JMX端口號(hào)。注意端口號(hào)必須和之前${ACTIVEMQ_HOME}/bin/activemq里發(fā)布的端口號(hào)保持一致。
JMX可以使用java開發(fā)程序,進(jìn)行監(jiān)測(cè)。但是對(duì)其他語言的支持有限。讀到這里,你是不是覺得,每種監(jiān)控方式各有優(yōu)缺點(diǎn),但是很難找出一個(gè)都很完美的方式,既可以看到全部的信息,又可以輕松的用程序?qū)崿F(xiàn)監(jiān)控。如果你有這方面的需求,請(qǐng)你繼續(xù)看下一個(gè)監(jiān)控方式。
JMX REST API:
可能你還記得,之前提到的Web Console也有xml的數(shù)據(jù)展現(xiàn)形式,但是解析困難且數(shù)據(jù)不全。而命令行模式數(shù)據(jù)更加不全。所以,ActiveMQ提供把JMX導(dǎo)出為REST API。這樣就最大限度的滿足了各種需求,既有完整的數(shù)據(jù),又可以方便編寫程序監(jiān)控。當(dāng)然如果以后命令行的方式能提供更多的信息,那么這個(gè)JMX REST API就可以被替代了。但是至少現(xiàn)在來說,他是不可替代的。
ActiveMQ使用一個(gè)開源的組件Jolokia來將JMX自動(dòng)發(fā)布成為REST API。如果使用這個(gè)方式,你不需要配置那些上一節(jié)提到的繁瑣遠(yuǎn)程JMX配置。他的原理是使用本地的JMX,然后通過HTTP發(fā)布出來,并不是遠(yuǎn)程訪問JMX。
在瀏覽器訪問http://activemq-host:8161/api/jolokia/。默認(rèn)的用戶名和密碼同樣都是admin??梢钥吹綖g覽器會(huì)返回json信息來描述當(dāng)前系統(tǒng)。
{"request":{"type":"version"},"value":{"agent":"1.2.1","protocol":"7.1","config":{"discoveryEnabled":"false","agentId":"xxx.xxx.xxx.xxx-29009-71a9b4c7-servlet","agentType":"servlet","agentDescription":"Apache ActiveMQ"},"info":{"product":"activemq","vendor":"Apache","version":"5.10.0"}},"timestamp":1405499528,"status":200}
通過Jolokia API可以訪問JMX發(fā)布的任何mbean。
http://activemq-host:8161/api/jolokia/list 顯示當(dāng)前所有的mbean。
http://activemq-host:8161/api/jolokia/read/<mbean name >/<attribute name> 顯示某個(gè)mbean的某個(gè)屬性
還有很多其他的操作,如http://activemq-host:8161/api/jolokia/write/<mbean name >/<attribute name>可以動(dòng)態(tài)執(zhí)行方法。由于本篇文章只涉及監(jiān)控,所以其他的操作先不深入。
我們重點(diǎn)關(guān)注http://activemq-host:8161/api/jolokia/read/。
先說一下Mbean名字的規(guī)則。一般的MBean名字類似于:org.apache.activemq:type=Broker,brokerName=DemoBroker
org.apache.activemq:是ActiveMQ在這個(gè)Mbean的Domain名,可以修改managementContext的jmxDomainName中配置名稱。
<managementContext> <managementContext createConnector="true" connectorPort="11099" jmxDomainName="MyBroker" /> </managementContext>
type=Broker是固定的。
brokerName=DemoBroker,其中DemoBroker是在配置文件中Broker所配置的名字。
后面會(huì)有一些自定義屬性。如:destinationType=Queue,destinationName=pojo_queue。
看到這里你可能會(huì)比較迷惑,下面給出例子,請(qǐng)慢慢體會(huì)。
http://10.2activemq-host:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=DemoBroker/TotalEnqueueCount
獲取入隊(duì)的消息總數(shù),返回結(jié)果如下:
{"request":{"mbean":"org.apache.activemq:brokerName=DemoBroker,type=Broker","attribute":"TotalEnqueueCount","type":"read"},"value":5672,"timestamp":1405501289,"status":200}
關(guān)鍵的數(shù)據(jù)是value的值5672,表示有5672個(gè)消息入隊(duì)。
如果使用shell編寫監(jiān)控腳本,可以使用命令:
wget --user admin --password admin --auth-no-challenge http://activemq-host:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/TotalEnqueueCount
下面列出幾個(gè)關(guān)鍵的監(jiān)控屬性。
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,service=Health/CurrentStatus
獲取當(dāng)前系統(tǒng)狀態(tài)
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/MemoryPercentUsage
獲取內(nèi)存使用量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/StorePercentUsage
獲取硬盤空間使用量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/TempPercentUsage
獲取臨時(shí)文件硬盤空間使用量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/QueueSize
獲取隊(duì)列pojo_queue的未消費(fèi)消息數(shù)量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/ProducerCount
獲取隊(duì)列pojo_queue的生產(chǎn)者數(shù)量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/ConsumerCount
獲取隊(duì)列pojo_queue的消費(fèi)者數(shù)量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/EnqueueCount
獲取隊(duì)列pojo_queue的已消費(fèi)消息數(shù)量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/DequeueCount
獲取隊(duì)列pojo_queue的已接收消息數(shù)量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Topic,destinationName=pojo_topic,endpoint=Consumer,clientId=pojo_client_1,consumerId=Durable(pojo_client_1_pojo_client_1)/Active
獲取主題pojo_topic的client id為pojo_client_1的訂閱者是否已經(jīng)下線
Advisory Message監(jiān)控:
ActiveMQ提供了一些額外的信息幫助用戶獲取系統(tǒng)狀態(tài),這些額外信息都存在主題中,以ActiveMQ.Advisory.開頭。這些信息可以通過前面說的任何一種方式查詢。這些消息包括Queue/Topic創(chuàng)建銷毀的次數(shù),消費(fèi)比較慢的消費(fèi)者統(tǒng)計(jì)等等。可以參考官方文檔查詢每個(gè)Advisory Message的意義。
插件監(jiān)控:
ActiveMQ還提供了一些額外的插件來監(jiān)控系統(tǒng),主要有可視化插件監(jiān)控和統(tǒng)計(jì)插件監(jiān)控,需要在activemq.xml中進(jìn)行配置,最主要的有<connectionDotFilePlugin/>,<destinationDotFilePlugin/>和<statisticsBrokerPlugin/>。對(duì)于一些生成圖標(biāo)的監(jiān)控系統(tǒng)比較有用。下面是connectionDotFilePlugin的使用截圖。

第三方監(jiān)控:
最后一種監(jiān)控方式就是第三方提供的監(jiān)控,這種監(jiān)控主要包括ActiveMQ Monitor,Apache ActiveMQBrowser ,HermesJMS等。由于是第三方提供的監(jiān)控平臺(tái),所以一旦activemq升級(jí),監(jiān)控平臺(tái)不升級(jí),可能會(huì)帶來兼容問題,所以請(qǐng)謹(jǐn)慎使用。
另外不得不提的是hawtio,也是一個(gè)第三方提供的監(jiān)控平臺(tái),提供了HTML5的絢麗界面。已經(jīng)在ActiveMQ 5.9的版本中內(nèi)嵌入發(fā)布包。但是由于Apache內(nèi)部的意見分歧,在ActiveMQ 5.9.1的版本中又將其刪除。如果想用,只能自己下載hawtio部署到ActiveMQ的環(huán)境中。