一、概述

经过创立Prometheus监控告警规矩,您能够制定针对特定Prometheus实例的告警规矩。当告警规矩设置的条件满意后,体系会发生对应的告警事情。假如想要收到告诉,需求进一步装备对应的告诉战略以生成告警而且以短信、邮件、电话、钉群机器人、企业微信机器人或许Webhook等方法发送告诉。

从Prometheus server端接纳到alerts后,会依据PromQL的告警规矩 分析数据,假如满意PromQL界说的规矩,则会发生一条告警,并发送告警信息到Alertmanager,Alertmanager则是依据装备处理告警信息并发送。所以Prometheus的告警装备依赖于PromQLAlertManager,关于这两个介绍能够参阅我以下文章:

  • 【云原生】Prometheus AlertManager解说与实战操作
  • 【云原生】Prometheus PromQL解说与实战操作
  • 【云原生】Prometheus Pushgetway解说与实战操作
  • 官方文档:prometheus.io/docs/alerti…

【云原生】Prometheus 自定义告警规则

二、告警完成流程

【云原生】Prometheus 自定义告警规则
设置警报和告诉的首要步骤是:

  1. 在Prometheus中装备告警规矩。
  2. 装备Prometheus 与 AlertManager 相关。
  3. 装备 AlertManager 告警通道。

三、告警规矩

官方文档:prometheus.io/docs/promet…

1)告警规矩装备

在Prometheus 装备(prometheus.yml)中添加报警规矩装备,装备文件中 rule_files 就是用来指定报警规矩文件的,如下装备即指定寄存报警规矩的目录为/etc/prometheus,规矩文件为rules.yml:

rule_files:
- /etc/prometheus/rules.yml

设置报警规矩:

警报规矩答应依据 Prometheus 表达式语言的表达式来界说报警报条件的,并在触发警报时发送告诉给外部的接纳者(Alertmanager),一条警报规矩首要由以下几部分组成:

  • alert——告警规矩的称号。
  • expr——是用于进行报警规矩 PromQL 查询语句。
  • for——评价告警的等待时刻(Pending Duration)。
  • labels——自界说标签,答应用户指定额定的标签列表,把它们附加在告警上。
  • annotations——用于存储一些额定的信息,用于报警信息的展示之类的。

rules.yml示例如下:

groups:
- name: example
  rules:
  - alert: high_memory
    # 当内存占有率超越10%,继续1min,则触发告警
    expr: 100 - ((node_memory_MemAvailable_bytes{instance="192.168.182.110:9100",job="node_exporter"} * 100) / node_memory_MemTotal_bytes{instance="192.168.182.110:9100",job="node_exporter"}) > 90
    for: 1m
    labels:
      severity: page
    annotations:
      summary: spike memeory 

1)监控服务器是否在线

对于被Prometheus监控的服务器,咱们都有一个up目标,能够知道该服务是否在线。

up == 0  #服务下线了。
up == 1 #服务在线。

【示例】

groups:
- name: Test-Group-001 # 组的名字,在这个文件中必需求仅有
  rules:
  - alert: InstanceDown # 告警的名字,在组中需求仅有
    expr: up == 0 # 表达式, 履行成果为true: 表明需求告警
    for: 1m # 超越多少时刻才以为需求告警(即up==0需求继续的时刻)
    labels:
      severity: warning # 界说标签
    annotations:
      summary: "服务 {{ $labels.instance }} 下线了"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."

注意:

  • for 指定到达告警阈值之后,一致要继续多长时刻,才发送告警数据。
  • labels 中能够指定自界说的标签,假如界说的标签已经存在,则会被掩盖。能够运用模板。
  • annotations 中的数据,能够运用模板,$labels表明告警数据的标签{{$value}}表明时刻序列的值

3)告警数据的状况

  • Inactive——表明没有到达告警的阈值,即expr表达式不成立。
  • Pending——表明到达了告警的阈值,即expr表达式成立了,可是未满意告警的继续时刻,即for的值。
  • Firing——已经到达阈值,且满意了告警的继续时刻。

【温馨提示】经测试发现,假如同一个告警数据到达了Firing,那么不会再次发生一个告警数据,除非该告警解决了。

四、实战操作

【云原生】Prometheus 自定义告警规则

1)下载 node_exporter

node-exporter用于收集node的运行目标,包含node的cpu、load、filesystem、meminfo、network等根底监控目标,类似于zabbix监控体系的的zabbix-agent。

下载地址:github.com/prometheus/…

wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.5.0.linux-amd64.tar.gz

2)发动 node_exporter

ln -s /opt/prometheus/exporter/node_exporter/node_exporter-1.5.0.linux-amd64/node_exporter  /usr/local/bin/node_exporter
# 指定端口发动,默认端口:9100
node_exporter --web.listen-address=":9100"

装备node_exporter.service发动

# 默认端口9100
cat >/usr/lib/systemd/system/node_exporter.service<<EOF
[Unit]
Description=node_exporter
After=network.target
 #能够创立相应的用户和组 发动
#User=prometheus
#Group=prometheus
[Service]
ExecStart=/opt/prometheus/exporter/node_exporter/node_exporter-1.5.0.linux-amd64/node_exporter --web.listen-address=:9100
[Install]
WantedBy=multi-user.target
EOF

发动服务

systemctl daemon-reload
systemctl start node_exporter
systemctl status node_exporter
systemctl enable node_exporter

【云原生】Prometheus 自定义告警规则
查看

curl http://localhost:9100/metrics

【云原生】Prometheus 自定义告警规则

3)装备Prometheus加载node_exporter

添加或修改装备 prometheus.yml

【云原生】Prometheus 自定义告警规则

重启加载装备

systemctl restart prometheus
# 1、 kill方法
#kill -HUP pid
# 2、curl方法(推荐)
#curl -X POST http://IP/-/reload
# 【注意】需求在发动的命令行添加参数: --web.enable-lifecycle
curl -X POST http://192.168.182.110:9090/-/reload
# 3、重启(不推荐,重启会导致所有的连接短暂性中止)
systemctl restart prometheus

查看 web:http://ip:9090/targets

【云原生】Prometheus 自定义告警规则

4)告警规矩装备

在Prometheus装备文件rometheus.yml 中装备如下:

【云原生】Prometheus 自定义告警规则
/etc/prometheus/rule.yml装备如下:

groups:
- name: Test-Group-001 # 组的名字,在这个文件中必需求仅有
  rules:
  - alert: InstanceDown # 告警的名字,在组中需求仅有
    expr: up == 0 # 表达式, 履行成果为true: 表明需求告警
    for: 1m # 超越多少时刻才以为需求告警(即up==0需求继续的时刻)
    labels:
      severity: warning # 界说标签
    annotations:
      summary: "服务 {{ $labels.instance }} 下线了"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."

从头加载

curl -X POST http://localhost:9090/-/reload

在web上就能够看到一个告警规矩。

【云原生】Prometheus 自定义告警规则

5)模拟告警

手动关机

sudo shutdown -h now

过了一段时刻告警状况就变成Pending

【云原生】Prometheus 自定义告警规则
再过一段时刻告警就变成了Firing
【云原生】Prometheus 自定义告警规则

6)装备告警通道

这儿以有邮件告警为示例,其它的也差不多。修改装备之前最好先备份一下之前的装备

cp alertmanager.yml alertmanager.bak

【1】装备 alertmanager.yml

global:
  resolve_timeout: 5m
  ## 这儿为qq邮箱 SMTP 服务地址,官方地址为 smtp.qq.com 端口为 465 或 587,一起要设置开启 POP3/SMTP 服务。
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: 'xxxxxxxx@qq.com'
  smtp_auth_username: 'xxxxxxxx@qq.com'
  #授权码,不是暗码,在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示
  smtp_auth_password: 'xxxxxxxx'
  smtp_require_tls: false
#1、模板
templates:
  - '/opt/prometheus/alertmanager/alertmanager-0.24.0.linux-amd64/templates/email.tmpl'
#2、路由
route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  #邮箱
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  ## 接纳警报的email(这儿是引证模板文件中界说的变量)
  - to: '{{ template "email.to"}}'
    ## 发送邮件的内容(调用模板文件中的)
    html: '{{ template "email.to.html" .}}'
    send_resolved: true
# 按捺器装备
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    #确保这个装备下的标签内容相同才会按捺,也就是说警报中必须有这三个标签值才会被按捺。
    equal: ['alertname', 'dev', 'instance']

【2】模板 alert.tmpl

模板文件装备了email.fromemail.toemail.to.html 三种模板变量,能够在 alertmanager.yml 文件中直接装备引证。这儿 email.to.html 就是要发送的邮件内容,支持 Html 和 Text 格式,这儿为了显现美观,选用 Html 格式简略显现信息。下边 {{ range .Alerts }} 是个循环语法,用于循环获取匹配的 Alerts 的信息。

{{ define "email.from" }}xxxxxxxx@qq.com{{ end }}
{{ define "email.to" }}xxxxxxxx@163.com{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========<br>
告警程序: prometheus_alert <br>
告警等级: {{ .Labels.severity }} 级 <br>
告警类型: {{ .Labels.alertname }} <br>
毛病主机: {{ .Labels.instance }} <br>
告警主题: {{ .Annotations.summary }} <br>
告警概况: {{ .Annotations.description }} <br>
触发时刻: {{ .StartsAt.Format "2019-08-04 16:58:15" }} <br>
=========end==========<br>
{{ end }}
{{ end }}

【温馨提示】这儿记得换成自己的邮箱地址!!!

重启alertmanager

systemctl restart alertmanager

在web上就能够看到对应的告警信息了。

【云原生】Prometheus 自定义告警规则
接下来就静待告警了。
【云原生】Prometheus 自定义告警规则
一整套流程到这儿就全部跑通了,告警规矩、告警目标、告警通道依据自己的场景来定,有疑问的欢迎给我留言,后续会继续更新【云原生+大数据】的文章,请耐性等待~

【云原生】Prometheus 自定义告警规则