在 RabbitMQ 出现问题时通知我
如果您希望在 RabbitMQ 部署出现问题时收到通知,现在您可以通过我们提供的 RabbitMQ Cluster Operator 仓库设置 RabbitMQ 监控和告警。我们已将设置 RabbitMQ 监控和告警所需的一系列步骤合并到 一个命令 中,而不是要求您逐步操作。虽然这是一个 Kubernetes 特定的快速入门指南,但您也可以在 Kubernetes 外部使用这些 Prometheus 告警,只是设置将需要您更多的考虑和努力。我们分享的是一种快速简便的方法,对所有人免费开源。
当一切配置就绪但 RabbitMQ 出现问题时,这就是您可能收到的通知示例

以上是一个很好的示例,说明了问题发生时可能并不明显,且需要经过几个步骤才能排除故障的情况。此通知不会因为错误配置而丢失消息,它能清楚地提示何时传入的消息未能在 RabbitMQ 中正确路由。
目前有哪些可用警报?
- NoMajorityOfNodesReady:只有少数 RabbitMQ 节点可以为客户端提供服务。包括副本队列在内的某些队列很可能不可用。
- PersistentVolumeMissing:RabbitMQ 节点缺少用于持久化数据的卷,无法启动。这通常是由于配置错误或容量问题导致的。
- InsufficientEstablishedErlangDistributionLinks:由于网络问题或权限不正确,RabbitMQ 节点未能成功集群化。
- UnroutableMessages:消息未从通道路由到队列。需要检查路由拓扑。
- HighConnectionChurn:客户端打开和关闭连接的频率过高,这是一种反模式。客户端应使用长连接。
- LowDiskWatermarkPredicted:预计可用磁盘空间将在 24 小时内耗尽。请限制队列积压、加快消费速度或增加磁盘大小。
- FileDescriptorsNearLimit:80% 的可用文件描述符已被占用。减少连接数、减少持久化队列或提高文件描述符限制会有所帮助。
- TCPSocketsNearLimit:80% 的可用 TCP 套接字已被占用。增加通道、减少连接或在集群中更均匀地分配连接会有所帮助。
- ContainerRestarts:运行 RabbitMQ 的 Erlang VM 系统进程异常退出。最常见的原因是配置错误。
- RabbitMQClusterOperatorUnavailableReplicas:管理 RabbitMQ 集群的操作器(Operator)不可用。可能是 Pod 调度或配置错误问题。
如何快速上手?
您需要准备以下内容
现在,您可以在终端中运行以下命令
git clone https://github.com/rabbitmq/cluster-operator.git
# Optionally, set the name of the Slack channel and the Slack Webhook URL
# If you don't have a Slack Webhook URL, create one via https://api.slack.com/messaging/webhooks
# export SLACK_CHANNEL='#my-channel'
# export SLACK_API_URL='https://hooks.slack.com/services/paste/your/token'
./cluster-operator/observability/quickstart.sh
最后一个命令大约需要 5 分钟,它会在 Kubernetes 上设置整个 RabbitMQ 堆栈
- RabbitMQ Cluster Operator 将
RabbitmqCluster声明为自定义资源定义 (CRD),并管理 Kubernetes 中的所有 RabbitMQ 集群 - kube-prometheus-stack Helm chart,它安装了:
- Prometheus Operator 管理 Prometheus 和 Alertmanager,并添加
PrometheusRule和ServiceMonitor自定义资源定义 - Prometheus 从所有 RabbitMQ 节点抓取(读取)指标,将指标存储在时间序列数据库中,并评估警报规则
- Alertmanager 从 Prometheus 接收警报,按 RabbitMQ 集群对它们进行分组,并可选择发送通知到 Slack(或其他服务)
- Grafana 将 Prometheus 中的指标可视化
- kube-state-metrics 提供 RabbitMQ 警报规则所依赖的 Kubernetes 指标
- Prometheus Operator 管理 Prometheus 和 Alertmanager,并添加
- ServiceMonitor 为 Prometheus 提供配置,帮助发现所有 RabbitMQ 节点的 RabbitMQ 指标
- PrometheusRule 对应每个 RabbitMQ Prometheus 警报条件
- Secret 用于 Alertmanager Slack 配置(可选)
- ConfigMap 对应每个 RabbitMQ Grafana 仪表板定义
触发您的第一个 RabbitMQ 警报
要触发警报,我们需要一个 RabbitMQ 集群。这是创建集群最简单的方法
# Add kubectl-rabbitmq plugin to PATH so that it can be used directly
export PATH="$PWD/cluster-operator/bin:$PATH"
# Use kubectl-rabbitmq plugin to create RabbitmqClusters via kubectl
kubectl rabbitmq create myrabbit --replicas 3
要触发 NoMajorityOfNodesReady 警报,我们需要停止三个节点中两个节点的 rabbit 应用程序
kubectl exec myrabbit-server-0 --container rabbitmq -- rabbitmqctl stop_app
kubectl exec myrabbit-server-1 --container rabbitmq -- rabbitmqctl stop_app
在 2 分钟内,三个 RabbitMQ 节点中的两个将被显示为非 READY 状态
kubectl rabbitmq get myrabbit
NAME READY STATUS RESTARTS AGE
- pod/myrabbit-server-0 1/1 Running 0 70s
+ pod/myrabbit-server-0 0/1 Running 0 3m
- pod/myrabbit-server-1 1/1 Running 0 70s
+ pod/myrabbit-server-1 0/1 Running 0 3m
pod/myrabbit-server-2 1/1 Running 0 3m
这些 Pod 仍然处于 Running 状态,因为 rabbitmqctl stop_app 命令只会停止应用程序,而不会终止 Erlang VM 系统进程。
要在 Prometheus 中查看触发的 NoMajorityOfNodesReady 警报,我们在浏览器中打开 Prometheus UI:https://:9090/alerts。为此,我们将本地端口 9090 转发到 Kubernetes 中运行的 Prometheus 端口 9090
kubectl -n kube-prometheus port-forward svc/prom-kube-prometheus-stack-prometheus 9090

NoMajorityOfNodesReady 警报最初呈橙色,表示处于 pending(挂起)状态。5 分钟后,颜色变为红色,状态变为 firing(触发)。这会将警报发送给 Alertmanager。执行端口转发后——同上——我们打开 Alertmanager UI:https://:9093
kubectl -n kube-prometheus port-forward svc/prom-kube-prometheus-stack-alertmanager 9093

Alertmanager 按 namespace(命名空间)和 rabbitmq_cluster 对警报进行分组。您会看到一条警报,Alertmanager 会将其转发到您配置的 Slack 频道

恭喜,您触发了第一个 RabbitMQ 警报!要解决此警报,请启动两个节点上的 rabbit 应用程序
kubectl exec myrabbit-server-0 --container rabbitmq -- rabbitmqctl start_app
kubectl exec myrabbit-server-1 --container rabbitmq -- rabbitmqctl start_app
该警报在 Prometheus 中将变为绿色,它将从 Alertmanager 中移除,并且一条 RESOLVED(已解决)通知将发送到您的 Slack 频道。
过去和当前的 RabbitMQ 警报
要查看所有 RabbitMQ 集群中过去和当前的 RabbitMQ 警报,请查看 RabbitMQ-Alerts Grafana 仪表板:https://:3000/d/jjCq5SLMk(用户名:admin,密码:admin)
kubectl -n kube-prometheus port-forward svc/prom-grafana 3000:80

在上面的示例中,我们在多个 RabbitMQ 集群中触发了多个警报。
您可以如何提供帮助?
我们分享了我们能想到的最简单且最有用的警报。一些用户已经向我们咨询了缺失的警报,例如内存阈值、Erlang 进程和原子、消息重投递等。商业客户已向我们寻求运行手册(runbooks)和自动警报解决方案。
您对当前的警报规则有什么看法?您还缺少哪些警报?请通过 GitHub 讨论告诉我们。
