娃哈哈好喝-真的!
技术够用就行,吃好喝好睡好!

prometheus告警

Prometheus除了监控外还有告警功能,但是需要使用到它的告警模块,其实grafana也可以实现告警功能,但是我们在grafana中使用面板是有变量的,目前grafana对使用变量的面板不支持告警功能,期待它的后续版本的支持。

Prometheus的告警模块也可以在官网下载到,名字叫:alertmanager,自行下载并上传到服务端,可以和Prometheus放在同一台服务器

1、安装alertmanager
[root@server1 soft]# ls
alertmanager-0.21.0.linux-amd64.tar.gz
[root@server1 soft]# tar -zxvf alertmanager-0.21.0.linux-amd64.tar.gz
[root@server1 soft]# ls
alertmanager-0.21.0.linux-amd64 alertmanager-0.21.0.linux-amd64.tar.gz
[root@server1 soft]# mv alertmanager-0.21.0.linux-amd64 /usr/local/alertmanager/

按照上面的操作将alermanager放在/usr/local/下并改名为alermanager,简单的对alertmanager配置:

[root@server1 alertmanager]# cat alertmanager.yml 
global:
 #告警触发后的解除间隔
resolve_timeout: 5m
route:
group_by: ['alertname']
group_wait: 20s
group_interval: 45s
 #重复警告的发送间隔
repeat_interval: 10m
receiver: 'web.hook'
receivers:

- name: 'web.hook'
webhook_configs:
 - send_resolved: false
  url: 'https://www.xxx.com/alert.php'
  inhibit_rules:
 - source_match:
  alertname: hostcpu
  severity: 'critical'
  target_match:
    severity: 'warning'
  equal: ['alertname', 'dev', 'instance']
[root@server1 alertmanager]#

上面是本次演示简单的配置一下,告警通知方式支持很多种,有邮件、钉钉、webhook等等,本次演示使用webhook,这个webhook接口是我自己临时写的,因为需要对接我们自己工作使用的通讯工具,而alert目前还不支持我们的这个通讯工具,当有告警时它会向这个地址发送一个json格式的数据流,只需要将它的json数据解析出来并发送到指定的通讯接口就可以了。

global是全局配置

route是通知路由,从左向右匹配

receivers是接收告警的方式

inhibit_rules是告警抑制,意思是相同的告警避免重复发送

这是告警的通知方式以及间隔时间和告警抑制,至于其他的参数配置可以参考官方文档或者百度一下,篇幅限制这里不再过多介绍了,下面就需要配置告警规则了

启动alertmanager

[root@server1 ~]# /usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
[root@server1 ~]# ps -ef | grep alert
root     12367     1  0 15:07 pts/0    00:00:00 /usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
root     12385 12017  0 15:07 pts/0    00:00:00 grep --color=auto alert
[root@server1 ~]# netstat -tunlap| grep alert
tcp6       0      0 :::9093                 :::*                   LISTEN      12367/alertmanager  
tcp6       0      0 :::9094                 :::*                   LISTEN      12367/alertmanager  
udp6       0      0 :::9094                 :::*                                12367/alertmanager

alert默认监听的是9093端口,到此alert安装完成

2、配置告警规则

我们回到prometheus的目录:/usr/local/prometheus/,修改主配置文件,只需要添加一行代码:

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 1m # 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:
  - /usr/local/prometheus/rules/*.rules

需要添加的是上文中第16行,意为加载rules目录下的所有.rules文件,后续添加告警规则只需要在该目录下添加配置文件就好了

evaluation_interval: 1m 表示检测告警的间隔时间

127.0.0.1:9093表示我们刚才安装的alermanager的监听地址,因为是装在本机,所以这里填写本地地址。

其他的不清楚的可以先保持默认即可,下面来添加一个告警配置文件:

首先需要在/usr/local/prometheus/目录下创建rules目录,然后在rules目录下新建.rules结尾的文件

[root@server1 prometheus]# pwd
/usr/local/prometheus
[root@server1 prometheus]# mkdir rules
[root@server1 prometheus]# ls
console_libraries consoles data LICENSE NOTICE prometheus prometheus.yml promtool rules
[root@server1 prometheus]# cd rules/
[root@server1 rules]# touch test.rules
[root@server1 rules]# ls
test.rules
[root@server1 rules]#
test.rules文件的内容如下:

[root@server1 rules]# cat test.rules
groups:

- name: test1
rules:
   - alert: hostcpu
    expr: ceil((1- ((sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by(instance)) / (sum(increase(node_cpu_seconds_total[1m])) by(instance))))*100) > 80
     for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} CPU usgae high"
      description: "{{ $labels.instance }} CPU 使用率超过 80% (当前使用率为: {{ $value }}%)"
   - alert: hostmem
    expr: ceil((1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))*100) >80
     for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} MEM usgae high"
      description: "{{ $labels.instance }} 内存使用率超过 80% (当前使用率为: {{ $value }}%)"
[root@server1 rules]#

主要的几个参数说明一下:

expr:监控的项目,语法是promql,具体写法可以参考grafana面板的监控项目中的配置,我这里也是参照它的写法,不用花心思去研究它的具体需要怎么写,抄就完了。

这里说一下ceil()这个函数,它的作用是对数字做四舍五入并取整处理

for:当告警触发后持续多久再发出告警

severity:严重级别的定义,当需要对告警做抑制配置的时候会用到

description:是告警触发后发送通知的内容

配置完成后需要重新加载一下prometheus配置让这个告警规则生效,这里我写了一个小脚本来实现:

#!/bin/bash
pid=$(lsof -i|grep prometheu|tail -n1|awk '{print $2}')
if [[ $pid != "" ]];then
echo $pid
kill -HUP $pid
else
echo "start"
/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/usr/local/prometheus/data 2>&1 &
fi

不用脚本也可以,脚本的大意为:如果prometheus在运行就热加载一次配置文件,如果没有运行就启动它。

3、告警测试

告警规则配置完成可以通过prometheus的web管理界面查看:

可以看到我们刚才添加的两个监控项目,下面就来对cpu的监控项目做一下测试看是否能触发监控并发送告警,通过这条命令将监控客户端的机器cpu负载提高到监控目标值之上

[root@nginx ~]# cat /dev/urandom | gzip -9 | gzip -d | gzip -9 | gzip -d >/dev/null

可以通过top看到cpu负载已经超过了80%

通过web界面可以看到已经触发了告警阈值,如果再坚持1分钟就会触发告警

已经触发告警,如果告警通知接口没问题就会收到它的告警内容。

赞(0)
未经允许不得转载:娃哈哈好喝 » prometheus告警
分享到: 更多 (0)