在云原生架构中,监控告警是至关重要的一环。Prometheus 作为一款强大的时序数据库,结合 Alertmanager 可以实现灵活的告警管理。本文将深入探讨如何配置 Prometheus+Alertmanager,并通过钉钉机器人实现告警通知,提升运维效率。尤其是在复杂的微服务架构中,例如使用了 Kubernetes 进行容器编排,对服务可用性和性能的监控显得尤为重要。当服务出现故障,例如 CPU 使用率过高、内存溢出、响应时间超长等情况,能够第一时间收到告警信息,对于快速恢复服务至关重要。
1. 环境准备与组件安装
首先,我们需要安装 Prometheus 和 Alertmanager。 这里我们采用 Docker Compose 部署,方便快捷。
version: '3'
services:
prometheus:
image: prom/prometheus:v2.45.0 # 使用稳定版本
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml # 挂载 Prometheus 配置文件
restart: always # 服务故障后自动重启
alertmanager:
image: prom/alertmanager:v0.26.0 # 使用稳定版本
ports:
- "9093:9093"
volumes:
- ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml # 挂载 Alertmanager 配置文件
restart: always # 服务故障后自动重启
确保宿主机安装了 Docker 和 Docker Compose。然后,创建 prometheus 和 alertmanager 目录,并分别放入 prometheus.yml 和 alertmanager.yml 配置文件。
2. Prometheus 配置
在 prometheus.yml 中,我们需要配置 Prometheus 的数据抓取规则。例如,我们可以监控 Node Exporter 暴露的服务器指标:
global:
scrape_interval: 15s # 抓取数据的间隔
evaluation_interval: 15s # 规则评估的间隔
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093 # Alertmanager 的地址
scrape_configs:
- job_name: 'node_exporter' # 监控 Node Exporter
static_configs:
- targets: ['node_exporter:9100'] # Node Exporter 的地址
确保安装并运行了 Node Exporter,并将 node_exporter:9100 替换为实际的 Node Exporter 地址。
3. Alertmanager 配置与钉钉集成
alertmanager.yml 文件是配置 Alertmanager 的核心。我们需要配置路由规则,将告警发送到钉钉机器人。
global:
resolve_timeout: 5m # 告警恢复的超时时间
route:
group_by: ['alertname'] # 根据 alertname 进行分组
group_wait: 30s # 等待多久发送告警
group_interval: 5m # 告警发送的间隔
repeat_interval: 12h # 告警重复发送的间隔
receiver: 'dingtalk' # 告警接收者
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_DINGTALK_TOKEN' # 钉钉机器人的 Webhook 地址,替换成你自己的 token
send_resolved: true # 告警恢复后是否发送通知
templates:
- '/etc/alertmanager/templates/dingtalk.tmpl' # 模板文件路径
注意: 将 YOUR_DINGTALK_TOKEN 替换为你的钉钉机器人 Token。可以在钉钉群中创建自定义机器人,获取 Webhook 地址。
还需要创建一个 dingtalk.tmpl 模板文件,用于自定义钉钉消息的格式。
{{ define "dingtalk.content" }}
{{ if gt (len .Alerts.Firing) 0 }}
**{{ .CommonAnnotations.summary }}**
{{ range .Alerts.Firing }}
- 告警级别: {{ .Labels.severity }}
- 告警实例: {{ .Labels.instance }}
- 告警详情: {{ .Annotations.description }}
- 开始时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
**告警已恢复**
{{ range .Alerts.Resolved }}
- 告警级别: {{ .Labels.severity }}
- 告警实例: {{ .Labels.instance }}
- 告警详情: {{ .Annotations.description }}
- 结束时间: {{ .EndsAt.Format "2006-01-02 15:04:05" }}
{{ end }}
{{ end }}
{{ end }}
{{ define "dingtalk.text" }}
{
"msgtype": "text",
"text": {
"content": "{{ template \"dingtalk.content\" . }}"
}
}
{{ end }}
{{ define "dingtalk.markdown" }}
{
"msgtype": "markdown",
"markdown": {
"title": "Prometheus告警",
"text": "{{ template \"dingtalk.content\" . }}"
}
}
{{ end }}
{{ define "dingtalk.default" }}{{ template "dingtalk.markdown" . }}{{ end }}
在 alertmanager.yml 中指定模板路径,例如 /etc/alertmanager/templates/dingtalk.tmpl。确保 Alertmanager 能够读取到该文件。
4. Prometheus 告警规则配置
在 prometheus.yml 中,我们需要配置告警规则,当满足条件时,Prometheus 会将告警发送给 Alertmanager。
rules:
- alert: HighCPUUsage # 告警名称
expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) < 10 # CPU 使用率超过 90%
for: 1m # 持续 1 分钟触发告警
labels:
severity: critical # 告警级别
annotations:
summary: "CPU 使用率过高 (实例 {{ $labels.instance }})" # 告警摘要
description: "CPU 使用率超过 90%,请检查服务器性能。当前值: {{ $value }}"
这个规则表示,当 CPU 使用率持续 1 分钟超过 90% 时,会触发一个 HighCPUUsage 告警,告警级别为 critical。
5. 常见问题与避坑指南
- 钉钉机器人收不到告警:
- 检查钉钉机器人 Token 是否正确。
- 检查 Alertmanager 的网络配置,确保能够访问钉钉 API。
- 检查 Alertmanager 日志,查看是否有错误信息。
- 告警消息格式不正确:
- 检查
dingtalk.tmpl模板文件是否正确。 - 检查 Alertmanager 的配置文件,确保模板路径正确。
- 检查
- 告警频繁触发:
- 调整告警规则的阈值和持续时间。
- 优化代码,降低资源消耗。
- Alertmanager 启动失败:
- 检查
alertmanager.yml文件语法是否正确。 - 检查端口是否被占用。
- 检查
在实际应用中,可以结合 Grafana 等可视化工具,更加直观地展示监控数据,并设置更加复杂的告警规则,打造完善的监控告警体系。例如,可以使用 Grafana 展示服务器的 CPU、内存、磁盘 IO 等指标,并根据业务需求,设置针对特定服务的告警规则。同时,可以结合日志分析工具,例如 ELK Stack,对日志进行监控和分析,及时发现潜在的问题。
通过以上步骤,我们就可以实现 Prometheus+Alertmanager 联动钉钉告警,及时掌握系统运行状态,保障服务的稳定性和可靠性。
冠军资讯
半杯凉茶