ActiveMQ學習筆記05 - 監控

如今不少公司都遵循一個準則,沒有監控的程序不能上線,可見監控的重要性。這裏先介紹下ActiveMQ都須要監控的內容。html

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

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

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

若是平時保持在一個穩定值,有一段時間忽然增高,則有兩種可能。一種多是用戶量大增(固然你們都但願是這樣),另外一種多是某個或者某幾個消息消費者死機了。須要人工干預重啓。數據庫

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

監控隊列:json

若是ActiveMQ使用隊列,須要監控隊列的未消費消息數量,消費者數量,消息入隊和出隊的數量。api

未消費消息數量的含義和監控硬件的內存和硬盤空間差很少,過多的消息堆積多是有消息消費者死機。瀏覽器

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

消息入隊和出隊數量若是增加緩慢或者不增加,則表示消息發送者已經死機。通常是經過增量監控。

監控主題:

若是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的環境中。

相關文章
相關標籤/搜索