Prometheus-RabbitMQ Exporter

一、介绍

监控插件

有两种:

  • rabbitmq-server(3.8版本以上) rabbitmq 官方自带的插件 rabbitmq_prometheus
  • Prometheus 官方推荐的非 rabbitmq官方插件 rabbitmq_exporter

两个插件的区别

官方插件

  • 具有 runtime/erlang 的监控指标
  • 有聚合的或每个对象的度量
  • 无法禁用某些不需要的监控指标,但是 Prometheus 可以单独获取某些监控指标数据

非 Rabbitmq 官方插件

  • 适用于 Rabbitmq 的新旧版本
  • 具有更多配置选项/筛选对象

可能最好的解决方案是同时使用两个:

  • 官方的普罗米修斯插件不能跳过收集一些指标的能力。在官方插件中,您可以选择聚合度量或每个对象,但是不能跳过不需要的监控指标。

  • 另一方面,官方插件提供erlang 虚拟机的监控指标,这也很重要。

所以建议两者这样用。在官方插件中,禁用每个对象的度量,并且只使用它来收集与erlang相关的度量,使用非官方插件收集其他所有监控指标。

对于以上建议,仅仅是个人建议。如果想简单实现,使用官方的插件即可。

一、 官方插件 rabbitmq_prometheus

1 配置 RabbitMQ 集群名称

检查每个节点的机群名称是否一致

rabbitmq-diagnostics -q cluster_status

如果不一致,修改为一致,并且这样也可以和其他被监控的集群区别开来.
只需下集群中的任意节点执行一次即可。

rabbitmqctl -q set_cluster_name your-cluster-name

2 授权使用插件

2.1 配置文件方式

重启 RabbitMQ 服务生效
/etc/rabbitmq/enabled_plugins 文件中添加如下内容

[rabbitmq_prometheus]

2.2 命令行方式

立即生效

rabbitmq-plugins enable rabbitmq_prometheus

如果非首次部署后开启监控插件,可以同时使用两者结合,这样无需重启服务,并且在下次服务重启后,插件也是永久生效可用的。

3 监听地址和端口

此插件开启成功后,默认监听 TCP 端口 15692,监听地址是服务器上的所有地址。

此端口可以使用如下配置方式覆盖修改:

prometheus.tcp.port = 15692

可以使用如下方式覆盖修改监听的地址:

prometheus.tcp.ip = 0.0.0.0

可以使用如下命令检查每个节点监听的端口

rabbitmq-diagnostics -s listeners

确认是否成功开启

curl -s localhost:15692/metrics | head -n 3

4 RabbitMQ 插件获取指标的频率

默认情况下,rabbitmq_prometheus 插件每隔 5000 毫秒(5 秒)抓取一次监控指标数据。
生产环境,建议修改为 10000(10秒),并且将 Prometheus 的抓取间隔设置为 15秒。

查询获取指标的频率(是一个环境变量)

rabbitmq-diagnostics environment | grep collect_statistics_interval

当使用RabbitMQ的管理UI默认5秒自动刷新时,保持默认的 collect_statistics_interval 设置是最佳的。由于这个原因,两个时间间隔默认都是 5000 毫秒(5秒)。

5 配置到 Prometheus

添加如下内容到 prometheus.yml 文件中

scrape_configs:
  - job_name: 'rabbitmq-exporter'
    static_configs:
       - targets:
         - rabbitmq1-host:15692
         - rabbitmq2-host:15692
         - rabbitmq3-host:15692

6 关于聚合指标和每个对象指标

RabbitMQ 可以通过两种模式返回 Prometheus 指标:

  1. 聚合:指标按名称聚合。在输出大小不变的情况下,即使对象数量(例如连接和队列)增加,这种模式的性能开销也较低。

  2. 每个对象:每个对象度量对的单个度量。由于有大量的统计数据发射实体,例如大量的连接和队列,这可能会导致非常大的有效载荷和大量的CPU资源用于串行数据输出。

对于大型部署,指标聚合是一种更可预测且更实用的选项。 它相对于系统中发出度量的对象的数量进行了很好的扩展 (连接、通道、队列、使用者等),保持较小的响应大小和时间。 可以预见的是,它也很容易可视化。

度量聚合的缺点是它会丢失数据保真度。聚合不可能实现每个对象的度量和警报。个别对象度量虽然在某些情况下非常有用,但也很难可视化。考虑一下一张有20万个连接的图表会是什么样子,以及运营商是否能够理解它,以及运维是否能够理解它。

6.1 获取聚合指标 /metrics

默认情况下,RabbitMQ返回此端点上的聚合度量。

如果您希望在/metrics端点上返回每个对象(未聚合)的度量,请将prometheus.return_per_object_metrics设置为true:

# 可能导致产生非常过量的输出,
# 仅适用于具有相对较少的度量发射对象(如连接和队列)的环境
prometheus.return_per_object_metrics = true

6.2 每次请求获取到每个监控指标的监控数据 /metrics/per-object

GET /metrics/per-object

它总是返回所有每个对象的度量,而不管 prometheus.return_per_object_metrics 的值是多少。
因此,您可以保留 prometheus_return_pr_object_metris 的默认值,该值为 false,并在必要时仍然抓取每个对象的指标,通过在Prometheus目标配置中设置metrics_path=/metrics/per-object(有关其他信息,请查看PrometheusDocumentation)。

6.3 请求获取指定某个监控指标的监控数据 /metrics/detailed

如前所述,在具有大量实体的环境中使用每对象度量在计算上非常昂贵。例如,/metrics/per-object返回系统中所有实体的所有度量,即使大多数客户端(如监控工具)没有使用其中的许多度量。

这就是为什么每个对象指标都有一个单独的端点,允许调用者只查询他们需要的指标:

GET /metrics/detailed?vhost=/&vhost=vhost-2&family=queue_coarse_metrics&family=queue_consumer_count

将只返回请求的度量,并忽略(例如)该客户端不感兴趣的所有渠道度量。

支持以下参数:

  • 零个或多个 family 的值: 将
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: RabbitMQ