Prometheus Alertmanager 告警组件学习

发布于:2025-09-02 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、序言

本篇将根据官网手册来学习Alertmanager 告警工具,并结合其他教程来完善。
官网手册:https://prometheus.io/docs/alerting/latest/overview/#required-for-focus

Alertmanager 介绍:

Alertmanager 处理客户端应用程序(如 Prometheus 服务器)发送的警报。它负责去重、分组,并将它们路由到正确的接收器集成,例如电子邮件、PagerDuty 或 OpsGenie。它还负责警报的静音和抑制。

以下是对 Alertmanager 更详细的介绍:

  • 分组:

    分组将性质相似的警报分类为单个通知。这在大型故障期间特别有用,当时许多系统同时失效,可能同时触发数百到数千个警报。

    示例: 当发生网络分区时,您的集群中有数十个或数百个服务实例正在运行。您服务的一半实例无法再访问数据库。Prometheus 中的告警规则被配置为,如果服务实例无法与数据库通信,则针对每个服务实例发送告警。结果,数百个告警被发送到 Alertmanager。

    作为用户,您只想获取一个页面,同时仍能确切看到哪些服务实例受到影响。因此,您可以配置 Alertmanager 按其 cluster 和 alertname 对告警进行分组,以便它发送一个紧凑的通知。

    告警的分组、分组通知的发送时间以及接收这些通知的接收者,在配置文件中的路由树中进行配置

  • 抑制:

    抑制是一个概念,当某些其他警报已经触发时,它会抑制某些特定警报的通知。

    示例: 有一个警报正在触发,告知整个集群无法访问。Alertmanager 可以配置为,如果该特定警报正在触发,则静音所有其他与此集群相关的警报。这可以防止数百或数千个与实际问题无关的触发警报的通知。

    抑制通过 Alertmanager 的配置文件进行配置。

  • 静默:

    静默是一种简单的方法,可以暂时屏蔽警报。静默的配置基于匹配器,就像路由树一样。传入的警报会检查它们是否匹配所有活跃静默中的等式或正则表达式匹配器。如果匹配,则不会为该警报发送通知。

    静默在 Alertmanager 的 Web 界面中配置。

二、安装Alertmanager

1. 下载Alertmanager

下载页面:https://prometheus.io/download/,找到Alertmanager进行下载
Alertmanager手册地址:https://github.com/prometheus/alertmanager

wget  https://github.com/prometheus/alertmanager/releases/download/v0.28.1/alertmanager-0.28.1.linux-amd64.tar.gz
tar -zxvf alertmanager-0.28.1.linux-amd64.tar.gz
ll
drwxr-xr-x 3 1001 1002     4096 Aug 22 15:54 ./
drwxr-xr-x 8 root root     4096 Aug 22 15:53 ../
-rwxr-xr-x 1 1001 1002 38948743 Mar  7 23:06 alertmanager*
-rw-r--r-- 1 1001 1002      356 Mar  7 23:07 alertmanager.yml
-rwxr-xr-x 1 1001 1002 30582387 Mar  7 23:06 amtool*
drwxr-xr-x 2 root root     4096 Aug 22 16:36 data/
-rw-r--r-- 1 1001 1002    11357 Mar  7 23:07 LICENSE
-rw-r--r-- 1 1001 1002      311 Mar  7 23:07 NOTICE
  • alertmanager:二进制可执行文件
  • alertmanager.yml:核心配置文件
  • amtool:Alertmanager 的命令行工具,与 Alertmanager 进行交互。
  • data:存储 Alertmanager 的数据,在Alertmanager 重启时,可以从这个目录中读取之前保存的数据。

启动alertmanager :

./alertmanager --config.file=alertmanager.yml

9093端口访问web告警页面:
在这里插入图片描述

2. Alertmanager 菜单栏功能介绍:

Alerts:查看当前活跃的告警分组
(1)筛选与分组

  • Filter:通过标签筛选告警(如 env=“production” 只显示生产环境的告警)。
  • Group:按配置的 group_by 规则(如 alertname、cluster)展示分组后的告警。

(2)状态筛选

  • Receiver: All:筛选特定接收者的告警。
  • Receiver: web.hook:仅显示与 web.hook 接收者关联的告警
  • Silenced:仅显示被 “静默规则” 屏蔽的告警。
  • Inhibited:仅显示被 “抑制规则” 屏蔽的告警(由主故障引发的次生告警)。
  • Muted:仅显示被 “mute 规则” 屏蔽的告警(部分定制场景)。

Silences:管理 “静默规则”(临时屏蔽指定告警,避免通知干扰)

(1)顶部按钮

  • New Silence:创建新的静默规则(指定匹配条件、生效时间、注释)。

(2)筛选栏

  • Filter:通过标签筛选静默规则(如 env=“production” 只显示生产环境的静默规则)。

(3)状态标签

  • Active:正在生效的静默规则(当前屏蔽告警)。
  • Pending:即将生效的静默规则(未来某个时间开始屏蔽)。
  • Expired:已过期的静默规则(历史记录,可用于审计)。

Settings:选择周一或者周日作为一周的第一天。

3. 配置systemd系统服务(可选)

cat > /lib/systemd/system/alertmanager.service << EOF
[Unit]
Description=Receive alerts from Prometheus and route them to the designated receiver.
Documentation=https://github.com/prometheus/alertmanager

[Service]
Restart=on-failure
EnvironmentFile=/etc/default/alertmanager
ExecStart=/usr/bin/alertmanager \$ARGS
ExecReload=/bin/kill -HUP \$MAINPID
TimeoutStopSec=20s
SendSIGKILL=no

[Install]
WantedBy=multi-user.target

EOF

移动配置文件和二进制文件到指定的位置:

cp alertmanager amtool /usr/bin/
mkdir /etc/alertmanager && cp alertmanager.yml  /etc/alertmanager/
touch  /etc/default/alertmanager && echo 'ARGS="--config.file=/etc/alertmanager/alertmanager.yml --storage.path=/var/lib/alertmanager"' > /etc/default/alertmanager

创建存储位置:

mkdir /var/lib/alertmanager

加载systemd配置并启动alertmanager:

systemctl daemon-reload
systemctl start alertmanager

4. 使用docker部署(可选)

镜像使用参考docker-hub: https://hub.docker.com/r/prom/alertmanager

拉取镜像:

镜像加速器:https://quay-pull.ygxz.in

docker pull quay.io/prometheus/alertmanager

查看镜像构建过程

quay.io/prometheus/alertmanager --no-trunc
IMAGE                                                                     CREATED         CREATED BY                                                                                                                             SIZE      COMMENT
sha256:91c01b3cec9b5b3071454a5bf13814e64127ed1601b9afd3b932559945fc9a5e   5 months ago    CMD ["--config.file=/etc/alertmanager/alertmanager.yml" "--storage.path=/alertmanager"]                                                0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    ENTRYPOINT ["/bin/alertmanager"]                                                                                                       0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    WORKDIR /alertmanager                                                                                                                  0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    VOLUME [/alertmanager]                                                                                                                 0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    EXPOSE map[9093/tcp:{}]                                                                                                                0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    USER nobody                                                                                                                            0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    RUN |2 ARCH=amd64 OS=linux /bin/sh -c mkdir -p /alertmanager &&     chown -R nobody:nobody etc/alertmanager /alertmanager # buildkit   356B      buildkit.dockerfile.v0
<missing>                                                                 5 months ago    COPY examples/ha/alertmanager.yml /etc/alertmanager/alertmanager.yml # buildkit                                                        356B      buildkit.dockerfile.v0
<missing>                                                                 5 months ago    COPY .build/linux-amd64/alertmanager /bin/alertmanager # buildkit                                                                      38.9MB    buildkit.dockerfile.v0
<missing>                                                                 5 months ago    COPY .build/linux-amd64/amtool /bin/amtool # buildkit                                                                                  30.6MB    buildkit.dockerfile.v0
<missing>                                                                 5 months ago    ARG OS=linux                                                                                                                           0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    ARG ARCH=amd64                                                                                                                         0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    LABEL org.opencontainers.image.source=https://github.com/prometheus/alertmanager                                                       0B        buildkit.dockerfile.v0
<missing>                                                                 5 months ago    LABEL maintainer=The Prometheus Authors <prometheus-developers@googlegroups.com>                                                       0B        buildkit.dockerfile.v0
<missing>                                                                 20 months ago   COPY /rootfs / # buildkit                                                                                                              1.54MB    buildkit.dockerfile.v0
<missing>                                                                 20 months ago   MAINTAINER The Prometheus Authors <prometheus-developers@googlegroups.com>                                                             0B        buildkit.dockerfile.v0
<missing>                                                                 21 months ago   /bin/sh -c #(nop)  CMD ["sh"]                                                                                                          0B
<missing>                                                                 21 months ago   /bin/sh -c #(nop) ADD file:ee9bb8755ccbdd689b434d9b4ac7518e972699604ecda33e4ddc2a15d2831443 in /                                       1.24MB

截取主要内容:

  • 完整启动命令: /bin/alertmanager--config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager
  • 声明的一个卷,挂载到/alertmanager
  • 声明使用的端口号为:9093

启动容器:

docker run --name alertmanager -d -p 9093:9093 quay.io/prometheus/alertmanager

三、Alertmanager配置

1. 告警流程了解

在告警概述中有描述:https://prometheus.io/docs/alerting/latest/overview/

使用 Prometheus 进行告警分为两个部分。Prometheus 服务器中的告警规则将告警发送到 Alertmanager。Alertmanager 然后管理这些告警,包括静音、抑制、聚合和 通过电子邮件、待命通知系统和聊天平台等方式发送通知。

设置告警和通知的主要步骤是:

  • 设置并配置 Alertmanager
  • 配置 Prometheus 以与 Alertmanager 通信
  • 在 Prometheus 中创建告警规则

Prometheus告警和通知的流程:

prometheus设置告警规则 --> 触发告警 --> 满足触发时间 --> prometheus向alertmanager发送Firing 告警 --> alertmanager对告警进行分组|聚合|抑制|静默 --> 将告警路由到指定接收器 --> 接收器发送给指定接收人(告警|恢复)。

  • 接收器指的是告警媒体,比如邮件,微信,钉钉等

2. 根据告警流程来配置

2.1. 配置alertmanager

alertmanager完整配置官网介绍:https://prometheus.io/docs/alerting/latest/configuration

alertmanager配置可以分为5个模块如下:

模块名称 作用 详细说明
global 全局设置 全局配置指定在所有其他配置上下文中有效的参数,它们也作为其他配置部分的默认值。
route 路由相关的设置 与路由相关的设置允许根据时间配置警报的路由、聚合、节流和静音。
inhibit_rule 抑制相关设置 抑制允许根据另一组告警的存在来静音一组告警。这允许在系统或服务之间建立依赖关系,以便在故障期间只发出一组相互关联告警中最相关的告警。
receivers 通用接收器相关设置 接收器是一个包含一个或多个通知集成的命名配置。
templates 通知模板 导入一个或多个通知模板

官网配置示例:https://github.com/prometheus/alertmanager/blob/main/doc/examples/simple.yml

配置示例如下:

使用promtool 检查你的配置文件:

promtool check config /etc/prometheus/prometheus.yml

下面的配置文件中不包含templates告警通知模板,templates 将单独一篇文章介绍

global:
  # 全局 SMTP 配置(所有邮件接收器可共用)
  smtp_from: "example@qq.com"  # 发件人邮箱
  smtp_smarthost: "smtp.qq.com:465"  # QQ邮箱SMTP服务器地址及端口
  smtp_hello: "qq.com"               # 向SMTP服务器标识的主机名
  smtp_auth_username: "example@qq.com"  # 发件人邮箱账号
  smtp_auth_password: "yuhjzmwanwkaddge"  # QQ邮箱SMTP授权码
  smtp_require_tls: false  # QQ邮箱465端口使用SSL而非STARTTLS,需设为false

route:
  group_by: ['alertstype']  # 按告警标签进行分组,多个告警包含这个标签时会被分为一组告警
  group_wait: 30s          # 首次分组等待时间
  group_interval: 5m       # 同组告警更新间隔
  repeat_interval: 1h      # 未恢复告警的重复通知间隔
  receiver: 'IT部门'  # 告警接收对象

receivers:
- name: 'IT部门'
  email_configs:
  - send_resolved: true  # 告警恢复时发送通知
    to: "recipient@163.com"  # 收件人邮箱(可多个逗号分隔)
    tls_config:
      insecure_skip_verify: false  # 生产环境建议保持false,验证证书
    headers:
      Subject: "Prometheus 告警通知" # 自定义邮件主题
inhibit_rules:
- source_match:				# 匹配源告警,当源告警被触发会抑制,包含相同标签的 target_match告警将会被抑制
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['instance','project','env']  # 相同标签的告警才会被抑制

2.2. 配置 Prometheus 以与 Alertmanager 通信

修改prometheus配置文件alerting部分配置文件:

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 127.0.0.1:9093

添加alertmanagers告警地址并重新加载prometheus配置。

2.3. 创建Prometheus告警规则

告警规则的配置可以参考我之前的文章:https://blog.csdn.net/qq_50247813/article/details/150492677

使用amtool 检查你的配置文件:

amtool check-config alertmanager.yml

/etc/prometheus/alerting_rules.yml:

groups:
  #创建记录规则(计算并存储cpu使用率)
  - name: cpu_recording_rules
    rules:
    - record: instance:node_cpu_seconds:avg_rate5m
      expr: 100 - (avg by (instance,project,env) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
      labels:
        metric_type: derived
		
  #创建告警规则(引用记录规则)
  - name: cpu_alerts
    rules:
    - alert: HighCpuUsage
      expr: instance:node_cpu_seconds:avg_rate5m > 80
      for: 2m
      labels:
        severity: warning
        alertstype: NodeCpuAlerts		#添加alertstype标签,alertmanager使用包含这个标签的告警作为一组告警
      annotations:
        summary: "实例 {{ $labels.instance }} CPU使用率过高"
        description: "CPU使用率已达 {{ $value | humanize }}%(阈值80%)"

    - alert: CriticalCpuUsage
      expr: instance:node_cpu_seconds:avg_rate5m > 95
      for: 1m
      labels:
        severity: critical
        alertstype: NodeCpuAlerts		#添加alertstype标签,alertmanager使用包含这个标签的告警作为一组告警
      annotations:
          summary: "实例 {{ $labels.instance }} CPU使用率临界"
          description: "CPU使用率已达 {{ $value | humanize }}%(阈值95%),系统可能无响应!"
  • 在告警配置文件中,主要是通过表达式进行获取数据,并对数据进行分组计算:100 - (avg by (instance,project,env) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

在这里插入图片描述

以看出上述表达式计算cpu 5分钟内的使用率,并使用标签instanceprojectenv进行分组,除了·instance 其他两个都是在添加主机时添加的,上面配置alertmanager配置的时候就有使用到这3标签作为抑制条件。

2.4. 在Prometheus配置文件中导入告警规则

rule_files:
  - '/etc/prometheus/alerting_rules.yml'

重新加载prometheus配置文件

3. 测试告警

对cpu进行压测提高使用率:

stress --cpu 2 --timeout 600s

两个告警规则CriticalCpuUsage只有被发送给alertmanager ,HighCpuUsage 被抑制了。
在这里插入图片描述

查看alertmanager 告警,告警被分组发送给“IT部门”这个对象了。
在这里插入图片描述

查看邮件告警:
在这里插入图片描述

查看告警恢复:
告警恢复中,包含了HighCpuUsage告警。
在这里插入图片描述

4. 配置静默告警

在服务器需要维护关机的时候,或者已知会告警,但是需要忽略的时候,可以配置静默告警。

配置方法:

4.1. 使用web界面配置

alertmanager 默认自带了web ui :http://alertmanager:9093/’

点击 New Silence 进入到配置界面
在这里插入图片描述

窗口介绍:

  • Start :开始介绍
  • Duration: 持续时间
  • End:结束时间
  • Matchers Alerts affected by this silence : 通过标签来静默告警
  • Creator:静默规则创建人
  • Comment:描述
  • Preview Alerts:预览告警
  • Create:创建告警
  • Reset:重置告警

点击创建后:

在这里插入图片描述

点击Expire使静默规则失效

4.2 使用amtool创建静默规则

amtool silence add \
  --alertmanager.url=http://localhost:9093 \
  --start=2025-08-28T08:45:39.061Z \
  --end=2025-08-28T08:55:24.343Z \
  --comment="这是一个测试" \
  alertstype=NodeCpuAlerts
  • start:开始时间使用的是UTC时间,换成北京时间需要+8
  • end: 结束时间
  • T用来区分日期与时间,Z表明是UTC时间
  • alertstype=NodeCpuAlerts:匹配告警标签

在web界面查看规则:
在这里插入图片描述
使用amtool查看:

amtool silence --alertmanager.url=http://localhost:9093

在这里插入图片描述
amtool 取消静默规则:

amtool silence  expire 8f131e67-1046-4897-bc4d-5a10117262ab --alertmanager.url=http://localhost:9093
  • 8f131e67-1046-4897-bc4d-5a10117262ab : 规则id

4.3. cpu压测查看效果

 stress --cpu 2 --timeout 600s

prometheus 中 已经触发了告警
在这里插入图片描述

在alertmanager 中没有告警,
在这里插入图片描述

5. alertmanager route详细学习

alertmanager route 路由原理是通过匹配标签来决定如何发送告警,从根路由触发一级一级匹配。
在这里插入图片描述

通过路由细分来学习:
在这里插入图片描述

下面通过实验来完成图上路由细分:

(1) 创建两个告警cpu_alertsmemory_alerts,如下:

/etc/prometheus/alerting_rules.yml:

groups:
# 记录规则
  #保存cpu使用率
  - name: cpu_usage_rules
    rules:
    - record: instance:node_cpu_seconds:avg_rate5m
      expr: 100 - (avg by (instance,target_type,env) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
      labels:
        metric_type: derived
  #保存内存使用率
  - name: memory_usage_rules
    rules:
    - record: instance:node_memory:avg
      expr: avg by (instance,target_type,env) (100 - ((node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes)  * 100)
      labels:
        metric_type: derived
# 告警规则
  - name: cpu_alerts
    rules:
    - alert: HighCpuUsage
      expr: instance:node_cpu_seconds:avg_rate5m > 80
      for: 2m
      labels:
        severity: warning
        alertstype: NodeCpuAlerts
      annotations:
        summary: "实例 {{ $labels.instance }} CPU使用率过高"
        description: "CPU使用率已达 {{ $value | humanize }}%(阈值80%)"

    - alert: CriticalCpuUsage
      expr: instance:node_cpu_seconds:avg_rate5m > 95
      for: 1m
      labels:
        severity: critical
        alertstype: NodeCpuAlerts
      annotations:
        summary: "实例 {{ $labels.instance }} CPU使用率临界"
        description: "CPU使用率已达 {{ $value | humanize }}%(阈值95%),系统可能无响应!"

  - name: memory_alerts
    rules:
    - alert: HighMemoryUsage
      expr: instance:node_memory:avg > 80
      for: 2m
      labels:
        severity: warning
        alertstype: NodeMemoryAlerts
      annotations:
        summary: "实例 {{ $labels.instance }} 内存使用率过高"
        description: "memory使用率已达 {{ $value | humanize }}%(阈值80%)"
    - alert: CriticalMemoryUsage
      expr: instance:node_memory:avg > 95
      for: 1m
      labels:
        severity: critical
        alertstype: NodeMemoryAlerts
      annotations:
        summary: "实例 {{ $labels.instance }} 内存使用率临界"
        description: "memory使用率已达 {{ $value | humanize }}%(阈值95%),请尽快处理!"

(2)配置路由:
alertmanager配置文件:

/etc/alertmanager/alertmanager.yml:

global:
  # 全局 SMTP 配置(所有邮件接收器可共用)
  smtp_from: "2734542837@qq.com"  # 发件人邮箱
  smtp_smarthost: "smtp.qq.com:465"  # QQ邮箱SMTP服务器地址及端口
  smtp_hello: "qq.com"               # 向SMTP服务器标识的主机名
  smtp_auth_username: "2734542837@qq.com"  # 发件人邮箱账号
  smtp_auth_password: "yuhjzmwanwkaddge"  # QQ邮箱SMTP授权码
  smtp_require_tls: false  # QQ邮箱465端口使用SSL而非STARTTLS,需设为false

#根路由,根路由的配置会被子路由继承
route:
  group_by: ['instance','target_type','env']  # 按告警名称分组
  group_wait: 30s          # 首次分组等待时间
  group_interval: 5m       # 同组告警更新间隔
  repeat_interval: 1h      # 未恢复告警的重复通知间隔
  receiver: 'IT负责人'  # 告警接收对象
  routes:
  #下级路由
  - receiver: '运维组'
    matchers:
    - env="prod"    # 匹配标签env="prod"
    continue: true    # 匹配完继续向下匹配,默认是false
    #在下级路由
    routes:
    - receiver: '张三'
      matchers:
      - alertstype="NodeMemoryAlerts"
# 告警对象配置
receivers:
- name: 'IT负责人'
  email_configs:
  - send_resolved: true  # 告警恢复时发送通知
    to: "example01@163.com"
    tls_config:
      insecure_skip_verify: false  # 生产环境建议保持false,验证证书
    headers:
      Subject: "Prometheus 告警通知" # 自定义邮件主题
- name: '运维组'
  email_configs:
  - send_resolved: true  # 告警恢复时发送通知
    to: "example02@qq.com"
    tls_config:
      insecure_skip_verify: false
    headers:
      Subject: "Prometheus 告警通知"
- name: '张三'
  email_configs:
  - send_resolved: true
    to: "example03@163.com"
    tls_config:
      insecure_skip_verify: false
    headers:
      Subject: "Prometheus 告警通知"
# 告警抑制配置
inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['instance','target_type','env']  # 相同标签的告警才会被抑制

内存压测:

 stress --vm 2 --vm-bytes 1.5G --vm-keep --timeout 1000s

example02@qq.com 和 example03@163.com 会同时收到告警。

6. 告警静音配置

适用场景在与,非工作日时,不重要的告警将会被静音,不发送告警;

例如:
在非工作日时,将告警级别为warning的静音,修改alertmanager配置文件:

# 配置静音时间
mute_time_intervals:
- name: weekends  # 自定义静音规则名称
  time_intervals:  # 时间间隔定义
  - times:  # 覆盖全天(00:0024:00- start_time: 00:00
      end_time: 24:00
    weekdays:  # 明确指定周六和周日(使用名称,不支持数字)
    - Saturday  # 周六
    - Sunday    # 周日
    location: Local  # 使用 Alertmanager 所在机器的本地时间(可选,默认 UTC)
    
#根路由
route:
  group_by: ['instance','target_type','env']  # 按告警名称分组
  group_wait: 30s          # 首次分组等待时间
  group_interval: 5m       # 同组告警更新间隔
  repeat_interval: 1h      # 未恢复告警的重复通知间隔
  receiver: 'IT负责人'  # 告警接收对象
  #下级路由
  routes:
  - receiver: '运维组'
    matchers:
    - env="prod"    # 匹配标签env="prod"
    - severity="warning" # 匹配告警级别
   mute_time_intervals:
      - weekends			# 调用静音规则,会传递给下面的子路由
    continue: true    # 匹配完继续向下匹配,默认是false
    #在下级路由
    routes:
    - receiver: '张三'
      matchers:
      - alertstype="NodeMemoryAlerts
  • 匹配上 - env="prod"- severity="warning" 周末将会被静音,我这边是实验使用 - env="prod" ,正常环境应该test或者dev

网站公告

今日签到

点亮在社区的每一天
去签到