from:https://m.oschina.net/u/719192?ft=&p=2

現在很多公司都遵循一個準則,沒有監控的程序不能上線,可見監控的重要性。這里先介紹下ActiveMQ都需要監控的內容。

監控硬件物理空間是否充足:

ActiveMQ有3個重要的參數,存儲空間百分比,內存空間百分比和臨時空間百分比。這三個參數的意義很明顯,如果值到了100,則表明硬件空間已滿,Broker不能再接受任何的消息了,除非有消息消費并且刪除,Broker才可以再接收消息。

如果這些值長時間都比較高,接近閥值,則表示硬件的配置不能滿足要求,建議更換硬件,或者給予ActiveMQ的環境配置比較小,建議給予更多的資源給ActiveMQ。

如果平時保持在一個穩定值,有一段時間突然增高,則有兩種可能。一種可能是用戶量大增(當然大家都希望是這樣),另一種可能是某個或者某幾個消息消費者死機了。需要人工干預重啟。

還有一種可能是平時保持在一個穩定值,但是一段時間內突然降低了,則表示消息的生產者可能出現問題了。

監控隊列:

如果ActiveMQ使用隊列,需要監控隊列的未消費消息數量,消費者數量,消息入隊和出隊的數量。

未消費消息數量的含義和監控硬件的內存和硬盤空間差不多,過多的消息堆積可能是有消息消費者死機。

消費者數量應該是一個相對固定的值,這個值減少,就直接表示有的消費者已經死機。

消息入隊和出隊數量如果增長緩慢或者不增長,則表示消息發送者已經死機。一般是通過增量監控。

監控主題:

如果ActiveMQ使用主題,需要監控的內容和隊列相似,但是沒有未消費的消息數量。這里指的注意的是,ActiveMQ提供Advisory Message,用于幫助使用統計一些額外信息,詳細情況在后面介紹。

監控訂閱者:

同樣,如果ActiveMQ使用主題,訂閱者的信息就十分重要。需要監控已經下線的訂閱者。


介紹完需要監控的內容,下面介紹一下ActiveMQ提供的幾種監控方法。

Web Console監控:

之所以先介紹這個,是因為Web Console是最簡單的,不需要任何配置就能使用的監控方式。同時也是最直觀的監控方式。

直接在瀏覽器訪問http://activemq-host:8161/admin/。把localhost換成你activemq啟動機器的ip,端口號默認是8161,可以在${ACTIVEMQ_HOME}/conf/jetty.xml中修改。默認的用戶名和密碼都是admin。

進入頁面首先看到


其中下面的紅色框中標示出的就是硬件物理空間。

然后點擊上面紅色框可以進入隊列的監控頁面。

可以看到上面所提到的隊列的一些重要數據。點擊傍邊的Topics可以進入主題監控頁面,大致差不多,就不截圖了。

下面看一下訂閱者監控界面。

需要重點關注的是中間紅色框圈住的部分,是離線的訂閱者。

這樣的頁面一目了然,非常適合人類觀看。但是缺點是,不適合程序直接抓數據,寫監控腳本,自動報警等。這時你一定發現了這張圖右邊紅色框部分。分別提供了隊列,主題和訂閱者的xml數據,下圖是隊列的xml數據。

這樣就便于程序去訪問這些數據。但是缺點是數據不夠全,且xml也不如json容易解析,用shell腳本解析的話比較麻煩。shell解析的話,命令行的方式才是最舒服的。

命令行監控:

ActiveMQ當然也提供了命令行監控的方式。執行${ACTIVEMQ_HOME}/bin/activemq,會列出命令行的使用幫助。請注意雖然Windows平臺也可以使用這個命令行,但是僅僅限于啟動ActiveMQ實例,其他命令都不能很好的支持,所以這里所說的命令行方式,都是在Linux平臺上的。

限于篇幅,這里只是截取了重要的部分。可以看到命令行提供了16個命令,包括start,stop,restart,console等啟動停止實例相關的命令。還有一些控制ActiveMQ Broker的命令,如create,purge等。這里主要介紹幾個監控可能用得到的命令

activemq status,顯示當前的ActiveMQ是否運行正常,并且能顯示pid。

activemq list,列出當前Broker名字。

activemq bstat,顯示當前Broker的統計信息。

activemq query,根據篩選條件顯示Broker的統計信息。如:activemq query -QQueue=string_queue,是只顯示string_queue這個隊列的統計信息。更多使用方法可以使用activemq query --help顯示幫助。

activemq browse,可以查詢當前Broker為被消費的消息,會顯示消息的詳細信息,如消息頭,消息內容,優先級等。類似于數據庫的查詢功能。有自己的一套查詢語法但是不是很復雜,同樣可以使用activemq browse --help顯示幫助。需要注意的是,只有Queue才可以查詢,Topic是不可以的,所以這個功能雖然強大,但是有點雞肋。

activemq dstat,比較有用的一個功能,可以用來查詢隊列的關鍵數值,如隊列大小,生產者消費者數量,消息出隊入隊統計等。還可以支持通過類別查詢,如只查詢隊列或者只查詢主題。

個人認為,activemq status和activemq dstat是比較常用的兩個監控命令,可以使用shell,然后grep/awk解析。命令行雖然方便,但是明顯缺失必要的信息,如硬件使用百分比,訂閱者下線信息等。至少目前不能完成監控的全部工作,希望以后可以持續完善功能。

JMX監控:

由Java開發的程序,一般都是支持JMX監控的,ActiveMQ也不例外。JMX監控是最全的,任何細節都可以通過JMX獲取。如果遠程連接JMX監控需要一些額外的配置。本機直接連接不需要,但是由于ActiveMQ是部署在linux上,所以應該很少有人會直接連接本地的JMX,除非是本地開發調試階段。

1. 修改/etc/hosts 檢查hosts文件設置,不用127.0.0.1,用實際IP地址。

2. 修改${ACTIVEMQ_HOME}/bin/active文件。找到下面幾行,是連續的。應該都是注釋掉的,解除注釋,開啟遠程連接JMX,端口號默認是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用戶和密碼文件,必須是當前用戶只讀,別的用戶無權限。否則啟動時會報異常。

chmod 400 ${ACTIVEMQ_HOME}/conf/jmx.*

其中jmx.access是用戶權限配置文件,jmx.password是用戶密碼配置文件。

配置到此,就可以使用jconsole等客戶端連接了。啟動jconsle,選擇遠程進程,填寫remotehost:11099。其中remotehost是ActiveMQ所在機器的ip地址,11099是配置文件中開啟的監聽端口號。默認用戶名是admin,密碼是activemq。默認用戶名和密碼可以在jmx.access和jmx.password修改。連接之后如下圖所示:

可以看到,從左側樹形菜單可以找到ActiveMQ的mbean,然后可以查看任何公開的JMX屬性。

如果你配置完了前3步,仍然不能遠程連接JMX,請繼續下面的配置。

4. 查看${ACTIVEMQ_HOME}/conf/activemq.xml中的broker節點中useJmx="true"屬性。這個屬性可以沒有或者為true,但是不可以是false。

5. 修改${ACTIVEMQ_HOME}/conf/activemq.xml中的broker節點中找到managementContext節點,修改如下:

<managementContext>     <managementContext createConnector="true" connectorPort="11099" /> </managementContext>

其中connectorPort是你想發布的JMX端口號。注意端口號必須和之前${ACTIVEMQ_HOME}/bin/activemq里發布的端口號保持一致。

JMX可以使用java開發程序,進行監測。但是對其他語言的支持有限。讀到這里,你是不是覺得,每種監控方式各有優缺點,但是很難找出一個都很完美的方式,既可以看到全部的信息,又可以輕松的用程序實現監控。如果你有這方面的需求,請你繼續看下一個監控方式。

JMX REST API:

可能你還記得,之前提到的Web Console也有xml的數據展現形式,但是解析困難且數據不全。而命令行模式數據更加不全。所以,ActiveMQ提供把JMX導出為REST API。這樣就最大限度的滿足了各種需求,既有完整的數據,又可以方便編寫程序監控。當然如果以后命令行的方式能提供更多的信息,那么這個JMX REST API就可以被替代了。但是至少現在來說,他是不可替代的。

ActiveMQ使用一個開源的組件Jolokia來將JMX自動發布成為REST API。如果使用這個方式,你不需要配置那些上一節提到的繁瑣遠程JMX配置。他的原理是使用本地的JMX,然后通過HTTP發布出來,并不是遠程訪問JMX。

在瀏覽器訪問http://activemq-host:8161/api/jolokia/。默認的用戶名和密碼同樣都是admin。可以看到瀏覽器會返回json信息來描述當前系統。

{"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發布的任何mbean。

http://activemq-host:8161/api/jolokia/list  顯示當前所有的mbean。

http://activemq-host:8161/api/jolokia/read/<mbean name >/<attribute name> 顯示某個mbean的某個屬性

還有很多其他的操作,如http://activemq-host:8161/api/jolokia/write/<mbean name >/<attribute name>可以動態執行方法。由于本篇文章只涉及監控,所以其他的操作先不深入。

我們重點關注http://activemq-host:8161/api/jolokia/read/。

先說一下Mbean名字的規則。一般的MBean名字類似于:org.apache.activemq:type=Broker,brokerName=DemoBroker

org.apache.activemq:是ActiveMQ在這個Mbean的Domain名,可以修改managementContext的jmxDomainName中配置名稱。

<managementContext>     <managementContext createConnector="true" connectorPort="11099" jmxDomainName="MyBroker" /> </managementContext>

type=Broker是固定的。

brokerName=DemoBroker,其中DemoBroker是在配置文件中Broker所配置的名字。

后面會有一些自定義屬性。如:destinationType=Queue,destinationName=pojo_queue。

看到這里你可能會比較迷惑,下面給出例子,請慢慢體會。

http://10.2activemq-host:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=DemoBroker/TotalEnqueueCount

獲取入隊的消息總數,返回結果如下:

{"request":{"mbean":"org.apache.activemq:brokerName=DemoBroker,type=Broker","attribute":"TotalEnqueueCount","type":"read"},"value":5672,"timestamp":1405501289,"status":200}

關鍵的數據是value的值5672,表示有5672個消息入隊。

如果使用shell編寫監控腳本,可以使用命令:

wget --user admin --password admin --auth-no-challenge http://activemq-host:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/TotalEnqueueCount


下面列出幾個關鍵的監控屬性。

<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,service=Health/CurrentStatus

獲取當前系統狀態


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/MemoryPercentUsage

獲取內存使用量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/StorePercentUsage

獲取硬盤空間使用量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/TempPercentUsage

獲取臨時文件硬盤空間使用量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/QueueSize

獲取隊列pojo_queue的未消費消息數量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/ProducerCount

獲取隊列pojo_queue的生產者數量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/ConsumerCount

獲取隊列pojo_queue的消費者數量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/EnqueueCount

獲取隊列pojo_queue的已消費消息數量


<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/DequeueCount

獲取隊列pojo_queue的已接收消息數量


<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的訂閱者是否已經下線

Advisory Message監控:

ActiveMQ提供了一些額外的信息幫助用戶獲取系統狀態,這些額外信息都存在主題中,以ActiveMQ.Advisory.開頭。這些信息可以通過前面說的任何一種方式查詢。這些消息包括Queue/Topic創建銷毀的次數,消費比較慢的消費者統計等等。可以參考官方文檔查詢每個Advisory Message的意義。

插件監控:

ActiveMQ還提供了一些額外的插件來監控系統,主要有可視化插件監控和統計插件監控,需要在activemq.xml中進行配置,最主要的有<connectionDotFilePlugin/>,<destinationDotFilePlugin/>和<statisticsBrokerPlugin/>。對于一些生成圖標的監控系統比較有用。下面是connectionDotFilePlugin的使用截圖。

第三方監控:

最后一種監控方式就是第三方提供的監控,這種監控主要包括ActiveMQ Monitor,Apache ActiveMQBrowser ,HermesJMS等。由于是第三方提供的監控平臺,所以一旦activemq升級,監控平臺不升級,可能會帶來兼容問題,所以請謹慎使用。

另外不得不提的是hawtio,也是一個第三方提供的監控平臺,提供了HTML5的絢麗界面。已經在ActiveMQ 5.9的版本中內嵌入發布包。但是由于Apache內部的意見分歧,在ActiveMQ 5.9.1的版本中又將其刪除。如果想用,只能自己下載hawtio部署到ActiveMQ的環境中。