一旦它運(yùn)行起來(lái),你就可以從同一個(gè)web界面中,看到系統(tǒng)信息和RabbitMQ節(jié)點(diǎn)、隊(duì)列的相關(guān)信息,如下面的截圖所示:

更多
Ganglia是集群監(jiān)測(cè)一種廣泛的解決方案,但不是唯一的一個(gè)。其它的解決方案還包括Nagios (www.nagios.org), Zabbix (www.zabbix.com), 以及Puppet (puppetlabs.com).
通過(guò)RabbitMQ排除故障
正如前面食譜提到的, 我們可以通過(guò)一種便利的方式,即以日志文件的方式來(lái)監(jiān)控RabbitMQ行為.
也可以使用RabbitMQ自身來(lái)訪問(wèn)同種信息, 通過(guò)向AMQP client通知broker的活動(dòng).
準(zhǔn)備
要運(yùn)行本食譜,我們需要運(yùn)行RabbitMQ以及Java client library.
如何做
為了消費(fèi)日志消息,你可在Consumer.java中執(zhí)行主方法.你可在Chapter12/Recipe02/Java/src/rmqexample中找到源友. 下面,我們將高亮主要步驟:
1. 創(chuàng)建一個(gè)臨時(shí)匿名隊(duì)列,并將其綁定到AMQP log交換器:
String tmpQueue = channel.queueDeclare().getQueue();
channel.queueBind(tmpQueue,"amq.rabbitmq.log","#");
2. 在消費(fèi)者回調(diào)(ActualConsumer.java)中,可以檢索消息和每個(gè)消息的路由鍵,并將它們打印出來(lái):
String routingKey = envelope.getRoutingKey();
String message = new String(body);
System.out.println(routingKey + ": " + message);
3. 此時(shí),你可以在broker上執(zhí)行任何RabbitMQ操作,并且你會(huì)看到日志輸出到標(biāo)準(zhǔn)輸出上。
如何工作
RabbitMQ log交換器amq.rabbitmq.log是一個(gè)topic交換器,RabbitMQ自身用來(lái)發(fā)布其日志消息.
在我們的示例代碼中,我們使用#通配符來(lái)消費(fèi)所有topics的消息.
例如,通過(guò)運(yùn)行另一份代碼,我們可運(yùn)行同一個(gè)broker的兩個(gè)連接,然后中斷它,我們將下面的輸出:
info: accepting AMQP connection <0.2737.0> (127.0.0.1:54698 ->127.0.0.1:5672)
info: accepting AMQP connection <0.2753.0> (127.0.0.1:54699 ->127.0.0.1:5672)
warning: closing AMQP connection <0.2737.0> (127.0.0.1:54698 ->127.0.0.1:5672):
connection_closed_abruptly
warning: closing AMQP connection <0.2753.0> (127.0.0.1:54699 ->127.0.0.1:5672):
connection_closed_abruptly
值得注意的是,在這里報(bào)告的信息,信息和警告不是自己的一部分,但是我們?cè)诿總€(gè)開(kāi)始打印的路由鍵消息(前一步驟的步驟2)。
TIP
如果我們只想收到警告和錯(cuò)誤消息,我們可以訂閱相應(yīng)的主題.
更多
默認(rèn)情況下,日志交換器-amq.rabbitmq.log被創(chuàng)建在虛擬主機(jī)/中。通過(guò)在RabbitMQ配置文件中定義default_vhost從而設(shè)置其位置是可能的.
追蹤RabbitMQ當(dāng)前活動(dòng)
有時(shí),為了分析和調(diào)試未知的應(yīng)用程序行為,我們需要追蹤RabbitMQ接收和分發(fā)的所有消息.
RabbitMQ提供追蹤這些消息的所謂的流水追蹤工具。
追蹤活動(dòng)可以在運(yùn)行時(shí)啟用和禁用,并且它應(yīng)該只用于調(diào)試,因?yàn)樗?guī)定了broker活動(dòng)的開(kāi)銷.
準(zhǔn)備
要運(yùn)行此食譜,我們需要運(yùn)行此食譜,我們需要運(yùn)行RabbitMQ和Java client library.
如何做
RabbitMQ使用與日志消息中同樣的機(jī)制來(lái)發(fā)送追蹤消息;因此,示例代碼與前一個(gè)食譜中的非常相似.
為了消費(fèi)追蹤消息,你可以執(zhí)行Consumer.java中的主方法,你可在Chapter12/Recipe02/Java/src/rmqexample目錄中找到源碼.這里,我們高亮了主要步驟:
1. 創(chuàng)建一個(gè)臨時(shí)隊(duì)列,并將其綁定到AMQP log交換器上:
String tmpQueue = channel.queueDeclare().getQueue();
channel.queueBind(tmpQueue,"amq.rabbitmq.trace","#");
2.在消費(fèi)者回調(diào)(ActualConsumer.java)中, 可以獲取每個(gè)消息,并使用下面的代碼打印出來(lái):
String routingKey = envelope.getRoutingKey();
String message = new String(body);
Map<String,Object> headers = properties.getHeaders();
LongStringexchange_name = (LongString)
headers.get("exchange_name");
LongString node = (LongString) headers.get("node");
...
3. 可從root用戶(Linux)或在RabbitMQ命令控制臺(tái)(Windows)來(lái)激活firehose,其激活命令如下:
rabbimqctl trace_on
4. 此時(shí),你可以向broker啟動(dòng)生產(chǎn)和發(fā)送消息,然后你們會(huì)在標(biāo)準(zhǔn)輸出中看到追蹤信息.
5. 可調(diào)用下面的命令來(lái)禁用firehose:
rabbimqctl trace_off
如何工作
默認(rèn)情況下,amq.rabbit.trace topic交換器不會(huì)接收任何消息,但一旦激活firehose后(前面步驟的步驟3),所有流經(jīng)broker的消息將被按下面的規(guī)則拷貝:
1.進(jìn)入broker的消息,它們是通過(guò)路由鍵publish.exchange-name發(fā)布的, 這里的exchange-name是消息最初發(fā)布的交換器名稱.
2.離開(kāi)broker的消息,它們是通過(guò)路由鍵deliver.queuename發(fā)布的,這里的queue-name是消息最初被消費(fèi)的隊(duì)列名稱.
3.消息的body是從原始消息中拷貝過(guò)來(lái)的.
4.原始消息的元數(shù)據(jù)會(huì)插入到拷貝消息的header屬性中. 在步驟2中,我們已經(jīng)看到了,如何獲取最初分發(fā)消息的交換器名稱,但獲取所有原始信息也是可以的,即,找到所有可有字段,并將它們插到消息屬性中.firehose的官方文檔鏈接位于:http://www.rabbitmq.com/firehose.html.
調(diào)試RabbitMQ消息
有時(shí),通過(guò)在標(biāo)準(zhǔn)輸出中記錄通過(guò)broker的消息是有用的.通過(guò)RabbitMQ Java客戶端提供的簡(jiǎn)單應(yīng)用程序來(lái)追蹤消息,也是可行的.
準(zhǔn)備
要運(yùn)行此食譜,你需要運(yùn)行的RabbitMQ(運(yùn)行標(biāo)準(zhǔn)端口 5672),以及RabbitMQ Java client library
如何做
RabbitMQ的Java client library中包含了一個(gè)追蹤工具,你可以按下面的步驟來(lái)進(jìn)行實(shí)際使用.
1. 從http://www.rabbitmq.com/java-client.html頁(yè)面下載最新版本的RabbitMQ Java client library.
2. 將其解壓,并進(jìn)入其目錄.
3. 通過(guò)下面的命令來(lái)運(yùn)行Java tracer:
./runjava.sh com.rabbitmq.tools.Tracer
4. 運(yùn)行用于調(diào)試Java client,并將其連接到5673端口.對(duì)于本食譜,我們可以使用包含在Java client包中的另一個(gè)Java工具,其調(diào)用如下:
./runjava.sh com.rabbitmq.examples.PerfTest -h amqp://localhost:5673 -C 1 -D 1
如何工作
追蹤工具是一個(gè)簡(jiǎn)單的AMQP代理;默認(rèn)情況下,它監(jiān)聽(tīng)5673端口,并會(huì)把所有的請(qǐng)求轉(zhuǎn)發(fā)到默認(rèn)監(jiān)聽(tīng)5672端口的RabbitMQ broker.
所有生產(chǎn)或消費(fèi)的消息,如同AMQP操作一樣,都會(huì)記錄到標(biāo)準(zhǔn)輸出中.
運(yùn)行前面步驟的步驟4,我們使用了包含在Java client包中另一個(gè)用于作RabbitMQ壓力測(cè)試的工具.
在這里,我們只是限制了生產(chǎn)一個(gè)消息(-C 1) 并消費(fèi)它(-D 1).
TIP
追蹤工具只在Java client API中可用.
更多
可以使用下面的代碼來(lái)為Java追蹤程序傳遞更多的參數(shù):
./runjava.sh com.rabbitmq.tools.Tracer listenPort connectHost connectPort
listenPort指的是追蹤器監(jiān)聽(tīng)的端口(默認(rèn)為5673), connectHost/connectPort (默認(rèn)為localhost/5672) 是用于連接并轉(zhuǎn)發(fā)收到請(qǐng)求的主機(jī)和端口。
使用下面的命令,你可以找到所有PerfTest可用選項(xiàng):
./runjava.sh com.rabbitmq.examples.PerfTest --help
也可參考
在http://www.rabbitmq.com/java-tools.html中,你可以找到Java追蹤工具以及PerfTest的文檔.
當(dāng)RabbitMQ重啟失敗時(shí),需要做什么
偶爾情況下, RabbitMQ 可能會(huì)重啟失敗。如果broker包含持久化數(shù)據(jù)時(shí),這是一個(gè)嚴(yán)重的問(wèn)題,否則,有足夠的能力重設(shè)其持久化狀態(tài)。
準(zhǔn)備
要運(yùn)行此食譜,你只需要一個(gè)測(cè)試RabbitMQ broker.
TIP
我們將銷毀所有之前定義的數(shù)據(jù)—以避免使用生產(chǎn)實(shí)例.
如何做
要清空RabbitMQ, 可執(zhí)行下面的簡(jiǎn)單步驟:
1. 如果RabbitMQ運(yùn)行的話,停止它.
2. 定位到Mnesia 數(shù)據(jù)庫(kù)目錄.默認(rèn)是/var/lib/rabbitmq/mnesia (Linux) or %APPDATA%\RabbitMQ\db (Windows).
3. 遞歸刪除其目錄和文件.
4. 重啟RabbitMQ.
如何工作
Mnesia 數(shù)據(jù)庫(kù)包含了所有運(yùn)行時(shí)的RabbitMQ定義信息: 隊(duì)列,交換器,用戶等等.
通過(guò)刪除Mnesia數(shù)據(jù)庫(kù) (或者通過(guò)重命名,這樣可以在需要的時(shí)候恢復(fù)某些數(shù)據(jù)), RabbitMQ會(huì)重置到出廠默認(rèn)狀態(tài),當(dāng)RabbitMQ啟動(dòng)時(shí),它會(huì)創(chuàng)建一個(gè)新的Mnesia數(shù)據(jù)庫(kù),并使用默認(rèn)值進(jìn)行初始化.
更多
如果broker無(wú)法在第一時(shí)間啟動(dòng),有可能是某個(gè)系統(tǒng)目錄存在權(quán)限問(wèn)題:即要么是Mnesia數(shù)據(jù)庫(kù)目錄,要么是日志目錄,要么是某些在配置文件中指定的臨時(shí)的或自定義的目錄.
你可以在RabbitMQ故障排除頁(yè)頁(yè)找到詳盡的列表(http://www.rabbitmq.com/troubleshooting.html).
也可參考
在Mnesia API 文檔頁(yè)面(http://www.erlang.org/doc/man/mnesia.html),,你可以找到更多關(guān)于如何破解Mnesia數(shù)據(jù)庫(kù)的信息.
使用Wireshark調(diào)試
在調(diào)試RabbitMQ消息食譜中,我們已經(jīng)了解過(guò)了如何來(lái)追蹤RabbitMQ的消息.
然而,以下情況并不總是可能的或可取的,即停止正在運(yùn)行的客戶端(或RabbitMQ服務(wù)器),修改它的連接端口,指向一個(gè)不同的broker;我們只想監(jiān)控正在實(shí)時(shí)傳遞的消息,影響系統(tǒng)的活動(dòng)應(yīng)該盡可能的少。
TIP但是,正如在前面食譜(追蹤RabbitMQ當(dāng)前活動(dòng))中看到的一樣,激活firehose是可行的 .
Wireshark是一個(gè)免費(fèi)的有能力解碼AMQP消息的網(wǎng)絡(luò)分析工具.
此工具既可用在客戶段,也可以用在服務(wù)端,從而無(wú)縫監(jiān)控AMQP交通狀況.
準(zhǔn)備
要練習(xí)這個(gè)食譜,你需要運(yùn)行的RabbitMQ以及RabbitMQ Java client library.
如何做
在下面的步驟中,我們將看到如何使用Wireshark來(lái)追蹤AMQP消息:
1. 如果Wireshark在你的系統(tǒng)中尚不可用,那么需要從http://www.wireshark.org/下載和安裝Wireshark . 如果可能的話,你也可以從你的發(fā)行版中進(jìn)行安裝,如:
yum install wireshark-gnome
2.在Linux系統(tǒng)中,以root用戶來(lái)啟動(dòng)Wireshark.
3.啟動(dòng)從環(huán)回接口中捕獲消息.
4.切換到Java client library路徑下,在終端中運(yùn)行下面的命令:
./runjava.sh com.rabbitmq.examples.PerfTest -C 1 -D 1
5.停止Wireshark GUI的采集,并分析抓到的AMQP交通狀況.
如何工作
使用Wireshark,可用于檢測(cè)AMQP交通的退出或進(jìn)行一個(gè)持有RabbitMQ服務(wù)器或客戶端的服務(wù)器.
在我們的例子中,我們捕獲了運(yùn)行在同一臺(tái)機(jī)器上服務(wù)端和客戶端網(wǎng)絡(luò)交通狀況,因此連接是localhost中發(fā)生的.這也是為什么我們從環(huán)回接口中捕獲交通狀況的原因(前面步驟的步驟3).
反之,我們應(yīng)該從網(wǎng)絡(luò)接口中進(jìn)行捕獲,這種網(wǎng)絡(luò)接口通常是eth0或其它相似的網(wǎng)絡(luò)接口.
TIP
在Linux上,可以直接捕獲localhost;但同樣的操作不能應(yīng)用到Windows上.在這種情況下,客戶端和服務(wù)端必須位于不同的兩臺(tái)機(jī)器上, 并且在網(wǎng)絡(luò)接口上(要么是物理的,要么是虛擬的)必須激活捕獲, 這樣它們之間才可連接.
所以,為了運(yùn)行Wireshark的圖形用戶界面,如果RabbitMQ客戶端和服務(wù)器運(yùn)行在同一個(gè)節(jié)點(diǎn),你需要選擇環(huán)回接口,如圖下面的截圖所示
:

TIP
在Linux上,當(dāng)你安裝Wireshark軟件包,你通常只會(huì)有命令行界面,tshark。要安裝Wireshark的GUI,你必須安裝相應(yīng)的軟件包. 例如,在Fedora中,你需要安裝wireshark-gnome包.
一旦AMQP交通已穿過(guò)環(huán)回接口,它已經(jīng)被Wireshark捕獲。
運(yùn)行在步驟4的實(shí)驗(yàn)實(shí)際上在兩個(gè)獨(dú)立的連接中開(kāi)啟了一個(gè)生產(chǎn)者和一個(gè)消費(fèi)者.
為了高亮顯示,找到一個(gè)描述為Basic.PublishContent-Header的包,點(diǎn)擊它,并選擇Follow TCP stream.然后,您可以關(guān)閉顯示客戶端和服務(wù)器之間有效負(fù)載對(duì)話的窗口。在主窗口中,您現(xiàn)在可以看到在客戶端和服務(wù)器之間交換的網(wǎng)絡(luò)數(shù)據(jù)包,如下面的截圖所示:

用同樣的方式,你可以選擇RabbitMQ server,如下面的截圖所示:

在前面的兩個(gè)截圖中,我們已經(jīng)強(qiáng)調(diào)了消息AMQP的有效載荷,但由于Wireshark中包括了一個(gè)非常完整的AMQP解剖器,你會(huì)發(fā)現(xiàn)在AMQP交通的很多細(xì)節(jié)。
更多如果RabbitMQ配置為使用SSL,并且你想要分析加密流量,在一定條件下,通過(guò)在Wireshark配置中合理配置SSL公共/私有密鑰也是可以的。
可在http://wiki.wireshark.org/SSL找到更多信息.
也可參考在http://wiki.wireshark.org/AMQP,你可以找到一些關(guān)于Wireshark AMQP 解剖器的一些指南.