在 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 分钟,它将设置整个 RabbitMQ on Kubernetes 堆栈
- 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,并添加
- 用于 Prometheus 的 ServiceMonitor 配置,帮助发现所有 RabbitMQ 节点上的 RabbitMQ 指标
- 每个 RabbitMQ Prometheus 告警条件的 PrometheusRule
- 用于 Alertmanager Slack 配置(可选)的 Secret
- 每个 RabbitMQ Grafana 仪表板定义的 ConfigMap
触发您的第一个 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 中移除,并向您的 Slack 频道发送一个 **RESOLVED** 通知。
过去和现在的 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 进程和原子、消息重传等。商业客户询问我们关于运行手册和自动告警解决的问题。
您对当前的告警规则有什么看法?您缺少哪些告警?通过 GitHub 讨论告诉我们。
