欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-monitor-2/

本文接RabbitMQ之监控(1)。

不管是通过HTTP API接口还是客户端,获取的数据都是为了提供监控视图之用,不过这一切都基于RabbitMQ服务运行完好的情况下。虽然可以通过某些其他工具或方法来检测RabbitMQ进程是否在运行(如:ps aux | grep rabbitmq),或者5672端口是否开启(如:telnet xxx.xxx.xxx.xxx 5672),但是这样依旧不能真正的评判RabbitMQ是否还具备服务外部请求的能力。这里就需要使用AMQP协议来构建一个Ping的检测程序,这个类似于TCP协议的Ping。当这个测试程序与RabbitMQ服务无法建立TCP协议层面的连接,或者无法构建AMQP协议层面的连接,亦或者构建连接超时时则可判定RabbitMQ服务处于异常状态而无法正常的为外部应用提供相应的服务。示例程序下:

/*** AMQP-ping测试程序返回的状态*/
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中的内容,如果没有配置相应的项则采用默认值*/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* 服务出现异常情况。*/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服务的连接所需的连接信息,包括IP地址、端口号、vhost、用户名和密码等。如果没有配置相应的项则可以采用默认的值。

监控应用时,可以定时调用AMQPPing.checkAMQPPing()方法来获取检测信息,方法返回值是一个枚举类型,示例中只具备两个值:PING_STATUS.OK和PING_STATUS.EXCEPTION,分别代表RabbitMQ服务正常和异常的情况,这里可以根据实际应用情况来细分返回值的粒度。

AMQPPing这个类能够检测RabbitMQ是否能够接收新的请求和构造AMQP信道,但是要检测RabbitMQ服务是否健康还需要进一步的措施。值得庆幸的是RabbitMQ Management插件提供了/api/aliveness-test/vhost的HTTP API形式的接口,这个接口通过3个步骤来验证RabbitMQ服务的健康性:

  • 创建一个以“aliveness-test”为名称的队列来接收测试消息。
  • 用队列名称,即“aliveness-test”作为消息的路由键,将消息发往默认交换器。
  • 当消息到达队列的时候就消费该消息,否则就报错。

这个HTTP API接口背后的检测程序,这里也称之为aliveness-test,其运行在Erlang虚拟机内部,因此它不会受到网络问题的影响。如果在虚拟机外部的话,网络问题可能会阻止外部客户端连接到RabbitMQ的5672端口。aliveness-test程序不会删除创建的队列,对于频繁调用这个接口的情况,它可以避免数以千计的队列元数据事务对Mnesia数据库造成巨大的压力。如果RabbitMQ服务完好,调用/api/aliveness-test/vhost接口会返回{“status”:”ok”},HTTP状态码为200。示例程序如下:

/*** AlivenessTest程序返回的状态* 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;}
}
//调用示例
// AlivenessTest.checkAliveness("http://192.168.0.2:15672/api/aliveness-test/%2F", "root", "root123");

监控应用时,可以定时调用 AlivenessTest.checkAliveness()方法来获取检测信息,方法返回值是一个枚举类型,示例中只具备两个值:ALIVE_STATUS.OK和ALIVE_STATUS.EXCEPTION,分别代表RabbitMQ服务正常和异常的情况,这里可以根据实际应用情况来细分返回值的粒度。

这里的aliveness-test程序配合前面的AMQPPing程序一起使用可以从内部和外部这两个方面来全面的监控RabbitMQ服务。表4中还提及另外两个接口/api/healthchecks/node和/api/healthchecks/node/node,这两个HTTP API接口分别表示对当前节点或指定节点进行基本的健康检查,包括RabbitMQ应用、信道、队列是否运行正常,是否有告警产生等等。使用方式可以参考/api/aliveness-test/vhost,在此不多做赘述。

欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-monitor-2/


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


RabbitMQ之监控(2)相关推荐

  1. RabbitMQ之监控(3)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  2. RabbitMQ之监控(1)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  3. java监控rabbitMq服务状态,SpringCloud-Turbine【RabbitMQ服务监控】

    前面我们介绍了通过turbine直接聚合多个服务的监控信息,实现了服务的监控,但是这种方式有个不太好的地方就是turbine和服务的耦合性太强了,针对这个问题,我们可以将服务的监控消息发送到Rabbi ...

  4. RabbitMQ队列监控

    Idle:通过自动发现队列,获取各个队列中的ready,unackd等值 sudo !!! 1 #!/bin/sh 2 discovery(){ 3 Queue=(`rabbitmqctl list_ ...

  5. rabbitmq接口异常函数方法_RabbitMQ监控(三):监控队列状态

    #RabbitMQ 监控(三) 验证RabbitMQ健康运行只是确保消息通信架构可靠性的一部分,同时,你也需要确保消息通信结构配置没有遭受意外修改,从而避免应用消息丢失. RabbitMQ Manag ...

  6. RabbitMQ学习之队列监控

    对于RabbitMQ的监控,除了服务器基本信息(硬盘.CPU.内存.IO等)以及MQ的进程和端口,我们也可以通过请求url访问管理API监控其集群和队列的情况.在Java api 3.6.0以后,ch ...

  7. kafka学习_《从0到1学习Flink》—— Flink 读取 Kafka 数据写入到 RabbitMQ

    前言 之前有文章 <从0到1学习Flink>-- Flink 写入数据到 Kafka 写过 Flink 将处理后的数据后发到 Kafka 消息队列中去,当然我们常用的消息队列可不止这一种, ...

  8. 队列工厂之RabbitMQ

    本次和大家分享的是RabbitMQ队列的用法,前一篇文章队列工厂之(MSMQ)中在描述的时候已经搭建了简单工厂,因此本章内容是在其之上扩充的子项不再过多讲解工厂的代码了:RabbitMQ应该是现在互联 ...

  9. 消息中间件(Kafka/RabbitMQ)收录集

    本篇主要整理工作中遇到的一些消息中间件的相关知识,包括Kafka, RabbitMQ, RocketMQ, ActiveMQ等,不排除收录其他消息中间件的可能. 这里会持续收录相关知识,包括安装.部署 ...

最新文章

  1. 【143】360云盘资源
  2. 对于C#里面的this与base
  3. C++指针初始化总结
  4. C++ inline variable
  5. 牛客网【每日一题】7月30日题目精讲—Xor Path
  6. 恭喜上周2期R和Python送书的8位中奖者!
  7. Linux环境无文件渗透执行ELF:memfd_create、ptrace
  8. 开启Ubuntu root 远程登录
  9. 超简单的html登录界面
  10. matlab创建数组
  11. *寒假水121——叠筐
  12. 编程实现误差逆传播算法(BP算法)
  13. HBuilder手机Iphone运行提示“未受信用的企业级开发者”
  14. gcc -Wall -pedantic -ansi(转载)
  15. max2 android9.0,乐视Max2 lineage16 安卓9.0 极致省电 纯净原生 完美root Xposed 经典版
  16. 算法详解之狄克斯特拉算法
  17. AcWing 学习日记——笨拙的手指
  18. 爸爸的信:学会鄙视自己,才不会妥协
  19. C语言练习-day29
  20. vue中将UTC时间转换为标准格式时间--十分好用

热门文章

  1. Spring Boot Transaction 源码解析(二)
  2. python解压打开文件过多_自动解压大量压缩文件 Python 脚本 | 学步园
  3. 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞与 I/O 多路复用、Java NIO 之间的联系
  4. SAP HANA Hint简介
  5. 关于Html中jsp调用Android中方法无效的一点建议
  6. 80后创业故事之:兄弟散伙,创业失败(转)
  7. 本地计算机上的OracleOraDb11g_home2TNSListener服务启动又停止了。一些服务自动停止,如果他们没有什么可做的 ....
  8. 现代网络管理员必备技能
  9. 2021牛客多校9 - Cells(推公式+NTT)
  10. CodeForces - 1450E Capitalism(差分约束)