RabbitMQ Exporter
对于监控 RabbitMQ 有一个 Exporter 叫 RabbitMQ Exporter,是作者 kbudde 发布的,仓库地址是 https://github.com/kbudde/rabbitmq_exporter ,这是一个非官方的插件,现在最新版本是 v1.0.0-RC12 ,发布于2021 年 12 月 16 日左右,监控数据使用 Prometheus 来进行收集。对于 RabbitMQ 监控,官方也有一个插件,https://www.rabbitmq.com/prometheus.html ,可以对比选择哪个使用。
对于官方插件:
- 包含 runtime 和 erlang 的指标
- 集合每个对象的指标
- Missing filter
对于 RabbitMQ Exporter
- 支持旧版本的 RabbitMQ 导出监控数据
- 对于对象,有更多的配置选项和过滤选项
- 依赖于管理接口的数据,这可能是缓慢/延迟的
也许最好的解决办法是同时使用两个 Exporter 来互相补充。
安装运行
RabbitMQ Exporter 可以使用二进制运行,也可以使用 Docker 容器来运行。二进制文件可以从仓库直接下载,Docker 镜像从 Docker Hub 下载就好。
如果使用Docker 容器运行,Exporter 和 RabbitMQ 的容器需要共享网络,这样可以使用localhost和默认用户/密码(guest)。
启动 RabbitMQ
docker run -d -e RABBITMQ_NODENAME=my-rabbit --name my-rabbit -p 9419:9419 rabbitmq:3-management
启动 RabbitMQ Exporter
docker run -d --net=container:my-rabbit kbudde/rabbitmq-exporter
启动好以后访问 http://host:9419/metrics 就可以看到监控指标,管理插件也不需要公开。
配置 Exporter
RabbitMQ Exporter 可以使用 JSON 配置文件或者环境变量来进行配置。
RabbitMQ Exporter 需要将配置文件放在 conf/rabbitmq.conf
。如果是在容器(docker/kubernetes)中运行Exporter, 需要在配置中使用参数指定配置文件路径,将缺省的 /conf/rabbitmq.conf
路径覆盖:
./rabbitmq_exporter -config-file config.example.json
配置文件示例如下:
{
"rabbit_url": "http://127.0.0.1:15672",
"rabbit_user": "guest",
"rabbit_pass": "guest",
"publish_port": "9419",
"publish_addr": "",
"output_format": "TTY",
"ca_file": "ca.pem",
"cert_file": "client-cert.pem",
"key_file": "client-key.pem",
"insecure_skip_verify": false,
"exlude_metrics": [],
"include_queues": ".*",
"skip_queues": "^$",
"skip_vhost": "^$",
"include_vhost": ".*",
"rabbit_capabilities": "no_sort,bert",
"enabled_exporters": [
"exchange",
"node",
"overview",
"queue"
],
"timeout": 30,
"max_queues": 0
}
也可以使用环境变量来配置,可以使用的环境变量如下:
Environment variable | default | description |
---|---|---|
RABBITURL |http://127.0.0.1:15672 |url to rabbitMQ management plugin (must start with http(s)://) RABBIT_USER |guest |username for rabbitMQ management plugin. User needs monitoring tag! RABBIT_PASSWORD |guest |password for rabbitMQ management plugin RABBIT_USER_FILE| |location of file with username (useful for docker secrets) RABBIT_PASSWORD_FILE| |location of file with password (useful for docker secrets) PUBLISH_PORT |9419 |Listening port for the exporter PUBLISH_ADDR |"" |Listening host/IP for the exporter OUTPUT_FORMAT |TTY |Log ouput format. TTY and JSON are suported LOG_LEVEL |info |log level. possible values: "debug", "info", "warning", "error", "fatal", or "panic" CAFILE |ca.pem |path to root certificate for access management plugin. Just needed if self signed certificate is used. Will be ignored if the file does not exist CERTFILE |client-cert.pem |path to client certificate used to verify the exporter's authenticity. Will be ignored if the file does not exist KEYFILE |client-key.pem |path to private key used with certificate to verify the exporter's authenticity. Will be ignored if the file does not exist SKIPVERIFY |false |true/0 will ignore certificate errors of the management plugin SKIP_VHOST |^$ |regex, matching vhost names are not exported. First performs INCLUDE_VHOST, then SKIP_VHOST INCLUDE_VHOST |. |regex vhost filter. Only queues in matching vhosts are exported INCLUDE_QUEUES |. |regex queue filter. Just matching names are exported SKIP_QUEUES |^$ |regex, matching queue names are not exported (useful for short-lived rpc queues). First performed INCLUDE, after SKIP RABBIT_CAPABILITIES |bert,no_sort |comma-separated list of extended scraping capabilities supported by the target RabbitMQ server RABBIT_EXPORTERS| |exchange,node,queue List of enabled modules. Possible modules: connections,shovel,federation,exchange,node,queue,memory RABBIT_TIMEOUT |30 |timeout in seconds for retrieving data from management plugin. MAX_QUEUES |0 |max number of queues before we drop metrics (disabled if set to 0) EXCLUDE_METRICS | |Metric names to exclude from export. comma-seperated. e.g. "recv_oct, recv_cnt". See exporter*.go for names
使用环境变量的启动方式如下:
SKIP_QUEUES="RPC_.*" MAX_QUEUES=5000 ./rabbitmq_exporter
新版本的 RabbitMQ 可以提供一些特性来减少这个 Exporter 获取监控数据所带来的开销。RABBIT_CAPABILITIES 环境目前支持以下功能:
no_sort
:
默认情况下,RabbitMQ 管理插件使用默认的 vhost/name 排序。从3.6.8版本开始,可以通过向 RabbitMQ 传递空的sort 参数(?sort=)来避免这种排序开销。这个选项可以在3.6.X 版本中安全启用,但它不会提供任何性能改进。它 v3.4.x 以及 3.5.x 不兼容。
bert
自 3.6.9 (见https://github.com/rabbitmq/rabbitmq-management/pull/367)以来,RabbitMQ 支持将 BERT 编码作为 JSON 的替代品。考虑到 BERT 编码是在 Erlang VM 中用 C 实现的,它比纯 Erlang JSON 编码更有效。所以当我们在 RabbitMQ 中有很多对象时可以极大的减少监控开销。
如果 RabbitMQ 的版本小于 v3.6 ,no_sort
和 bert
是默认打开的,你需要重写默认配置。
RABBIT_CAPABILITIES=nobert ./rabbitmq_exporter
指标
所有的指标都会以 rabbitmq_
前缀开头,完整的监控列表可以查看 https://github.com/kbudde/rabbitmq_exporter#metrics 。
对于 RabbitMQ Exporter 全局监控有关于 Exporter 自身状态的,包括 up、build info 等。另外会有关于集群的、队列的变化值、队列的计数值、Exchange、Node 、连接情况、Shovel、内存等指标,约么 200+ 以上吧。
已知问题解决方法
当出现 Error while retrieving data from rabbitHost statusCode: 500 的时候是因为,这个 Exporter 最好是使用 RabbitMQ v3.6.8 版本以上,如果你的 RabbitMQ 版本低于 v3.6.8 ,那么需要设置 RABBIT_CAPABILITIES=compat
参数来兼容。