Altermanager安装和使用

news2024/9/23 7:25:27

1、Altermanager使用

1.1 什么是Alertmanager

Alertmanager 与 Prometheus 是相互分离的两个组件,Prometheus 服务器根据报警规则将警报发送给

Alertmanager,然后 Alertmanager 将 silencing、inhibition、aggregation 等消息通过电子邮件、dingtalk 和

HipChat 发送通知。

实现 prometheus 的告警,需要通过 altermanager 这个组件;在 prometheus 服务端写告警规则,在

altermanager 组件配置邮箱。

Alertmanager 处理由例如 Prometheus 服务器等客户端发来的警报。它负责删除重复数据、分组,并将警报通过

路由发送到正确的接收器,比如电子邮件、Slack、dingtalk 等。Alertmanager 还支持 groups,silencing 和警报

抑制的机制。

1.2 Alertmanager的工作机制

在这里插入图片描述

钉钉告警需要接入prometheus-webhook-dingtalk

1.3 Alertmanager安装

1.3.1 下载

下载地址:https://prometheus.io/download/

在这里插入图片描述

这里选择下载 alertmanager-0.24.0.linux-amd64.tar.gz

https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz

本地下载后上传到 linux 服务器。

1.3.2 解压

tar -xvf alertmanager-0.24.0.linux-amd64.tar.gz

1.3.3 启动

# 进入解压后的文件夹
cd /home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64
# 前台启动
./alertmanager --config.file=alertmanager.yml
# 后台启动alertmanager,并且重定向输入日志到当前目录的alertmanager.out
nohup ./alertmanager --config.file=alertmanager.yml >> nohup.out 2>&1 &

1.3.4 访问Altermanager

访问:http://192.168.54.195:9093/,默认端口为 9093

在这里插入图片描述

Alertmanager 可以在运行时重新加载其配置,如果新配置格式不正确,则不会应用更改并记录错误。配置重新加

载是通过向 SIGHUP 进程发送 a 或向/-/reload端点发送 HTTP POST 请求来触发的。

1.4 将Altermanager配置为系统服务

1.4.1 进入systemd目录

cd /usr/lib/systemd/system

1.4.2 创建文件

vim alertmanager.service
 
# 添加如下内容
[Unit]
Description=https://prometheus.io
  
[Service]
Restart=on-failure
ExecStart=/home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/alertmanager --config.file=/home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/alertmanager.yml

[Install]                      
WantedBy=multi-user.target

1.4.3 生效系统systemd文件

systemctl daemon-reload

1.4.4 启动和停止服务命令

# 启动
systemctl start alertmanager.service
# 停止
systemctl stop alertmanager.service
# 查看状态
systemctl status alertmanager.service
[root@zsx ~]# systemctl status alertmanager.service
● alertmanager.service - https://prometheus.io
   Loaded: loaded (/usr/lib/systemd/system/alertmanager.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-03-03 12:19:55 CST; 22s ago
 Main PID: 57949 (alertmanager)
    Tasks: 6
   Memory: 37.6M
   CGroup: /system.slice/alertmanager.service
           └─57949 /home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/alertmanager --config.fil...

Mar 03 12:19:55 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:55.899Z caller=main.go:231 level=info...11)"
Mar 03 12:19:55 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:55.899Z caller=main.go:232 level=info...33)"
Mar 03 12:19:55 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:55.917Z caller=cluster.go:185 level=i...9094
Mar 03 12:19:55 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:55.946Z caller=cluster.go:680 level=i...l=2s
Mar 03 12:19:56 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:56.007Z caller=coordinator.go:113 lev....yml
Mar 03 12:19:56 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:56.009Z caller=coordinator.go:126 lev....yml
Mar 03 12:19:56 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:56.027Z caller=main.go:535 level=info...9093
Mar 03 12:19:56 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:56.027Z caller=tls_config.go:195 leve...alse
Mar 03 12:19:57 zsx.com alertmanager[57949]: ts=2023-03-03T04:19:57.947Z caller=cluster.go:705 level=i...839s
Mar 03 12:20:05 zsx.com alertmanager[57949]: ts=2023-03-03T04:20:05.952Z caller=cluster.go:697 level=i...007s
Hint: Some lines were ellipsized, use -l to show in full.

1.5 altermanager.yml解读

altermanager.yml 文件的配置可以参考下面的进行配置:

global: # 即为全局设置,在Alertmanager配置文件中,只要全局设置配置了的选项,全部为公共设置,可以让其他设置继承,作为默认值,可以子参数中覆盖其设置。
  resolve_timeout: 1m # 用于设置处理超时时间,也是生命警报状态为解决的时间,这个时间会直接影响到警报恢复的通知时间,需要自行结合实际生产场景来设置主机的恢复时间,默认是5分钟。
  # 整合邮件
  smtp_smarthost: 'smtp.qq.com:465' # 邮箱smtp服务器
  smtp_from: '1451578387@qq.com' # 发件用的邮箱地址
  smtp_auth_username: '1451578387@qq.com' # 发件人账号
  smtp_auth_password: 'dkuuifhdskaduasdsb' # 发件人邮箱密码
  smtp_require_tls: false # 不进行tls验证
route: # 路由分组
  group_by: ['alertname'] # 报警分组
  group_wait: 10s # 组内等待时间,同一分组内收到第一个告警等待多久开始发送,目标是为了同组消息同时发送,不占用告警信息,默认30s。
  group_interval: 10s # 当组内已经发送过一个告警,组内若有新增告警需要等待的时间,默认为5m,这条要确定组内信息是影响同一业务才能设置,若分组不合理,可能导致告警延迟,造成影响。
  repeat_interval: 1h # 告警已经发送,且无新增告警,若重复告警需要间隔多久,默认4h,属于重复告警,时间间隔应根据告警的严重程度来设置。
  receiver: 'webhook' # 告警的接收者,需要和 receivers[n].name 的值一致。
  # 上面所有的属性都由所有子路由继承,并且可以在每个子路由上进行覆盖。
  # 当报警信息中标签匹配到team:node时会使用email发送报警,否则使用webhook。
  routes:
  - receiver: 'email'
    group_wait: 10s
    match:
      team: node
# 接收器指定发送人以及发送渠道
# 接收者有多种类型
# email_config
# hipchat_config
# pagerduty_config
# pushover_config
# slack_config
# opsgenie_config
# victorops_config
# webhook_config
# wechat_config
receivers:
 # webhook分组的定义
 - name: 'webhook'
   # 钉钉配置
   webhook_configs:
   - url: http://localhost:8060/dingtalk/ops_dingding/send
     send_resolved: true
 - name: 'mail'
   # 邮箱配置
   email_configs:
   # 可以有多个收件人
   - to: '18234725647@163.com'
   - to: '1239683670@qq.com'
     # 如果当前收件人需要接受告警恢复的通知的话,在email_config中定义send_resolved为true即可
     send_resolved: true
# 抑制规则
# 合理设置抑制规则可以减少垃圾告警的产生
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning' # 告警级别,如果警报名称相同,则静音
    equal: ['alertname', 'dev', 'instance']
# global块配置下的配置选项在本配置文件内的所有配置项下可见。
global:
  # 在Alertmanager内管理的每一条告警均有两种状态:"resolved"或者"firing",在altermanager首次发送告警通知后,该告警会一直处于firing状态,设置resolve_timeout可以指定处于firing状态的告警间隔多长时间会被设置为resolved状态,在设置为resolved状态的告警后,altermanager不会再发送firing的告警通知。
  resolve_timeout: 1h
  # 邮件告警配置
  smtp_smarthost: 'smtp.exmail.qq.com:25'
  smtp_from: 'dukuan@xxx.com'
  smtp_auth_username: 'dukuan@xxx.com'
  smtp_auth_password: 'DKxxx'
  # HipChat告警配置
  hipchat_auth_token: '123456789'
  hipchat_auth_url: 'https://hipchat.foobar.org/'
  # wechat
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
  wechat_api_secret: 'JJ'
  wechat_api_corp_id: 'ww'
  # 告警通知模板
templates:
- '/etc/alertmanager/config/*.tmpl'
# route根路由,该模块用于该根路由下的节点及子路由routes的定义,子树节点如果不对相关配置进行配置,则默认会从父路由树继承该配置选项。每一条告警都要进入route,即要求配置选项group_by的值能够匹配到每一条告警的至少一个labelkey(即通过POST请求向altermanager服务接口所发送告警的labels项所携带的<labelname>),告警进入到route后,将会根据子路由routes节点中的配置项match_re或者match来确定能进入该子路由节点的告警(由在match_re或者match下配置的labelkey:labelvalue是否为告警labels的子集决定,是的话则会进入该子路由节点,否则不能接收进入该子路由节点)。
route:
  # 例如所有labelkey:labelvalue含cluster=A及altertname=LatencyHigh的labelkey的告警都会被归入单一组中
  group_by: ['job', 'altername', 'cluster', 'service','severity']
  # 若一组新的告警产生,则会等group_wait后再发送通知,该功能主要用于当告警在很短时间内接连产生时,在group_wait内合并为单一的告警后再发送
  group_wait: 30s
  # 再次告警时间间隔
  group_interval: 5m
  # 如果一条告警通知已成功发送,且在间隔repeat_interval后,该告警仍然未被设置为resolved,则会再次发送该告警通知
  repeat_interval: 12h
  # 默认告警通知接收者,凡未被匹配进入各子路由节点的告警均被发送到此接收者
  receiver: 'wechat'
  # 上述route的配置会被传递给子路由节点,子路由节点进行重新配置才会被覆盖
  # 子路由树
  routes:
  # 该配置选项使用正则表达式来匹配告警的labels,以确定能否进入该子路由树
  # match_re和match均用于匹配labelkey为service,labelvalue分别为指定值的告警,被匹配到的告警会将通知发送到对应的receiver
  - match_re:
      service: ^(foo1|foo2|baz)$
    receiver: 'wechat'
    # 在带有service标签的告警同时有severity标签时,他可以有自己的子路由,同时具有severity != critical的告警则被发送给接收者team-ops-mails,对severity == critical的告警则被发送到对应的接收者即team-ops-pager
    routes:
    - match:
        severity: critical
      receiver: 'wechat'
  # 比如关于数据库服务的告警,如果子路由没有匹配到相应的owner标签,则都默认由team-DB-pager接收
  - match:
      service: database
    receiver: 'wechat'
  # 我们也可以先根据标签service:database将数据库服务告警过滤出来,然后进一步将所有同时带labelkey为database
  - match:
      severity: critical
    receiver: 'wechat'
# 抑制规则,当出现critical(关键的)告警时忽略warning。
# 下面的这段配置是指如果出现标签为severity=critical的告警,则抑制severity=warning的告警
inhibit_rules:
- source_match:
    severity: 'critical'
  target_match:
    severity: 'warning'
  # 如果警报名称相同,则应用抑制。
  # alertname、cluster和service对应的标签值需要相等
  equal: ['alertname', 'cluster', 'service']
# 收件人配置
receivers:
- name: 'team-ops-mails'
  email_configs:
  - to: 'dukuan@xxx.com'
- name: 'wechat'
  wechat_configs:
  - send_resolved: true
    corp_id: 'ww'
    api_secret: 'JJ'
    to_tag: '1'
    agent_id: '1000002'
    api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
    message: '{{ template "wechat.default.message" . }}'
- name: 'team-X-pager'
  email_configs:
  - to: 'team-X+alerts-critical@example.org'
  pagerduty_configs:
  - service_key: <team-X-key>
- name: 'team-Y-mails'
  email_configs:
  - to: 'team-Y+alerts@example.org'
- name: 'team-Y-pager'
  pagerduty_configs:
  - service_key: <team-Y-key>
- name: 'team-DB-pager'
  pagerduty_configs:
  - service_key: <team-DB-key>  
- name: 'team-X-hipchat'
  hipchat_configs:
  - auth_token: <auth_token>
    room_id: 85
    message_format: html
    notify: true 
global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.163.com:465'
  smtp_from: 'kangwei_k@163.com'
  smtp_auth_username: 'kangwei_k@163.com'
  smtp_auth_password: 'VSFGFMZVREDBZHNQ'
  smtp_require_tls: false
templates:
- '/data/alertmanager/template/default.tmpl'
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 20m
  repeat_interval: 10m
  receiver: 'email'
  # 一个匹配规则
  routes:
  - receiver: 'email'
    match:
      severity: Disaster
  # 多个匹配规则
  routes:
  - match_re:
      resource: ^(memory|cpu|disk)$
    receiver: system-pager
    continue: false
    routes:
    - match:
        severity: critical
      receiver:  critical-pager
    - match:
        resource: net
      receiver: net-pager
    - match:
        resource: host
      receiver: system-pager
      continue: true
      routes:
      - match:
          severity: crirical
        receiver: critical-pager
receivers:
      - name: 'email'
        email_configs:
          - to: 'kangwei_k@163.com'
            html: '{{ template "default.html" .}}'
            headers: { Subject: "{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]" }
            send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

其中告警的匹配有两种方式可以选择,一种方式基于字符串验证,通过设置 match 规则判断当前告警中是否存在

标签 labelname 并且其值等于 labelvalue。第二种方式则基于正则表达式,通过设置 match_re 验证当前告警标

签的值是否满足正则表达式的内容。

Alertmanager 可以对告警通知进行分组,将多条告警合并为一个通知。这里我们可以使用 group_by 来定义分

组规则。基于告警中包含的标签,如果满足 group_by 中定义标签名称,那么这些告警将会合并为一个通知发送

给接收器。

group_by 用于合并通知,match/match_re 用于匹配标签。

1.6 添加Altermanager到Prometheus管理

把 alertmanager 添加到 prometheus 的配置里:

alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 192.168.54.195:9093
rule_files:
  - "rule/*.yml"

告警规则读取 prometheus 目录的 rule 下的所有以 yml 结尾的文件。

创建 rule 目录并规定告警项,并定义报警邮件格式,这里制定了一个实例状态和磁盘的告警。

1.7 新建告警规则文件

rule.yml 文件的配置可以参考下面的进行配置:

 rules.yml: |
    groups:
    - name: kubernetes # 组的名字,在这个文件中必须要唯一
      rules:
      - alert: KubernetesNodeReady # 告警的名字,在组中需要唯一
        expr: kube_node_status_condition{condition="Ready",status="true"} == 1 # 表达式,执行结果为true表示需要告警
        for: 30s # 超过多少时间才认为需要告警
        labels:
          severity: critical # 设置告警等
        annotations:
          summary: Kubernetes Node ready (instance {{ $labels.instance }})
          description: "Node {{ $labels.node }} has been unready for a long time\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"
    - name: example
      rules:
      - alert: InstanceDown
        expr: up == 0
        for: 30s
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }} stop"
          description: "{{ $labels.instance }}:job{{ $labels.job }} stop"

在告警规则文件中,我们可以将一组相关的规则设置定义在一个group下。在每一个 group 中我们可以定义多个

告警规则(rule)。一条告警规则主要由以下几部分组成:

  • alert:告警规则的名称。

  • expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。

  • for:评估等待时间,可选参数。用于在第一次遇到新的触发报警等待一段时间, 只有当触发条件持续一段时

    间后才发送告警。在等待期间新产生告警的状态为pending。

  • labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。

  • annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产

    生时会一同作为参数发送到Alertmanager。

groups.name 没什么用处,只是逻辑上的分组,在 Prometheus 页面上显示分组而已。和后面的 Alertmanager

中的 group 没有任何关系。AlertManager 使用的是 prometheus rule 中的 label 再添加上默认的两个标签

alertname和 instance,例如:

# 我们定义的标签规则
groups:
- name: hostStatsAlert
  rules:
  - alert: hostCpuUsageAlert
    expr: sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!='idle'}[5m]))) by (instance) > 0.07
    for: 1m
    labels:
      severity: page
    annotations:
      summary: "Instance {{ $labels.instance }} CPU usgae high"
      description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
  - alert: hostMemUsageAlert
    expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes)/node_memory_MemTotal_bytes > 0.85
    for: 1m
    labels:
      severity: page
    annotations:
      summary: "Instance {{ $labels.instance }} MEM usgae high"
      description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
# 实际发送的数据
[
    {
        "annotations":{
            "description":"192.168.1.12:9567 CPU usage above 85% (current value: 0.1308904885691767)",
            "summary":"Instance 192.168.1.12:9567 CPU usgae high"
        },
        "endsAt":"2022-12-09T03:54:48.961Z",
        "startsAt":"2022-12-09T03:50:48.961Z",
        "generatorURL":"xxx",
        "labels":{
            "alertname":"hostCpuUsageAlert",
            "instance":"192.168.1.12:9567",
            "severity":"page"
        }
    }
]
# 实际webhook收到的报警消息
{
	"status": "resolved",
	"labels": {
		"alertname": "hostCpuUsageAlert",
		"instance": "192.168.1.12:9567",
		"severity": "page"
	},
	"annotations": {
		"description": "192.168.1.12:9567 CPU usage above 85% (current value: 0.09133333333296416)",
		"summary": "Instance 192.168.1.12:9567 CPU usgae high"
	},
	"startsAt": "2021-12-08T16:21:33.961Z",
	"endsAt": "2021-12-08T16:23:18.961Z",
	"generatorURL": "xxx",
	"fingerprint": "f05d26ab06192e0e"
}

Prometheus 发送给 Alertmanager 的 api 接口可以参考:

https://github.com/prometheus/alertmanager/blob/main/api/v2/openapi.yaml

一般来说,在告警规则文件的 annotations 中使用 summary 描述告警的概要信息,description 用于描述告警的

详细信息。同时 Alertmanager 的 UI 也会根据这两个标签值,显示告警信息。为了让告警信息具有更好的可读

性,Prometheus 支持模板化 label 和 annotations 的中标签的值。

通过 $labels.<labelname> 变量可以访问当前告警实例中指定标签的值,$value 则可以获取当前PromQL表达

式计算的样本值。

# To insert a firing element's label values:
{{ $labels.<labelname> }}
# To insert the numeric expression value of the firing element:
{{ $value }}

本文告警规则的配置:

groups:
- name: node_rule
  rules:
  - alert: node memory usages
    expr: node_memory_usages > 20 # 这里为了调试所以值设置的小了点
    for: 10s
    labels:
      severity: high
    annotations:
      summary: "{{ $labels.exported_instance }}: 空间使用率异常"
      description: "{{ $labels.exported_instance }}: 空间使用率异常,请及时处理。"

1.8 配置告警邮件发送

编辑 alertmanager.yml 文件,定义发送邮箱,这里举例为 163 邮箱。

global:
  resolve_timeout: 5m
  smtp_from: '15110820283@163.com'
  smtp_smarthost: 'smtp.163.com:25'
  smtp_auth_username: '15110820283@163.com'
  smtp_auth_password: 'GKVAKHJHFFVSCLHG'
  smtp_require_tls: false
route:
  group_by: ['alertname']
  group_wait: 15s
  group_interval: 30s
  repeat_interval: 2m
  receiver: 'email'
receivers:
  - name: 'email'
    email_configs:
      - to: '2420309401@qq.com'
        send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

重启 PrometheusAlertmanager进行测试。

我们通过向 Pushgetway 发送数据:

# 利用shell脚本完成数据推送
$ vim push.sh
# 内容
node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.54.195"
cat <<EOF | curl --data-binary @- http://192.168.54.195:9091/metrics/job/$job_name/instance/$instance_name
# TYPE node_memory_usages gauge
node_memory_usages $node_memory_usages
EOF
# 执行
./push.sh

测试结果如下:

在这里插入图片描述

收到的邮件:

在这里插入图片描述

Alertmanager UI 此时也可以看到 Alertmanager 接收到的告警信息。

Prometheus 首次检测到满足触发条件后,node memory usages alert显示由一条告警处于活动状态。由于告警

规则中设置了 10s 的等待时间,当前告警状态为 PENDING,如果 10s 后告警条件持续满足,则会实际触发告警

并且告警状态为 FIRING

对于已经 pending 或者 firing 的告警,Prometheus也会将它们存储到时间序列ALERTS{}中。

可以通过表达式,查询告警实例:

ALERTS{alertname="<alert name>", alertstate="pending|firing", <additional alert labels>}

1.9 使用邮件模板

Alertmanager 使用固定的模板进行邮件发送,我们也可以自己自定义模板发送邮件。

编辑alertmanager.yml文件,修改相关配置信息:

global:
  resolve_timeout: 5m
  smtp_from: '15110820283@163.com'
  smtp_smarthost: 'smtp.163.com:25'
  smtp_auth_username: '15110820283@163.com'
  smtp_auth_password: 'GKVAKHJHFFVSCLHG'
  smtp_require_tls: false
route:
  group_by: ['alertname']
  group_wait: 15s
  group_interval: 30s
  repeat_interval: 2m
  receiver: 'email'
receivers:
  - name: 'email'
    email_configs:
      - to: '2420309401@qq.com'
        html: '{{ template "email.tmpl" .}}'
        headers: { Subject: "{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]" }
        send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
templates:
  - '/home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/email.tmpl'

邮件模板:

{{ define "email.tmpl" }}
{{- if gt (len .Alerts.Firing) 0 -}}
[{{ .Status | toUpper }}:{{ .Alerts.Firing | len }}]
{{ range $i, $alert := .Alerts }}
<pre>
告警程序: prometheus_alert <br>
告警级别: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警详情: {{ .Annotations.description }} <br>
 
开始时间:{{ $alert.StartsAt.Local }}
</pre>
{{ end }}
{{ end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
[{{ .Status | toUpper }}:{{ .Alerts.Resolved | len }}]
{{ range $i, $alert := .Alerts }}
<pre>
告警程序: prometheus_alert <br>
故障主机: {{ .Labels.instance }}<br>
故障主题: {{ .Annotations.summary }}<br>
告警详情: {{ .Annotations.description }}<br>
告警时间: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }}<br>
恢复时间: {{ .EndsAt.Local.Format "2006-01-02 15:04:05" }}<br>
</pre>
{{ end }}
{{ end }}
{{- end }}

进行测试:

在这里插入图片描述

在这里插入图片描述

告警之后进行恢复处理:

在这里插入图片描述

在这里插入图片描述

查看 Prometheus 中自动生成的 Alertmanager 的配置:

global:
  resolve_timeout: 5m
  http_config:
    follow_redirects: true
  smtp_from: 15110820283@163.com
  smtp_hello: localhost
  smtp_smarthost: smtp.163.com:25
  smtp_auth_username: 15110820283@163.com
  smtp_auth_password: <secret>
  smtp_require_tls: false
  pagerduty_url: https://events.pagerduty.com/v2/enqueue
  opsgenie_api_url: https://api.opsgenie.com/
  wechat_api_url: https://qyapi.weixin.qq.com/cgi-bin/
  victorops_api_url: https://alert.victorops.com/integrations/generic/20131114/alert/
  telegram_api_url: https://api.telegram.org
route:
  receiver: email
  group_by:
  - alertname
  continue: false
  group_wait: 15s
  group_interval: 30s
  repeat_interval: 2m
inhibit_rules:
- source_match:
    severity: critical
  target_match:
    severity: warning
  equal:
  - alertname
  - dev
  - instance
receivers:
- name: email
  email_configs:
  - send_resolved: true
    to: 2420309401@qq.com
    from: 15110820283@163.com
    hello: localhost
    smarthost: smtp.163.com:25
    auth_username: 15110820283@163.com
    auth_password: <secret>
    headers:
      From: 15110820283@163.com
      Subject: '{{ .GroupLabels.SortedPairs.Values }} [{{ .Status | toUpper }}:{{
        .Alerts.Firing | len }}]'
      To: 2420309401@qq.com
    html: '{{ template "email.tmpl" .}}'
    require_tls: false
templates:
- /home/zhangshixing/prometheus/alertmanager-0.24.0.linux-amd64/email.tmpl

1.10 报警抑制

抑制是一个概念,如果某些其他警报已经触发,则抑制某些警报的通知。

抑制指的是当某类告警产生的时候,于此相关的别的告警就不用发送告警信息了。

我们对某台机器的 CPU 的使用率进行了监控,比如使用到 80% 和 90% 都进行了监控,那么我们可能想如果CPU

使用率达到了90%就不要发送80%的邮件了。

手动拉高系统的CPU使用率的命令:cat /dev/zero>/dev/null

1.10.1 告警规则

如果 cpu 在5分钟的使用率超过 80% 则产生告警信息。

如果 cpu 在5分钟的使用率超过 90% 则产生告警信息。

groups:
- name: Cpu
  rules:
    - alert: Cpu01
      expr: "(1 - avg(irate(node_cpu_seconds_total{mode='idle'}[5m])) by (instance,job)) * 100 > 80"
      for: 1m
      labels:
        severity: info # 自定义一个标签info级别
      annotations:
        summary: "服务 {{ $labels.instance }} cpu 使用率过高"
        description: "{{ $labels.instance }} of job {{ $labels.job }} 的 cpu 在过去5分钟内使用过高,cpu 使用率 {{humanize $value}}."
    - alert: Cpu02
      expr: "(1 - avg(irate(node_cpu_seconds_total{mode='idle'}[5m])) by (instance,job)) * 100 > 90"
      for: 1m
      labels:
        severity: warning # 自定义一个标签warning级别
      annotations:
        summary: "服务 {{ $labels.instance }} cpu 使用率过高"
        description: "{{ $labels.instance }} of job {{ $labels.job }} 的 cpu 在过去5分钟内使用过高,cpu 使用率 {{humanize $value}}."

1.10.2 alertmanager.yml 配置抑制规则

抑制规则:

如果告警的名称为 alertname = Cpu02 并且告警级别 severity = warning,那么抑制住新的告警信息中标签为

severity = info 的告警数据,并且源告警和目标告警数据的 instance 标签的值必须相等。

# 抑制规则,减少告警数据
inhibit_rules:
- source_match: # 匹配当前告警规则后,抑制住target_match的告警规则
    alertname: Cpu02 # 标签的告警名称是 Cpu02
    severity: warning # 自定义的告警级别是 warning
  target_match: # 被抑制的告警规则
    severity: info # 抑制住的告警级别
  equal:
  - instance # source和target告警数据中,instance的标签对应的值需要相等。

1.10.3 邮件发送结果

可以看到 只发送了 warning 级别的告警,没有发送 info 级别的告警。

在这里插入图片描述

1.11 告警静默

静默是在给定时间内简单地将警报静音的直接方法,静默是基于匹配器配置的,就像路由树一样。检查传入警报是

否与活动静默的所有相等或正则表达式匹配器匹配。如果他们这样做,则不会发送该警报的通知。

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

告警静默指的是处于静默期,不发送告警信息。

比如:我们系统某段时间进行停机维护,由此可能会产生一堆的告警信息,但是这个时候的告警信息是没有意义

的,就可以配置静默规则过滤掉。

配置静默规则需要在 alertmanager 的控制台,或通过 amtool 来操作。

进入Alertmanager UI,点击 New Silence 显示如下内容:

在这里插入图片描述

添加信息:

在这里插入图片描述

用户可以通过该 UI 定义新的静默规则的开始时间以及持续时间,通过 Matchers 部分可以设置多条匹配规则(字符

串匹配或者正则匹配)。填写当前静默规则的创建者以及创建原因后,点击 Create 按钮即可。

在这里插入图片描述

通过 Preview Alerts 可以查看预览当前匹配规则匹配到的告警信息。静默规则创建成功后,Alertmanager会开始

加载该规则并且设置状态为 Pending,当规则生效后则进行到Active状态。

在这里插入图片描述

当静默规则生效以后,从 Alertmanager 的 Alerts 页面下用户将不会看到该规则匹配到的告警信息。

在这里插入图片描述

对于已经生效的规则,用户可以通过手动点击 Expire 按钮使当前规则过期。

在这里插入图片描述

经过上述的配置,就收不到告警信息了。

我们通过发送 http 请求进行告警静默:

# 创建静默规则
$ curl "http://192.168.21.175:9093/api/v2/silences" -X POST -H "Content-Type: application/json" --data-raw "{\"matchers\":[{\"name\":\"severity\",\"value\":\"error\",\"isRegex\":false,\"isEqual\":true}],\"startsAt\":\"2023-07-01T04:50:00.000Z\",\"endsAt\":\"2023-07-02T08:50:00.000Z\",\"createdBy\":\"Admin\",\"comment\":\"\u9759\u9ed8\u544a\u8b66\",\"id\":null}"
# 返回
{"silenceID":"c504294c-cf71-4ad6-92a6-80ca2e636b41"}
# 查看静默规则
$ curl -X GET "http://192.168.21.175:9093/api/v2/silence/c504294c-cf71-4ad6-92a6-80ca2e636b41"
# 返回
{
	"id": "c504294c-cf71-4ad6-92a6-80ca2e636b41",
	"status": {
		"state": "active"
	},
	"updatedAt": "2023-07-01T05:45:57.669Z",
	"comment": "静默告警",
	"createdBy": "Admin",
	"endsAt": "2023-07-02T08:50:00.000Z",
	"matchers": [{
		"isEqual": true,
		"isRegex": false,
		"name": "severity",
		"value": "error"
	}],
	"startsAt": "2023-07-01T05:45:57.669Z"
}
# 查询静默告警
$ curl -X GET "http://192.168.21.175:9093/api/v2/alerts?filter=severity="error"&silenced=true&inhibited=true&active=true"
# 返回
[]

在这里插入图片描述

过期:

# 设置静默规则过期
$ curl -X DELETE "http://192.168.21.175:9093/api/v2/silence/c504294c-cf71-4ad6-92a6-80ca2e636b41"
# 查看静默规则
$ curl -X GET "http://192.168.21.175:9093/api/v2/silences?silenced=false&inhibited=false&active=true"
# 返回
[{
	"id": "c504294c-cf71-4ad6-92a6-80ca2e636b41",
	"status": {
		"state": "expired"
	},
	"updatedAt": "2023-07-01T05:48:52.002Z",
	"comment": " 静默告警",
	"createdBy": "Admin",
	"endsAt": "2023-07-01T05:48:52.002Z",
	"matchers": [{
		"isEqual": true,
		"isRegex": false,
		"name": "severity",
		"value": "error"
	}],
	"startsAt": "2023-07-01T05:45:57.669Z"
}]

在这里插入图片描述

1.12 告警路由

这里我们再次对 altermanager.yml 文件进行说明。

1.12.1 altermanager.yml配置文件的编写

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: '145xxx8387@qq.com'
  smtp_auth_username: '1451578387@qq.com'
  smtp_auth_identity: 'xxxxx'
  smtp_auth_password: 'xxxxx'
  smtp_require_tls: false
# 根路由,不能存在match和match_re,任何告警数据没有匹配到路由时,将会由此根路由进行处理。
route:
  group_by: ['job']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 120s
  receiver: 'default-receiver'
  routes:
  - match_re:
      alertname: 'Cpu.*'  # 如果告警的名字是以 Cpu 开头的发给 receiver-01
    receiver: 'receiver-01'
  - match:
      alertname: 'InstanceDown' # 如果告警的名字是 InstanceDown 则发送给 receiver-02
    receiver: 'receiver-02'
    group_by: ['instance'] # 根据 instance 标签分组
    continue: true  # 为true则还需要去匹配子路由。
    routes:
    - match:
        alertname: 'InstanceDown' # 如果告警的名字是 InstanceDown 则还是需要发送给 receiver-03
      receiver: 'receiver-03'
# 定义4个接收人(接收组等等)
receivers:
  - name: 'default-receiver'
    email_configs:
      - to: '145xxx8387@qq.com'
        send_resolved: true
  - name: 'receiver-01'
    email_configs:
      - to: '2469xxx193@qq.com'
        send_resolved: true
  - name: 'receiver-02'
    email_configs:
      - to: 'weixin145xxx8387@163.com'
        send_resolved: true
  - name: 'receiver-03'
    email_configs:
      - to: 'it_xxx_software@163.com'
        send_resolved: true
inhibit_rules:
  - source_match:
      alertname: Cpu02
      severity: warning
    target_match:
      severity: info
    equal:
      - instance

告警结果:

1、告警名称中存在 Cpu 的发送给 receiver-01(2469xxx193@qq.com)

2、告警名称是 InstanceDown 的需要发送给 receiver-02(weixin145xxx8387@163.com)

receiver-03(it_xxx_software@163.com)

3、需要注意一下路由中的 continue参数,为 true,则需要在继续匹配子路由,为false,不在匹配它下方的

子路由了。

当告警信息没有匹配到任务路由时,则由根路由 route 进行处理。

访问 https://www.prometheus.io/webtools/alerting/routing-tree-editor/ 可以查看告警树。

在该网页我们填写上面的配置文件的内容和配置的标签集,然后点击生路由树:
在这里插入图片描述

生成的内容如下:

在这里插入图片描述

1.12.2 路由匹配

告警数据从最顶级的route进入路由树,根路由需要匹配所有的告警数据,不可以设置 match 和 match_re。每个

路由下,有自己的子路由。比如:某个告警,如果级别普通,则通知给用户A,如果过段时间还未恢复,变严重

了,则需要通知给张三和李四,那么可以通过子路由实现。

默认情况下,告警从根路由进入之后,会遍历它下方的所有的子路由,如果 route 中的 continue = false,那么在

匹配到第一个符合的路由之后就停止匹配了。 如果 continue = true 那么会继续进行匹配。如果所有的都没有匹配

到,那么走根路由。

1.13 自定义邮件模板

1.13.1 定义告警模板

cat email.template.tmpl
{{ define "email.template.tmpl" }}
{{- if gt (len .Alerts.Firing) 0 -}}{{ range.Alerts }}
告警名称: {{ .Labels.alertname }} <br>
实例名: {{ .Labels.instance }}  <br>
摘要:  {{ .Annotations.summary }} <br>
详情:  {{ .Annotations.description }} <br>
级别:  {{ .Labels.severity }}  <br>
开始时间:  {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}{{ range.Alerts }}
Resolved-告警恢复了。<br>
告警名称: {{ .Labels.alertname }} <br>
实例名: {{ .Labels.instance }}  <br>
摘要:  {{ .Annotations.summary }} <br>
详情:  {{ .Annotations.description }} <br>
级别:  {{ .Labels.severity }}  <br>
开始时间:  {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
恢复时间:  {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++<br>
{{ end }}{{ end -}}
{{- end }}

1.13.2 修改alertmanager.yml配置文件

1、加载告警模板的位置
global:
  resolve_timeout: 5m
templates:
- '....../prometheus/alertmanager-0.21.0/templates/*.tmpl'

配置 templates选项

2、接收人使用邮件模板
receivers:
  - name: 'default-receiver'
    email_configs:
      - to: 'it_xxx_software@163.com'
        send_resolved: true
        html: '{{template "email.template.tmpl" . }}'

注意:

html: '{{template "email.template.tmpl" . }}' 中的 template 中的值为

{{ define "email.template.tmpl" }} 中的值。

1.13.3 其它邮件模板

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="viewport" content="width=device-width" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>{{ template "__subject" . }}</title>
<style>
/* -------------------------------------
    GLOBAL
    A very basic CSS reset
------------------------------------- */
* {
  margin: 0;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  box-sizing: border-box;
  font-size: 14px;
}
img {
  max-width: 100%;
}
body {
  -webkit-font-smoothing: antialiased;
  -webkit-text-size-adjust: none;
  width: 100% !important;
  height: 100%;
  line-height: 1.6em;
  /* 1.6em * 14px = 22.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
  /*line-height: 22px;*/
}
/* Let's make sure all tables have defaults */
table td {
  vertical-align: top;
}
/* -------------------------------------
    BODY & CONTAINER
------------------------------------- */
body {
  background-color: #f6f6f6;
}
.body-wrap {
  background-color: #f6f6f6;
  width: 100%;
}
.container {
  display: block !important;
  max-width: 600px !important;
  margin: 0 auto !important;
  /* makes it centered */
  clear: both !important;
}
.content {
  max-width: 600px;
  margin: 0 auto;
  display: block;
  padding: 20px;
}
/* -------------------------------------
    HEADER, FOOTER, MAIN
------------------------------------- */
.main {
  background-color: #fff;
  border: 1px solid #e9e9e9;
  border-radius: 3px;
}
.content-wrap {
  padding: 30px;
}
.content-block {
  padding: 0 0 20px;
}
.header {
  width: 100%;
  margin-bottom: 20px;
}
.footer {
  width: 100%;
  clear: both;
  color: #999;
  padding: 20px;
}
.footer p, .footer a, .footer td {
  color: #999;
  font-size: 12px;
}
/* -------------------------------------
    TYPOGRAPHY
------------------------------------- */
h1, h2, h3 {
  font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
  color: #000;
  margin: 40px 0 0;
  line-height: 1.2em;
  font-weight: 400;
}
h1 {
  font-size: 32px;
  font-weight: 500;
  /* 1.2em * 32px = 38.4px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
  /*line-height: 38px;*/
}
h2 {
  font-size: 24px;
  /* 1.2em * 24px = 28.8px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
  /*line-height: 29px;*/
}
h3 {
  font-size: 18px;
  /* 1.2em * 18px = 21.6px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
  /*line-height: 22px;*/
}
h4 {
  font-size: 14px;
  font-weight: 600;
}
p, ul, ol {
  margin-bottom: 10px;
  font-weight: normal;
}
p li, ul li, ol li {
  margin-left: 5px;
  list-style-position: inside;
}
/* -------------------------------------
    LINKS & BUTTONS
------------------------------------- */
a {
  color: #348eda;
  text-decoration: underline;
}
.btn-primary {
  text-decoration: none;
  color: #FFF;
  background-color: #348eda;
  border: solid #348eda;
  border-width: 10px 20px;
  line-height: 2em;
  /* 2em * 14px = 28px, use px to get airier line-height also in Thunderbird, and Yahoo!, Outlook.com, AOL webmail clients */
  /*line-height: 28px;*/
  font-weight: bold;
  text-align: center;
  cursor: pointer;
  display: inline-block;
  border-radius: 5px;
  text-transform: capitalize;
}
/* -------------------------------------
    OTHER STYLES THAT MIGHT BE USEFUL
------------------------------------- */
.last {
  margin-bottom: 0;
}
.first {
  margin-top: 0;
}
.aligncenter {
  text-align: center;
}
.alignright {
  text-align: right;
}
.alignleft {
  text-align: left;
}
.clear {
  clear: both;
}
/* -------------------------------------
    ALERTS
    Change the class depending on warning email, good email or bad email
------------------------------------- */
.alert {
  font-size: 16px;
  color: #fff;
  font-weight: 500;
  padding: 20px;
  text-align: center;
  border-radius: 3px 3px 0 0;
}
.alert a {
  color: #fff;
  text-decoration: none;
  font-weight: 500;
  font-size: 16px;
}
.alert.alert-warning {
  background-color: #E6522C;
}
.alert.alert-bad {
  background-color: #D0021B;
}
.alert.alert-good {
  background-color: #68B90F;
}
/* -------------------------------------
    INVOICE
    Styles for the billing table
------------------------------------- */
.invoice {
  margin: 40px auto;
  text-align: left;
  width: 80%;
}
.invoice td {
  padding: 5px 0;
}
.invoice .invoice-items {
  width: 100%;
}
.invoice .invoice-items td {
  border-top: #eee 1px solid;
}
.invoice .invoice-items .total td {
  border-top: 2px solid #333;
  border-bottom: 2px solid #333;
  font-weight: 700;
}
/* -------------------------------------
    RESPONSIVE AND MOBILE FRIENDLY STYLES
------------------------------------- */
@media only screen and (max-width: 640px) {
  body {
    padding: 0 !important;
  }
  h1, h2, h3, h4 {
    font-weight: 800 !important;
    margin: 20px 0 5px !important;
  }
  h1 {
    font-size: 22px !important;
  }
  h2 {
    font-size: 18px !important;
  }
  h3 {
    font-size: 16px !important;
  }
  .container {
    padding: 0 !important;
    width: 100% !important;
  }
  .content {
    padding: 0 !important;
  }
  .content-wrap {
    padding: 10px !important;
  }
  .invoice {
    width: 100% !important;
  }
}
</style>
</head>
 
<body itemscope itemtype="http://schema.org/EmailMessage">
 
<table class="body-wrap">
  <tr>
    <td></td>
    <td class="container" width="600">
      <div class="content">
        <table class="main" width="100%" cellpadding="0" cellspacing="0">
          <tr>
            {{ if gt (len .Alerts.Firing) 0 }}
            <td class="alert alert-warning">
            {{ else }}
            <td class="alert alert-good">
            {{ end }}
              {{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}
                {{ .Name }}={{ .Value }} 
              {{ end }}
            </td>
          </tr>
          <tr>
            <td class="content-wrap">
              <table width="100%" cellpadding="0" cellspacing="0">
                <tr>
                  <td class="content-block">
                    <a href='{{ template "__alertmanagerURL" . }}' class="btn-primary">View in {{ template "__alertmanager" . }}</a>
                  </td>
                </tr>
                {{ if gt (len .Alerts.Firing) 0 }}
                <tr>
                  <td class="content-block">
                    <strong>[{{ .Alerts.Firing | len }}] Firing</strong>
                  </td>
                </tr>
                {{ end }}
                {{ range .Alerts.Firing }}
                <tr>
                  <td class="content-block">
                    <strong>Labels</strong><br />
                    {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
                    {{ if gt (len .Annotations) 0 }}<strong>Annotations</strong><br />{{ end }}
                    {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
                    <a href="{{ .GeneratorURL }}">Source</a><br />
                  </td>
                </tr>
                {{ end }}
 
                {{ if gt (len .Alerts.Resolved) 0 }}
                  {{ if gt (len .Alerts.Firing) 0 }}
                <tr>
                  <td class="content-block">
                    <br />
                    <hr />
                    <br />
                  </td>
                </tr>
                  {{ end }}
                <tr>
                  <td class="content-block">
                    <strong>[{{ .Alerts.Resolved | len }}] Resolved</strong>
                  </td>
                </tr>
                {{ end }}
                {{ range .Alerts.Resolved }}
                <tr>
                  <td class="content-block">
                    <strong>Labels</strong><br />
                    {{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
                    {{ if gt (len .Annotations) 0 }}<strong>Annotations</strong><br />{{ end }}
                    {{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }}<br />{{ end }}
                    <a href="{{ .GeneratorURL }}">Source</a><br />
                  </td>
                </tr>
                {{ end }}
              </table>
            </td>
          </tr>
        </table>
 
        <div class="footer">
          <table width="100%">
            <tr>
              <td class="aligncenter content-block"><a href='{{ .ExternalURL }}'>Sent by {{ template "__alertmanager" . }}</a></td>
            </tr>
          </table>
        </div></div>
    </td>
    <td></td>
  </tr>
</table>
 
</body>
</html>
{{ 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.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }}{{- 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.message }}
故障时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }}
恢复时间: {{ $alert.EndsAt.Format "2006-01-02 15:04:05" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }};{{- end }}
=====================
{{- end }}
{{- end }}
{{- end }}

1.14 常用配置说明

1.14.1 alertmanager.yml

# qq邮箱
smtp.qq.com:465    
# 163邮箱
smtp.163.com:25
route:
  # 报警时间相关配置
  # 收到报警后会根据分组等待group_wait时间,这时间内的同组的报警将一起发出
  group_wait: 20s
  # 同一个分组下之前已经发送成功过,进入新的alert时等待group_interval
  group_interval: 5m
  # alert group报警发送成功且没有变化则等待repeat_interval后发送报警,默认1h
  repeat_interval: 120s

1.14.2 prometheus.yml

global:
  scrape_interval:     15s         # 数据采集间隔,也就是设置多少时间间隔采集一次数据
  evaluation_interval: 15s         # 评估告警周期
  scrape_timeout: 30s              # 数据采集超时时间默认10s
  
rule_files: # 报警规则配置
  # - "first_rules.yml"
  # - "second_rules.yml"
  - "rule/*.yml"
  
scrape_configs:
  # 采集任务名称
  - job_name: 'mall-tiny-grafana'
    # 采集时间间隔
    scrape_interval: 5s
    # 采集超时时间
    scrape_timeout: 10s
    # 采集数据路径
    metrics_path: '/actuator/prometheus'
    # 采集服务的地址
    # 如果Exporter应用运行在Docker容器中,需要使用
    # docker inspect mall-tiny-grafana | grep IPAddress来获取容器IP地址
    static_configs:
      - targets: ['172.17.0.5:8088']

1.14.3 rules.yml

rule.yaml 用来配置报警规则,常用的报警规则可以参考下面。

报警规则大全:https://awesome-prometheus-alerts.grep.to/rules.html

groups:
- name: host down
  rules:
  - alert: node-down
    expr: up{} != 1
    for: 15s                # 报警持续时间

Alert 的三种状态:

  • pending(报警持续时间):警报被激活,但是低于配置的持续时间。这里的持续时间即 rule 里的 for 字段设置

    的时间,该状态下不发送报警。

  • firing(推送报警):警报已被激活,而且超出设置的持续时间,该状态下发送报警。

  • inactive(评估告警周期):既不是 pending 也不是 firing 的时候状态变为 inactive。

prometheus 触发一条告警的过程:prometheus—>触发阈值—>超出持续时间—>alertmanager—>分组|抑制|

静默—>媒体类型—>邮件|钉钉|微信等。

1.15 Docker安装Altermanager

搜索镜像:

$ docker search prom/alertmanager

在这里插入图片描述

下载镜像:

$ docker pull prom/alertmanager

在这里插入图片描述

启动:

$ /opt/alertmanager/alertmanager.yml
# 内容
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']
$ docker run -d --name alertmanager -p 9093:9093 -v /opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager

在这里插入图片描述

浏览器访问 http://192.168.54.195:9093/

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日算法】【219. 存在重复元素 II】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

LabVIEW-Solidworks联合仿真

介绍 NI Softmotion介绍 LabVIEW NI SoftMotion 采用高级功能块API (应用程序接口) 便于编写运动程序&#xff0c;该功能块API基于由PLCopen 定义的 Motion Control Library 。SoftMotion 包括用于直线、弧线和轮廓运动的功能块及用于进行电子传动、电子凸轮等高级运行的功能块…

Oracle 的删除

前言 最近在工作中需要将一台电脑上的 Oracle &#xff0c;删除 Oracle 与删除 MySQL 不太一样&#xff0c;删除 Oracle 还需要删除注册表中的内容&#xff0c;不然重新安装的时候会报错。 关闭服务 win r 开启运行窗口&#xff0c;输入 services.msc 打开服务列表。 将 O…

【Redis故障排查】「连接失败问题排查和解决」带你深入分析一下Redis阻塞原因以及问题排查方案指南

Redis阻塞原因以及问题排查 尽管我们在日常工作中经常使用Redis作为数据库的缓存&#xff0c;以大大减轻数据库压力并提升用户体验&#xff0c;但Redis也可能出现阻塞情况&#xff0c;导致整个系统变慢&#xff0c;进而影响用户体验。 因此&#xff0c;在面对Redis阻塞的情况…

傅里叶变换通俗理解,附python代码

傅里叶变换可以简单理解为用一系列三角函数去拟合一个目标函数。为什么可以用三角函数拟合&#xff1f;因为三角函数 是一组正交基。 先来回顾一下正交的概念&#xff0c;在二维平面坐标系中&#xff0c;与这两个单位向量&#xff0c;正交&#xff08;内积为0&#xff0c;相互…

单机模型并行最佳实践

单机模型并行最佳实践 模型并行在分布式训练技术中被广泛使用。 先前的帖子已经解释了如何使用DataParallel在多个 GPU 上训练神经网络&#xff1b; 此功能将相同的模型复制到所有 GPU&#xff0c;其中每个 GPU 消耗输入数据的不同分区。 尽管它可以极大地加快训练过程&#x…

MySQL的基本操作及实用示例(面试真题老实用了)

一、MySQL基本操作 常用语句 MySQL是一个常用的关系型数据库管理系统&#xff0c;可以用于存储和管理数据。下面是MySQL的一些基本操作&#xff1a; 1. 连接到MySQL服务器&#xff1a; mysql -u username -p 其中&#xff0c;username是你的用户名&#xff0c;执行该命令后会…

【软件分析/静态分析】chapter5 课程07 过程间分析(Interprocedural Analysis)

&#x1f517; 课程链接&#xff1a;李樾老师和谭天老师的&#xff1a; 南京大学《软件分析》课程07&#xff08;Interprocedural Analysis&#xff09;_哔哩哔哩_bilibili 目录 第五章 过程间分析 5.1 为什么需要过程间分析 5.2 Call Graph 5.2.1 调用图的概念 5.2.2 调…

2023 年 GitHub 上最火的 Java 面试宝典正式上线

笔记特点&#xff1a;条理清晰&#xff0c;含图像化表示更加易懂。 内容概要&#xff1a;包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring 全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Ne…

Vue实现拖拽鼠标圈选、划区域、框选组件sgRectSelect:矩形区域选中checkbox,并回调相关选中、取消选中的操作

边框线虚线动画效果请参阅边框虚线滚动动画特效_虚线滚动效果_你挚爱的强哥的博客-CSDN博客【代码】边框虚线滚动动画特效。_虚线滚动效果https://blog.csdn.net/qq_37860634/article/details/130507289 碰撞检测原理请前往 原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞…

车载以太网 - SomeIP - 协议用例 - RPC

目录 RPC Protocol specification 1、Cleint和Server端应该为一个服务实例的所有的Methodsevents使用一个TCP连接

AtCoder Regular Contest 163 C. Harmonic Mean(构造 补写法)

题目 t(t<500)组case&#xff0c; 给定一个数n(n<500)&#xff0c;构造一个长为n的数组 思路来源 官方题解 题解 注意到 ... 右边累加&#xff0c;等于1-最后一项&#xff0c;可以把最后一项挪到左边 所以&#xff0c; 1. 当n没有在前面的序列里出现过时&#xf…

centos7.6安装mysql

卸载mariadb 解决安装mysql与mariadb冲突问题&#xff08;卸载干净mariadb&#xff09;_何妨徐行的博客-CSDN博客 安装rpm包前可能需要的命令&#xff1a; yum install openssl-devel用于管理rpm包的工具 yum install lrzsz -y 文件传输缺乏rz 下载安装包 去mysql官网 把…

<Linux开发>驱动开发 -之- Linux I2C 驱动

&#xff1c;Linux开发&#xff1e;驱动开发 -之- Linux I2C 驱动 交叉编译环境搭建&#xff1a; &#xff1c;Linux开发&#xff1e; linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下&#xff1a; &#xff1c;Linux开发&#xff1e; -之-系统移植 uboot移植过程详细…

[MMDetection]VOC数据格式转为COCO数据格式

以下脚本可以根据创建VOC格式数据集转换为COCO数据集 其中文件组织格式如下 VOC2007 ------Annotations ------***********.xml ------***********.xml -------ImageSets ------train.txt ------test.txt -------JPEGImages ------***********.jpg ------***********.jpg CO…

【Spring】SpringBoot参数验证10个技巧

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 1.使用验证注解 2 使用自定义验证注解 3 在服务器端验证 4 提供有意义的错误信息 5 将 i18n 用于错误消息 6 使用分组验证 7 对复杂逻辑使用跨域验证 8 对验证错误使…

通过smtp发送邮件及执行异常解决

在日常中遇到了需要实现一个发送邮件的需求&#xff0c;完成之后记录下实现方法及自己遇到的一些问题及解决办法。 常用SMTP服务相关地址及端口 一、通过javax.mail实现发送邮件 1.引入相关坐标 <!-- 发送邮件--><dependency><groupId>org.projec…

矩阵系统源码智能回复私信场景开发

抖音矩阵系统源码智能回复私信场景开发 一、要想开发私信功能开发者需要准备的工作 开发者需要先对接官方api接口以及去申请api提交审核&#xff0c;目前需要了解官方对开发者对该能力开发权限的功能符合开发需求&#xff0c;其次需要了解官方私信触达的规则 1.申请流程&…

基于GPT构建单细胞多组学基础模型

生成式预训练模型在自然语言处理和计算机视觉等各个领域取得了显著的成功。特别是将大规模多样化的数据集与预训练的Transformer相结合&#xff0c;已经成为开发基础模型的一种有前途的方法。文本由单词组成&#xff0c;细胞可以通过基因进行表征。这种类比启发作者探索细胞和基…

Lingo优化软件初步

一、Lingo软件介绍 1、lingo软件的简单介绍 美国芝加哥大学的Linus Schrage教授于1980年左右开发的专门用于求解最优化问题的软件包&#xff0c;后经多年完善与扩充&#xff0c;并成立了LINDO系统公司进行商业运作取得巨大成功。根据 LINDO公司主页&#xff08;http://www.li…