一旦它運行起來,你就可以從同一個web界面中,看到系統信息和RabbitMQ節點、隊列的相關信息,如下面的截圖所示:

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

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

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

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