RabbitMQ之监控(2)
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-monitor-2/
本文接RabbitMQ之監(jiān)控(1)。
不管是通過HTTP API接口還是客戶端,獲取的數(shù)據(jù)都是為了提供監(jiān)控視圖之用,不過這一切都基于RabbitMQ服務(wù)運行完好的情況下。雖然可以通過某些其他工具或方法來檢測RabbitMQ進程是否在運行(如:ps aux | grep rabbitmq),或者5672端口是否開啟(如:telnet xxx.xxx.xxx.xxx 5672),但是這樣依舊不能真正的評判RabbitMQ是否還具備服務(wù)外部請求的能力。這里就需要使用AMQP協(xié)議來構(gòu)建一個Ping的檢測程序,這個類似于TCP協(xié)議的Ping。當這個測試程序與RabbitMQ服務(wù)無法建立TCP協(xié)議層面的連接,或者無法構(gòu)建AMQP協(xié)議層面的連接,亦或者構(gòu)建連接超時時則可判定RabbitMQ服務(wù)處于異常狀態(tài)而無法正常的為外部應(yīng)用提供相應(yīng)的服務(wù)。示例程序下:
/*** AMQP-ping測試程序返回的狀態(tài)*/ enum PING_STATUS{OK,//正常EXCEPTION//異常 }public class AMQPPing {private static String host = "localhost";private static int port = 5672;private static String vhost = "/";private static String username = "guest";private static String password = "guest";/*** 讀取rmq_cfg.properties中的內(nèi)容,如果沒有配置相應(yīng)的項則采用默認值*/static {Properties properties = new Properties();try {properties.load(AMQPPing.class.getClassLoader().getResourceAsStream("rmq_cfg.properties"));host = properties.getProperty("host");port = Integer.valueOf(properties.getProperty("port"));vhost = properties.getProperty("vhost");username = properties.getProperty("username");password = properties.getProperty("password");} catch (Exception e) {e.printStackTrace();}}/*** AMQP-ping測試程序,如有IOException或者TimeoutException則說明RabbitMQ* 服務(wù)出現(xiàn)異常情況。*/public static PING_STATUS checkAMQPPing(){PING_STATUS ping_status = PING_STATUS.OK;ConnectionFactory connectionFactory = new ConnectionFactory();connectionFactory.setHost(host);connectionFactory.setPort(port);connectionFactory.setVirtualHost(vhost);connectionFactory.setUsername(username);connectionFactory.setPassword(password);Connection connection = null;Channel channel = null;try {connection = connectionFactory.newConnection();channel = connection.createChannel();} catch (IOException | TimeoutException e ) {e.printStackTrace();ping_status = PING_STATUS.EXCEPTION;} finally {if (connection != null) {try {connection.close();} catch (IOException e) {e.printStackTrace();}}}return ping_status;} }上面中的示例中涉及到rmq_cfg.properties配置文件,這個文件用來靈活的配置與RabbitMQ服務(wù)的連接所需的連接信息,包括IP地址、端口號、vhost、用戶名和密碼等。如果沒有配置相應(yīng)的項則可以采用默認的值。
監(jiān)控應(yīng)用時,可以定時調(diào)用AMQPPing.checkAMQPPing()方法來獲取檢測信息,方法返回值是一個枚舉類型,示例中只具備兩個值:PING_STATUS.OK和PING_STATUS.EXCEPTION,分別代表RabbitMQ服務(wù)正常和異常的情況,這里可以根據(jù)實際應(yīng)用情況來細分返回值的粒度。
AMQPPing這個類能夠檢測RabbitMQ是否能夠接收新的請求和構(gòu)造AMQP信道,但是要檢測RabbitMQ服務(wù)是否健康還需要進一步的措施。值得慶幸的是RabbitMQ Management插件提供了/api/aliveness-test/vhost的HTTP API形式的接口,這個接口通過3個步驟來驗證RabbitMQ服務(wù)的健康性:
- 創(chuàng)建一個以“aliveness-test”為名稱的隊列來接收測試消息。
- 用隊列名稱,即“aliveness-test”作為消息的路由鍵,將消息發(fā)往默認交換器。
- 當消息到達隊列的時候就消費該消息,否則就報錯。
這個HTTP API接口背后的檢測程序,這里也稱之為aliveness-test,其運行在Erlang虛擬機內(nèi)部,因此它不會受到網(wǎng)絡(luò)問題的影響。如果在虛擬機外部的話,網(wǎng)絡(luò)問題可能會阻止外部客戶端連接到RabbitMQ的5672端口。aliveness-test程序不會刪除創(chuàng)建的隊列,對于頻繁調(diào)用這個接口的情況,它可以避免數(shù)以千計的隊列元數(shù)據(jù)事務(wù)對Mnesia數(shù)據(jù)庫造成巨大的壓力。如果RabbitMQ服務(wù)完好,調(diào)用/api/aliveness-test/vhost接口會返回{“status”:”ok”},HTTP狀態(tài)碼為200。示例程序如下:
/*** AlivenessTest程序返回的狀態(tài)* OK表示健康,EXCEPTION表示異常*/ enum ALIVE_STATUS{OK,EXCEPTION } public class AlivenessTest {public static ALIVE_STATUS checkAliveness(String url, String username, String password){ALIVE_STATUS alive_status = ALIVE_STATUS.OK;HttpClient client = new HttpClient();client.getState().setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));GetMethod getMethod = new GetMethod(url);String data = null;int ret = -1;try {ret = client.executeMethod(getMethod);data = getMethod.getResponseBodyAsString();if (ret != 200 || !data.equals("{\"status\":\"ok\"}")) {alive_status = ALIVE_STATUS.EXCEPTION;}} catch (IOException e) {e.printStackTrace();alive_status = ALIVE_STATUS.EXCEPTION;}return alive_status;} } //調(diào)用示例 // AlivenessTest.checkAliveness("http://192.168.0.2:15672/api/aliveness-test/%2F", "root", "root123");監(jiān)控應(yīng)用時,可以定時調(diào)用 AlivenessTest.checkAliveness()方法來獲取檢測信息,方法返回值是一個枚舉類型,示例中只具備兩個值:ALIVE_STATUS.OK和ALIVE_STATUS.EXCEPTION,分別代表RabbitMQ服務(wù)正常和異常的情況,這里可以根據(jù)實際應(yīng)用情況來細分返回值的粒度。
這里的aliveness-test程序配合前面的AMQPPing程序一起使用可以從內(nèi)部和外部這兩個方面來全面的監(jiān)控RabbitMQ服務(wù)。表4中還提及另外兩個接口/api/healthchecks/node和/api/healthchecks/node/node,這兩個HTTP API接口分別表示對當前節(jié)點或指定節(jié)點進行基本的健康檢查,包括RabbitMQ應(yīng)用、信道、隊列是否運行正常,是否有告警產(chǎn)生等等。使用方式可以參考/api/aliveness-test/vhost,在此不多做贅述。
歡迎跳轉(zhuǎn)到本文的原文鏈接:https://honeypps.com/mq/rabbitmq-monitor-2/
歡迎支持筆者新作:《深入理解Kafka:核心設(shè)計與實踐原理》和《RabbitMQ實戰(zhàn)指南》,同時歡迎關(guān)注筆者的微信公眾號:朱小廝的博客。
總結(jié)
以上是生活随笔為你收集整理的RabbitMQ之监控(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RabbitMQ负载均衡(4)——LVS
- 下一篇: RabbitMQ之监控(3)