RabbitMQ 出现问题时通知我
如果您希望在 RabbitMQ 部署出现问题时收到通知,现在您可以在 RabbitMQ 集群操作符 存储库中设置我们提供的 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 集群的操作符不可用。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 集群操作符 将
RabbitmqCluster
声明为自定义资源定义 (CRD),并在 Kubernetes 中管理所有 RabbitMQ 集群 - kube-prometheus-stack Helm 图表,安装
- Prometheus 操作符 管理 Prometheus 和 Alertmanager,添加
PrometheusRule
和ServiceMonitor
自定义资源定义 - Prometheus 从所有 RabbitMQ 节点抓取(即读取)指标,将指标存储在时间序列数据库中,评估警报规则
- Alertmanager 从 Prometheus 接收警报,按 RabbitMQ 集群对警报进行分组,可以选择将警报发送到 Slack(或其他服务)
- Grafana 可视化 Prometheus 的指标
- kube-state-metrics 提供 RabbitMQ 警报规则依赖的 Kubernetes 指标
- Prometheus 操作符 管理 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://127.0.0.1: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://127.0.0.1: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://127.0.0.1:3000/d/jjCq5SLMk(用户名:admin
和密码:admin
)
kubectl -n kube-prometheus port-forward svc/prom-grafana 3000:80
在上面的示例中,我们已跨多个 RabbitMQ 集群触发了多个警报。
您能提供什么帮助?
我们分享了我们能想到的最简单和最有用的警报。你们中的一些人已经询问我们缺少的警报,例如内存阈值、Erlang 进程和原子、消息重新传递等。商业客户 要求我们提供运行手册和自动警报解决。
您对当前的警报规则有什么想法?您缺少哪些警报?通过 GitHub 讨论让我们知道。