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

#RabbitMQ 监控(三)

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

RabbitMQ Management HTTP API提供了一个方法允许你查看任何vhost上的任何队列:/api/queues//。你不仅可以查看配置详情,还可以查看队列的数据统计,例如队列消耗的内存,或者队列的平均消息吞吐量。使用curl测试一下该API,这里的/%2F还是代表默认的vhost(/)。

curl -u guest:guest http://127.0.0.1:15672/api/queues/%2F/springrabbitexercise

response

{

"consumer_details": [

{

"channel_details": {

"peer_host": "127.0.0.1",

"peer_port": 62679,

"connection_name": "127.0.0.1:62679 -> 127.0.0.1:5672",

"user": "guest",

"number": 2,

"node": "rabbit@localhost",

"name": "127.0.0.1:62679 -> 127.0.0.1:5672 (2)"

},

"arguments": [],

"prefetch_count": 1,

"ack_required": true,

"exclusive": false,

"consumer_tag": "amq.ctag-YImeU8Fm_VahDpxv8EAw2Q",

"queue": {

"vhost": "/",

"name": "springrabbitexercise"

}

}

],

"messages_details": {

"rate": 7357

},

"messages": 232517,

"messages_unacknowledged_details": {

"rate": 0.2

},

"messages_unacknowledged": 5,

"messages_ready_details": {

"rate": 7356.8

},

"messages_ready": 232512,

"reductions_details": {

"rate": 1861021.8

},

"reductions": 58754154,

...

"auto_delete": false,

"durable": true,

"vhost": "/",

"name": "springrabbitexercise",

"message_bytes_persistent": 2220250,

"message_bytes_ram": 2220250,

"message_bytes_unacknowledged": 40,

"message_bytes_ready": 2220210,

"message_bytes": 2220250,

"messages_persistent": 232517,

"messages_unacknowledged_ram": 5,

"messages_ready_ram": 232512,

"messages_ram": 232517,

"garbage_collection": {

"minor_gcs": 0,

"fullsweep_after": 65535,

"min_heap_size": 233,

"min_bin_vheap_size": 46422,

"max_heap_size": 0

},

"state": "running"

}

为了方便阅读,去掉了部分返回值,但是还是可以看到队列的很多信息。例如可以看到一个consumer的信息、消息占用的内存、队列的durable、auto_delete属性等。利用这些配置信息,新的健康监控程序可以通过API方法的输出来轻松监控队列的属性,并在发生变更时通知你。

就像之前编写健康检测程序那样,除了服务器、端口、vhost、用户名和密码之外,还需要知道:

* 队列的名称,以便监控其配置

* 该队列是否将durable和auto_delete选项打开

###清单3.1 检测队列配置

完整代码在我的github,下面代码中的@Data和@Slf4j都是插件lombok中的注解,想要了解的可自行百度。

1.定义查看队列信息的接口 RMQResource.java

@Path("api")

@Consumes({MediaType.APPLICATION_JSON})

@Produces({MediaType.APPLICATION_JSON})

public interface RMQResource {

/**

* Return a queue`s info

*

* @param vhost

* @param name

* @return {@link QueueInfo}

*/

@GET

@Path("queues/{vhost}/{name}")

Response getQueueInfo(@PathParam("vhost") String vhost, @PathParam("name") String name);

}

2.定义查看队列接口的返回值 QueueInfo.java

@Data

public class QueueInfo {

private ConsumerDetails[] consumer_details;

/**

* unknown class

*/

@JsonIgnore

private Object[] incoming;

/**

* unknown class

*/

@JsonIgnore

private Object[] deliveries;

/**

* unknown class

*/

@JsonIgnore

private Object arguments;

private Boolean exclusive;

//...

private Boolean auto_delete;

private Boolean durable;

private String vhost;

private String name;

/**

* unknown class

*/

@JsonIgnore

private Object head_message_timestamp;

/**

* unknown class

*/

@JsonIgnore

private Object recoverable_slaves;

private Long memory;

private Double consumer_utilisation;

private Integer consumers;

/**

* unknown class

*/

@JsonIgnore

private Object exclusive_consumer_tag;

/**

* unknown class

*/

@JsonIgnore

private Object policy;

@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")

private Date idle_since;

}

3.检测队列配置 QueueConfigCheck.java

/**

* 检测队列配置

*/

@Slf4j

public class QueueConfigCheck {

private final static RMQResource rmqResource = RMQApi.getService(RMQResource.class);

public static void checkQueueConfig(String vhost, CheckQueue queue) {

RMQConfig config = RMQConfig.Singleton.INSTANCE.getRmqConfig();

String host = config.getHost();

Response response = null;

try {

response = rmqResource.getQueueInfo(vhost, queue.getQueue_name());

} catch (Exception e) {

log.error("UNKNOWN: Could not connect to {}, cause {}", host, e.getMessage());

ExitUtil.exit(ExitType.UNKNOWN.getValue());

}

if (response == null || response.getStatus() == 404) {

log.error("CRITICAL: Queue {} does not exist.", queue.getQueue_name());

ExitUtil.exit(ExitType.CRITICAL.getValue());

} else if (response.getStatus() > 299) {

log.error("UNKNOWN: Unexpected API error : {}", response);

ExitUtil.exit(ExitType.UNKNOWN.getValue());

} else {

QueueInfo info = response.readEntity(QueueInfo.class);

if (!info.getAuto_delete().equals(queue.getAuto_delete())) {

log.warn("WARN: Queue {} - auto_delete flag is NOT {}", queue.getQueue_name(), info.getAuto_delete());

ExitUtil.exit(ExitType.WARN.getValue());

}

if (!info.getDurable().equals(queue.getDurable())) {

log.warn("WARN: Queue {} - durable flag is NOT {}", queue.getQueue_name(), info.getDurable());

ExitUtil.exit(ExitType.WARN.getValue());

}

}

log.info("OK: Queue {} configured correctly.", queue.getQueue_name());

ExitUtil.exit(ExitType.OK.getValue());

}

}

4.检测队列配置的方法参数 CheckQueue.java

@Data

public class CheckQueue {

private final String queue_name;

private final Boolean auto_delete;

private final Boolean durable;

public CheckQueue(String queue_name, Boolean auto_delete, Boolean durable) {

this.queue_name = queue_name;

this.auto_delete = auto_delete;

this.durable = durable;

}

}

5.运行检测程序

@Test

public void testQueueConfig() {

String queue_name = "springrabbitexercise";

Boolean auto_delete = false;

Boolean durable = true;

String vhost = "/";

CheckQueue queue = new CheckQueue(queue_name, auto_delete, durable);

QueueConfigCheck.checkQueueConfig(vhost, queue);

}

可以看到监控正常运行:

11:38:23.286 [main] INFO com.lanxiang.rabbitmqmonitor.check.QueueConfigCheck - OK: Queue springrabbitexercise configured correctly.

11:38:23.289 [main] INFO com.lanxiang.rabbitmqmonitor.terminate.ExitUtil - Status is OK

这段RabbitMQ队列检测的程序有一处修改,如果健康检测程序无法连接到API服务器的话,会返回EXIT_UNKNOWN。前一章的API ping健康检测要么成功要么失败,故障代码之间没有区别,但是队列检测API方法在失败时通过HTTP状态码提供了更多信息。如果HTTP状态码是404就代表尝试验证的队列不存在,检测失败并返回EXIT_CRITICAL。对于其他大于299的HTTP状态码,退出代码为EXIT_UNKNOWN。

在获取到RabbitMQ API的response之后,使用JSON进行解码,并且把得到的durable和auto_delete参数与期望的参数进行比较,如果参数和预期不相符的话,返回EXIT_WARNING或者EXIT_CRITICAL状态码。如果队列所有的配置都正确的话,那么就正确退出。

在了解我们对RabbitMQ做监控的原理之后,可以根据RabbitMQ Management HTTP API定制更多的监控,例如:

* /api/nodes,可以获取集群中每个节点的数据

* /api/queues//,可以获取队列的详细情况,例如消息处理的速率、积压的消息数量等。

除此之外还有许多其他API,我们要做的就是根据自身的业务逻辑和这些API来设计合理的监控脚本。RabbitMQ监控系列就到此结束啦,还是很可惜没有实战的机会吧,因为最近在工作变动期间,看了一下RabbitMQ实战这本书,兴起想写一下博客试试。

毕业快一年了,想养成写博客的习惯。正好最近也在工作变动中,能有闲暇时间尝试一下,博客写的比较水,多多包涵。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFMpeg语法参数中文参考手册

要查看你的ff mpeg支持哪些 格式,可以用如下命令:$ ffmpeg -formats | less还可以把 视频文件导出成jpg序列帧:$ ffmpeg -i bc-cinematic-en.avi example.%d.jpgdebian下安装ffmpeg很简单:#apt-get install ffmpegffmp…

Java类集框架 —— LinkedHashMap源码分析

前言 我们知道HashMap底层是采用数组单向线性链表/红黑树来实现的,HashMap在扩容或者链表与红黑树转换过程时可能会改变元素的位置和顺序。如果需要保存元素存入或访问的先后顺序,那就需要采用LinkedHashMap了。 LinkedHashMap结构 LinkedHashMap继承自H…

apache 支持.htaccess重写url

1. httpd.conf 添加&#xff1a; <Directory />Options Indexes FollowSymLinks MultiviewsAllowOverride allRequire all grantedRewriteEngine On</Directory> 开启&#xff1a; 在phpinfo里找到&#xff1a; 说明开启成功。 2.httpd-vhosts.conf &#xff08;开…

oom 如何避免 高并发_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!...

【高并发】高并发环境下如何防止Tomcat内存溢出&#xff1f;看完我懂了&#xff01;&#xff01;发布时间&#xff1a;2020-04-19 00:47,浏览次数&#xff1a;126, 标签&#xff1a;Tomcat写在前面随着系统并发量越来越高&#xff0c;Tomcat所占用的内存就会越来越大&#xff0…

[JSOI2008]最小生成树计数

OJ题号&#xff1a;  BZOJ1016 题目大意&#xff1a;   给定一个无向带权图&#xff0c;求最小生成树的个数。 思路&#xff1a;   先跑一遍最小生成树&#xff0c;统计相同权值的边出现的个数。   易证不同的最小生成树&#xff0c;它们不同的那一部分边的权值实际上是…

vuex webpack 配置_vue+webpack切换环境和打包之后服务器配置

import axios from ‘axios‘import store from ‘../store/index‘const rootUrl process.env.API_ROOT//创建axios实例const service axios.create({timeout:30000 //超时时间})//添加request拦截器service.interceptors.request.use(config >{if (Object.keys(config.hea…

redis基本用法学习(C#调用FreeRedis操作redis)

FreeRedis属于常用的基于.net的redis客户端&#xff0c;EasyCaching中也提供适配FreeRedis的包。根据参考文献4中的说法&#xff0c;FreeRedis和CsRedis算是近亲&#xff08;都是GitHub中账号为2881099下的开源项目&#xff09;&#xff0c;因此其用法特别相似。FreeRedis的主要…

opencv:图像的基本变换

0.概述 图像变换的基本原理都是找到原图和目标图的像素位置的映射关系&#xff0c;这个可以用坐标系来思考&#xff0c;在opencv中&#xff0c; 图像的坐标系是从左上角开始(0,0)&#xff0c;向右是x增加方向(cols)&#xff0c;向下时y增加方向(rows)。 普通坐标关系&#xff1…

FFMpeg在Windows环境下的编译

1&#xff0e;安装MinGW &#xff08;1&#xff09;下载文件&#xff1a;MinGW-5.1.4.exe&#xff0c; &#xff08;2&#xff09;安装时选择下列组件&#xff1a; binutils-2.19.1-mingw32-bin.tar.gz gcc-core-3.4.5-20060117-3.tar.gz gcc-g-3.4.5-20060117-3.tar.gz …

中通知设置响铃_主动切断干扰源——手机“通知”精细化管理

上周去参加我福福幼儿园的母亲节活动&#xff0c;内容是孩子和家长一起穿手链。期间我发现和我同桌的一个家长的手机不停在响&#xff0c;当然伴随着注意力被打断。不仅是这位家长自己&#xff0c;连我也受到了干扰。于是职业病又犯了&#xff0c;我悄悄的看了一眼这位家长的手…

OCM_第十九天课程:Section9 —》Data Guard _ DATA GUARD 原理/DATA GUARD 应用/DATA GUARD 搭建...

注&#xff1a;本文为原著&#xff08;其内容来自 腾科教育培训课堂&#xff09;。阅读本文注意事项如下&#xff1a;1&#xff1a;所有文章的转载请标注本文出处。2&#xff1a;本文非本人不得用于商业用途。违者将承当相应法律责任。3&#xff1a;该系列文章目录列表&#xf…

python安装各种插件

http://www.lfd.uci.edu/~gohlke/pythonlibs/#pip 感受&#xff1a;如果编辑pip真的一直出问题&#xff0c;考虑降成32位的进行安装。毕竟合理搭配比木桶突出有用。转载于:https://www.cnblogs.com/osmondwang/p/7307678.html

编写数学公式的好工具

2019独角兽企业重金招聘Python工程师标准>>> http://private.codecogs.com/latex/eqneditor.php 转载于:https://my.oschina.net/yizhichao/blog/1542153

dev gridview 打印列数过多_R语言:如何将多张统计图绘制在一张上面

在使用R语言进行数据可视化的时候&#xff0c;常常需要将多张统计图表绘制在同一张图上面&#xff0c;从而更高效地传递信息&#xff0c;下面我们就来一起看看具体如何实现。一、使用R语言自带的函数绘制的图像R语言本身就已经内置了许多绘图函数&#xff0c;能够满足较为基本的…

264分析两大利器 和 视频系列下载:264VISA和Elecard StreamEye Tools

学了264有将近3个月有余&#xff0c;好多时候都在学习老毕的书和反复看JM86的代码&#xff0c;最近才找到264分析两大利器&#xff1a;264VISA和Elecard StreamEye Tools。不由得感叹&#xff0c;恨不逢同时。 简单的说下这两个软件&#xff1a; 264visa 强力的h264实时分析工具…

[转]vue全面介绍--全家桶、项目实例

慢慢了解vue及其全家桶的过程 原文http://blog.csdn.net/zhenghao35791/article/details/67639415 简介 “简单却不失优雅&#xff0c;小巧而不乏大匠”。 2016年最火的前端框架当属Vue.js了&#xff0c;很多使用过vue的程序员这样评价它&#xff0c;“vue.js兼具angular.js和R…

opencv 星空_opencv如何将大于5000像素点的轮廓绘制出来?

contourArea函数的运用。具体例子可以看下面的。《如何获得物体的主要方向&#xff1f;》代码略解&#xff1a;1、读入图片&#xff0c;寻找轮廓&#xff1b;//读入图像&#xff0c;转换为灰度Mat img imread("e:/sandbox/pca1.jpg");Mat bw;cvtColor(img, bw, COLO…

TS 188字节流结构图

应该说真正了解TS&#xff0c;还是看了朋友推荐的《数字电视业务信息及其编码》一书之后&#xff0c;MPEG2 TS和数字电视是紧密不可分割的&#xff0c;值得总结一下其中的一些关系。 ISO/IEC&#xff0d;13818&#xff0d;1&#xff1a;系统部分&#xff1b; ISO/IEC&#xff…

二进制安装mysql 5.7、mariadb (附yum安装方式)

前言&#xff1a;本文以mariadb为例进行讲解&#xff0c;安装mysql同理&#xff0c;并以通过测试。安装前查找系统已安装的相关包&#xff08;rpm -qa|grep -e "mysql" -e "mariadb"&#xff09;并进行卸载。1、准备mariadb存储数据库文件的目录。mkdir -p…

GLSL/C++ 实现滤镜效果

入门效果之浮雕 "浮雕"图象效果是指图像的前景前向凸出背景。常见于一些纪念碑的雕刻上。要实现浮雕事实上很easy。我们把图象的一个象素和左上方的象素进行求差运算。并加上一个灰度。这个灰度就是表示背景颜色。这里我们设置这个插值为128 (图象RGB的值是0-255)。同…