Alertmanager 安装与配置指南

Alertmanager 支持二进制包、容器及源码三种安装方式,官方推荐使用 Docker 容器运行。本文将基于 Docker 方式部署 Alertmanager,并完成与 Prometheus 的集成。



一、部署 Alertmanager(Docker 方式)

1. 创建配置目录

复制代码
mkdir -p /etc/prometheus/alertmanager

2. 编写 Alertmanager 配置文件

复制代码
vim /etc/prometheus/alertmanager/config.yml

配置内容如下:

复制代码
global:
#  resolve_timeout: 5m
route:
  group_by: ['project','environment','alertname','ip','severity']
  receiver: alertmonitor #对应下面receivers中的name
  continue: false
  group_wait: 30s
  group_interval: 3m
  repeat_interval: 24h
  routes: 
  - receiver: 'alertmonitor'
    match:
      severity: 'critical'
    repeat_interval: 15m
  - receiver: 'alertmonitor'
    match:
      severity: 'warning'
    repeat_interval: 30m
  - receiver: 'alertmonitor'
    match:
      severity: 'info'
    repeat_interval: 6h  # 每天最多通知一次
receivers:
- name: abcdocker
  webhook_configs:
  - send_resolved: true
      #告警推送通知的api接口,如钉钉、飞书等
      url: 'http://172.xx.177.xx:18080/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/becxxxxxxxxx'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'env', 'instance']
    # 新增:确保严重级别告警抑制天级别告警
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'info'
    equal: ['alertname', 'env', 'instance']
  - source_match:
      severity: 'warning'
    target_match:
      severity: 'info'
    equal: ['alertname', 'env', 'instance']
templates:
  - /etc/prometheus/alertmanager/template/*.tmpl #告警模板路径

参数说明:
  • resolve_timeout:若在该时间内未收到新的告警,则标记为已恢复(resolved)。
  • follow_redirects:是否遵循 HTTP 3xx 重定向。
  • group_wait:首次触发告警后,等待此时间以合并同组内的新告警。
  • group_interval:相同告警组再次发送通知的最小间隔。
  • repeat_interval:重复发送同一告警的最小间隔。
  • continue: false:匹配到第一个子路由后即停止后续匹配。
  • templates:指定自定义告警模板路径。


二、编写告警通知模板(可选)

为提升告警信息的可读性,可自定义通知模板。

复制代码
mkdir -p /etc/prometheus/alertmanager/template
vim /etc/prometheus/alertmanager/template/WeChat.tmpl

模板内容如下(适用于飞书/Webhook 等通用文本通知):

复制代码
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
**********【告警通知】**********
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
{{- end }}
=====================
告警主题: {{ $alert.Annotations.summary }}
告警详情: {{ $alert.Annotations.description }}
故障时间: {{ $alert.StartsAt.Local }}
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}}
{{- end }}
{{- end }}

{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
**********【恢复通知】**********
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
{{- end }}
=====================
告警主题: {{ $alert.Annotations.summary }}
告警详情: {{ $alert.Annotations.description }}
故障时间: {{ $alert.StartsAt.Local }}
恢复时间: {{ $alert.EndsAt.Local }}
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}}
{{- end }}
{{- end }}
{{- end }}

⚠️ 注意:虽然本例命名为 WeChat.tmpl,但实际通过 Webhook 发送至飞书机器人,模板内容为纯文本格式,适用于大多数通知通道。



三、启动 Alertmanager 容器

复制代码
docker run -d \
  -p 9103:9093 \
  --name alertmanager \
  -v /etc/prometheus/alertmanager:/etc/alertmanager \
  -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime \
  docker.io/prom/alertmanager:latest \
  --config.file=/etc/alertmanager/config.yml

启动成功后,可通过 http://<服务器IP>:9103 访问 Alertmanager Web UI



四、配置 Prometheus 告警规则

1. 创建规则目录

建议将告警规则与 Prometheus 配置放在同一目录下:

复制代码
mkdir -p /etc/prometheus/rules

2. 添加 Node Exporter 告警规则

复制代码
vim /etc/prometheus/rules/node_exporter.yaml

示例规则如下:

复制代码
groups:
- name: 主机状态-监控告警
  rules:
  - alert: 主机宕机
    expr: up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "{{ $labels.instance }}: 服务器宕机"
      description: "{{ $labels.instance }}: 目标不可达超过1分钟"

  - alert: CPU使用率过高
    expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 60
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} CPU使用率过高"
      description: "{{ $labels.instance }} CPU使用率超过60%(当前值:{{ $value | printf "%.2f" }}%)"

  - alert: 内存使用率过高
    expr: (1 - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes) * 100 > 80
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} 内存使用率过高"
      description: "{{ $labels.instance }} 内存使用率超过80%(当前值:{{ $value | printf "%.2f" }}%)"

  - alert: 磁盘IO负载过高
    expr: avg by(instance) (irate(node_disk_io_time_seconds_total[1m])) * 100 < 60
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} 磁盘IO响应延迟"
      description: "{{ $labels.instance }} 磁盘IO利用率异常(当前值:{{ $value | printf "%.2f" }}%)"

  - alert: 网络流入带宽过高
    expr: sum by(instance) (rate(node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr.*|lo.*'}[5m])) / 1024 / 1024 > 100
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} 网络流入带宽过高"
      description: "{{ $labels.instance }} 入向带宽持续高于100MB/s(当前值:{{ $value | printf "%.2f" }} MB/s)"

  - alert: 网络流出带宽过高
    expr: sum by(instance) (rate(node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr.*|lo.*'}[5m])) / 1024 / 1024 > 100
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} 网络流出带宽过高"
      description: "{{ $labels.instance }} 出向带宽持续高于100MB/s(当前值:{{ $value | printf "%.2f" }} MB/s)"

  - alert: TCP连接数过高
    expr: node_netstat_Tcp_CurrEstab > 1000
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} TCP连接数过高"
      description: "{{ $labels.instance }} 当前ESTABLISHED连接数超过1000(当前值:{{ $value }})"

  - alert: 磁盘空间不足
    expr: 100 - (node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100) > 80
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "{{ $labels.instance }} {{ $labels.mountpoint }} 磁盘空间不足"
      description: "{{ $labels.instance }} {{ $labels.mountpoint }} 使用率超过80%(当前值:{{ $value | printf "%.2f" }}%)"

✅ 提示:后续新增告警规则,只需在 /etc/prometheus/rules/ 目录下添加新的 .yaml 文件即可,Prometheus 会自动加载。



五、集成 Alertmanager 到 Prometheus

1. 重新启动 Prometheus 容器(挂载配置目录)

复制代码
docker run -d \
  -p 9090:9090 \
  --restart=always \
  --name prometheus \
  -v /data/prometheus:/data/prometheus \
  -v /etc/prometheus:/etc/prometheus \
  registry.cn-beijing.aliyuncs.com/xx/prometheus:v2.18.1 \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/data/prometheus \
  --web.enable-admin-api \
  --web.enable-lifecycle \
  --storage.tsdb.retention.time=30d

2. 修改 Prometheus 配置文件

编辑 /etc/prometheus/prometheus.yml,添加以下内容:

复制代码
# 加载告警规则
rule_files:
  - '/etc/prometheus/rules/*.yaml'

# 配置 Alertmanager 地址
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['10.0.24.13:9103']  # 替换为实际 Alertmanager 地址

保存后,可通过 Prometheus 的 /-/reload 接口热加载配置(需启用 --web.enable-lifecycle):

复制代码
curl -X POST http://localhost:9090/-/reload


六、验证与调试

  1. 访问 Prometheus Web UI(http://<IP>:9090/alerts),确认告警规则已加载。
  2. 访问 Alertmanager Web UI(http://<IP>:9103),查看告警是否正确接收与分发。
  3. 模拟故障(如停用 Node Exporter),观察是否触发告警并收到飞书通知。


结语

通过以上步骤,您已成功部署并集成了 Alertmanager 与 Prometheus,实现了主机资源监控与自动化告警能力。后续可根据业务需求扩展通知渠道(如邮件、钉钉、企业微信)、优化告警规则,构建更完善的可观测性体系。


相关推荐
水岸齐天13 小时前
prometheus和Grafana介绍
grafana·prometheus
cui_win1 天前
Prometheus实战教程 05 - 告警通知实现 - 邮件 + 钉钉 + 自定义告警模板
钉钉·prometheus·邮件通知
杰克逊的日记2 天前
通过Prometheus对GPU集群进行监控以及搭建(小型集群)
prometheus·gpu算力·gpu服务器监控
happy_king_zi2 天前
RabbitMQ-Exporter 监控 TLS 加密的 RabbitMQ 集群
分布式·安全·rabbitmq·prometheus
梁正雄5 天前
6、prometheus资源规划
运维·服务器·服务发现·prometheus·监控
梁正雄5 天前
4、prometheus-服务发现k8s api-2
kubernetes·服务发现·prometheus
麦兜*9 天前
Spring Boot 应用 Docker 监控:Prometheus + Grafana 全方位监控
spring boot·后端·spring cloud·docker·prometheus
罗不俷10 天前
Prometheus 详解:从原理到实战,打造企业级云原生监控体系
云原生·prometheus
Deamon Tree12 天前
Prometheus和Grafana简介
grafana·prometheus