prometheus-alertmanager

alertmanager

alertmanager可以放在远程服务器上

报警机制

在 prometheus 中定义你的监控规则,即配置一个触发器,某个值超过了设置的阈值就触发告警, prometheus 会推送当前的告警规则到 alertmanager,alertmanager 收到了会进行一系列的流程处理,然后发送到接收人手里

配置安装

wget https://github.com/prometheus/alertmanager/releases/download/v0.19.0/alertmanager-0.19.0.linux-amd64.tar.gz
tar zxf alertmanager-0.19.0.linux-amd64.tar.gz
mv alertmanager-0.19.0.linux-amd64.tar.gz  /usr/local/alertmanager && cd /usr/local/alertmanager && ls

配置文件
cat alertmanager.yml

global:
  resolve_timeout: 5m   ##全局配置,设置解析超时时间

route:
  group_by: ['alertname']  ##alertmanager中的分组,选哪个标签作为分组的依据
  group_wait: 10s          ##分组等待时间,拿到第一条告警后等待10s,如果有其他的一起发送出去
  group_interval: 10s    ##各个分组之前发搜告警的间隔时间
  repeat_interval: 1h    ##重复告警时间,默认1小时
  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']

邮件接收配置

cat alertmanager.yml 
global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.163.com:25'         #smtp服务地址
  smtp_from: '[email protected]'                  #发送邮箱
  smtp_auth_username: '[email protected]'         #认证用户名
  smtp_auth_password: 'xxxx'                #认证密码
  smtp_require_tls: false                   #禁用tls

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1m
  receiver: 'email'                      #定义接受告警组名
receivers:                                  
- name: 'email'                          #定义组名
  email_configs:                         #配置邮件
  - to: '[email protected]'                     #收件人

检查配置文件
./amtool check-config alertmanager.yml

配置为系统服务

cat > /usr/lib/systemd/system/alertmanager.service <<EOF
> [Unit]
> Description=alertmanager
> 
> [Service]
> Restart=on-failure
> ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
> 
> [Install]
> WantedBy=multi-user.target
> EOF

和prometheus 结合配置

alerting:
  alertmanagers:
  - static_configs:
    - targets:
       - 127.0.0.1:9093   ##配置alertmanager地址

rule_files:
  - "rules/*.yml"         ##配置告警规则的文件

配置报警规则
报警规则的目录 /usr/local/prometheus/rules

/usr/local/prometheus/rules]# cat example.yml
groups:
- name: exports.rules     ##定义这组告警的组名,同性质的,都是监控实例exports是否开启的模板
  rules:

  - alert: 采集器挂了      ## 告警名称
    expr: up == 0        ## 告警表达式,监控up指标,如果等于0,表示监控的节点没有起来,然后进行下面的操作
    for: 1m              ## 持续一分钟为0就进行告警
    labels:              ## 定义告警级别
      severity: ERROR
    annotations:         ## 定义告警通知怎么写,默认调用了{$labels.instance&$labels.job}的值
      summary: "实例 {{ $labels.instance }} 挂了"
      description: "实例 {{ $labels.instance }} job 名为 {{ $labels.job }} 的挂了"


配置的变量解释:

{{ $labels.instance }}  #提取了up里的instance 值
{{ $labels.job }}

相同的报警名称即 alertname (根据配置文件 alert 归类)会被合并到同一个邮件里一并发出

告警的分配

分配策略,在报警的配置文件中设定

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1m
  receiver: 'email'

告警分配示例

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: '[email protected]'
  smtp_auth_username: '[email protected]'
  smtp_auth_password: 'xxx'
  smtp_require_tls: false

route:
  receiver: 'default-receiver'                  ##定义默认接收器名,如果其他的匹配不到走这个
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  group_by: [cluster, alertname]                ##分组设置
  routes:                                       ##子路由
  - receiver: 'database-pager'                  ##定义接收器名字          
    group_wait: 10s                             ##分组设置
    match_re:                                   ##正则匹配
      service: mysql|cassandra                  ##接收标签service值为mysql&&cassandra的告警
  - receiver: 'frontend-pager'                  ##接收器名
    group_by: [product, environment]            ##分组设置
    match:                                      ##直接匹配
      team: frontend                            ##匹配标签team值为frontend的告警
receivers:                                      ##定义接收器
- name: 'default-receiver'                      ##接收器名字
  email_configs:                                ##邮件接口
  - to: 'xxx.xx.com'                            ##接收人,下面以此类推
- name: 'database-pager'
  email_configs:
  - to: 'xxx.xx.com'
- name: 'frontend-pager'
  email_configs:
  - to: '[email protected]'

告警收敛

收敛就是尽量压缩告警邮件的数量,防止关键信息淹没,alertmanager 中有很多收敛机制,最主要的就是分组抑制静默,alertmanager 收到告警之后会先进行分组,然后进入通知队列,这个队列会对通知的邮件进行抑制静默,再根据 router 将告警路由到不同的接收器

机制                     说明
分组 (group)              将类似性质的告警合并为单个进行通知
抑制 (Inhibition)     当告警发生后,停止重复发送由此告警引发的其他告警
静默 (Silences)               一种简单的特定时间静音提醒的机制

分组:根据报警名称分组,如果相同的报警名称的信息有多条,会合并到一个邮件里发出。
匹配的报警名称:
prometheus 监控的报警规则
/usr/local/prometheus/rules/*.yml

- alert: 节点挂了

抑制:消除冗余告警,在 alertmanager 中配置的

inhibit_rules:
  - source_match:          
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['instance']

##当我收到一个告警级别为 critical 时,他就会抑制掉 warning 这个级别的告警,这个告警等级是在你编写规则的时候定义的,最后一行就是要对哪些告警做抑制,通过标签匹配的,我这里只留了一个 instance,举个最简单的例子,当现在 alertmanager 先收到一条 critical、又收到一条 warning 且 instance 值一致的两条告警他的处理逻辑是怎样的。

##在监控 nginx,nginx 宕掉的告警级别为 warning,宿主机宕掉的告警级别为 critical,譬如说现在我跑 nginx 的服务器凉了,这时候 nginx 肯定也凉了,普罗米修斯发现后通知 alertmanager,普罗米修斯发过来的是两条告警信息,一条是宿主机凉了的,一条是 nginx 凉了的,alertmanager 收到之后,发现告警级别一条是 critical,一条是 warning,而且 instance 标签值一致,也就是说这是在一台机器上发生的,所以他就会只发一条 critical 的告警出来,warning 的就被抑制掉了,我们收到的就是服务器凉了的通知

静默:

特定时间静音提醒的机制,主要是使用标签匹配这一批不发送告警,假如某天要对服务器进行维护,可能会涉及到服务器重启,在这期间肯定会有 N 多告警发出来, 在这期间配置一个静默,这类的告警就不要发了

告警示例

监控内存
promsql
(node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / (node_memory_MemTotal_bytes )* 100 > 80

编写规则:

CD  /usr/local/prometheus/rules
cat memory.yml 
groups:
- name: memeory_rules
  rules:

  - alert: 内存没了
    expr: (node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / (node_memory_MemTotal_bytes )* 100 > 80    #表达式成立,即可以查询到数据
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} 内存没了"
      description: "{{ $labels.instance }} 内存没了,当前使用率为 {{ $value }}"

配置告警分配

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 5m
  receiver: 'default-receiver'
  routes: 
    - group_by: ['mysql']
      group_wait: 10s
      group_interval: 10s
      repeat_interval: 5m
      receiver: 'mysql-pager'
      match_re:
        job: mysql

receivers:
- name: 'default-receiver'
  email_configs:
  - to: '[email protected]'
- name: 'mysql-pager'
  email_configs:
  - to: '[email protected]'

inhibit_rules:
  - source_match:          
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['instance']

参考:https://blog.rj-bai.com/post/158.html

猜你喜欢

转载自www.cnblogs.com/g2thend/p/11865302.html
今日推荐