Prometheus:使用 AlertManager 实现 Windows 下邮件告警

Posted by: NOTEPAD 2023年1月29日 Leave a comment

AlertManager和Prometheus Server一样,均采用Golang实现。并且没有第三方依赖。

AlertManager 下载地址如下

https://prometheus.io/download/

解压下载的amd64 zip文件

使用nssm.exe 把alertmanager.exe注册成系统服务

在浏览器打开127.0.0.1:9093 验证服务是否启动

Alert菜单下可以查看Alertmanager接收到的告警内容

Silences菜单下则可以通过UI创建静默规则

Status菜单,可以看到当前系统的运行状态以及配置信息

我们来配置 alertmanager.yml 文件 (主要配置SMTP信息和email接收方信息)

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.notepad.com.cn:25'
  smtp_from: 'test@notepad.com.cn'
  smtp_auth_username: ''
  smtp_auth_password: ''
  smtp_require_tls: false
templates:
  - 'email.tmpl'
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'email'
receivers:
  - name: 'email'
    email_configs:
      - to: 'user@notepad.com.cn'
        html: '{{ template "email.to.html" . }}'
        send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname']

接着我们创建一个 email.tmpl 文件 代码如下:

{{ define "email.to.html" }}
{{ if gt (len .Alerts.Firing) 0 }}{{ range .Alerts }}
@告警: <br>
告警程序: prometheus_alert <br>
告警级别: {{ .Labels.severity }} 级<br>
告警类型: {{ .Labels.alertname }} <br>
故障主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警详情: {{ .Annotations.description }} <br>
触发时间: {{ .StartsAt.Local }} <br>
{{ end }}
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}{{ range .Alerts }}
@恢复: <br>
告警主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
恢复时间: {{ .EndsAt.Local }} <br>
{{ end }}
{{ end }}
{{ end }}

然后去修改普罗米修斯程序的prometheus.yml 文件 Alertmanager configuration 中写上127.0.0.1:9093 rule_files: 写上first_rules.yml

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 127.0.0.1:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
    - "first_rules.yml"
  # - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ["localhost:9090"]
  - job_name: "Windows"
    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.
    static_configs:
      - targets: ["127.0.0.1:9182"]

再次在普罗米修斯目录新建一个配置文件 名为 first_rules.yml 其中expr: up 为你需要报警的job_name: “Windows”

groups:
- name: node-rules
  rules:
  - alert: node-up
    expr: up{job="Windows"} == 0
    for: 15s
    labels:
      severity: 1
      team: node
    annotations:
      summary: "{{$labels.instance}}Instance has been down for more than 15 seconds"

alert:告警规则的名称。

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

for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在 等待期间新产生告警的状态为 pending。

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

annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations 的内容在告警产生时会一同作为参数发送到 Alertmanager。

summary 描述告警的概要信息,description 用于描述告警的详细信息。

同时 Alertmanager 的 UI 也会根据这两个标签值,显示告警信息。

Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing

第一种:Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。

第二种:Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所 以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。

第三种:Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警 报解除,则将状态转到 Inactive,如此循环。