跳至主要内容

RabbitMQ 出现问题时通知我

·阅读 6 分钟
Gerhard Lazu

如果您希望在 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 调度或错误配置问题。

如何快速入门?

您将需要以下内容

  1. 任何 Kubernetes 部署版本 1.18 或更高版本
  2. kubectl 指向您的 Kubernetes 部署并匹配 Kubernetes 服务器版本
  3. helm 版本 3

现在您已准备好运行以下终端命令

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,添加 PrometheusRuleServiceMonitor 自定义资源定义
    • Prometheus 从所有 RabbitMQ 节点抓取(即读取)指标,将指标存储在时间序列数据库中,评估警报规则
    • Alertmanager 从 Prometheus 接收警报,按 RabbitMQ 集群对警报进行分组,可以选择将警报发送到 Slack(或其他服务)
    • Grafana 可视化 Prometheus 的指标
    • kube-state-metrics 提供 RabbitMQ 警报规则依赖的 Kubernetes 指标
  • 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 按 namespacerabbitmq_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 讨论让我们知道。

© 2024 RabbitMQ. All rights reserved.