docker-compose部署Prometheus+Alertmanager并配置钉钉告警

小柒博客 Prometheus评论5091字数 8559阅读28分31秒阅读模式

一、Prometheus告警简介

告警能力在Prometheus的架构中被划分成两个独立的部分。如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。

在Prometheus中一条告警规则主要由以下几部分组成:

告警名称:用户需要为告警规则命名,当然对于命名而言,需要能够直接表达出该告警的主要内容。

告警规则:告警规则实际上主要由PromQL进行定义,其实际意义是当表达式(PromQL)查询结果持续多长时间(During)后出发告警。

在Prometheus中,还可以通过Group(告警组)对一组相关的告警进行统一定义。当然这些定义都是通过YAML文件来统一管理的。

Alertmanager作为一个独立的组件,负责接收并处理来自Prometheus Server(也可以是其它的客户端程序)的告警信息。Alertmanager可以对这些告警信息进行进一步的处理,比如当接收到大量重复告警时能够消除重复的告警信息,同时对告警信息进行分组并且路由到正确的通知方,Prometheus内置了对邮件,Slack等多种通知方式的支持,同时还支持与Webhook的集成,以支持更多定制化的场景。

例如,目前Alertmanager还不支持钉钉,那用户完全可以通过Webhook与钉钉机器人进行集成,从而通过钉钉接收告警信息。同时AlertManager还提供了静默和告警抑制机制来对告警通知行为进行优化。

二、Alertmanager特性

告警能力在Prometheus的架构中被划分成两个独立的部分。如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。

1、分组

分组机制可以将详细的告警信息合并成一个通知。在某些情况下,比如由于系统宕机导致大量的告警被同时触发,在这种情况下分组机制可以将这些被触发的告警合并为一个告警通知,避免一次性接受大量的告警通知,而无法对问题进行快速定位。

例如,当集群中有数百个正在运行的服务实例,并且为每一个实例设置了告警规则。假如此时发生了网络故障,可能导致大量的服务实例无法连接到数据库,结果就会有数百个告警被发送到Alertmanager。

而作为用户,可能只希望能够在一个通知中中就能查看哪些服务实例收到影响。这时可以按照服务所在集群或者告警名称对告警进行分组,而将这些告警内聚在一起成为一个通知。

告警分组,告警时间,以及告警的接受方式可以通过Alertmanager的配置文件进行配置。

2抑制

抑制是指当某一告警发出后,可以停止重复发送由此告警引发的其它告警的机制。

例如,当集群不可访问时触发了一次告警,通过配置Alertmanager可以忽略与该集群有关的其它所有告警。这样可以避免接收到大量与实际问题无关的告警通知。

抑制机制同样通过Alertmanager的配置文件进行设置。

3静默

静默提供了一个简单的机制可以快速根据标签对告警进行静默处理。如果接收到的告警符合静默的配置,Alertmanager则不会发送告警通知。

静默设置需要在Alertmanager的Werb页面上进行设置。

Prometheus本身不支持告警功能,主要通过插件alertmanage来实现告警。AlertManager用于接收Prometheus发送的告警并对于告警进行一系列的处理后发送给指定的用户。

Prometheus触发一条告警的过程:

prometheus--->触发阈值--->超出持续时间--->alertmanager--->分组|抑制|静默--->媒体类型--->邮件|钉钉|微信等。

三、实现钉钉告警

1、创建钉钉机器人

1)钉钉选择群组 ---> 群设置 ---> 智能群助手

2)添加机器人

3)选择自定义

4)输入机器人名字、群组、安全设置

2、安装Docker

1)获取阿里Docker源

[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2

[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2)安装Docker

[root@localhost ~]# yum -y install docker-ce docker-ce-cli containerd.io

3)启动Docker

[root@localhost ~]# systemctl enable docker

[root@localhost ~]# systemctl start docker

3、安装Docker-Compose

Linux上我们可以从Github上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases

1)运行以下命令以下载Docker Compose的v2.16.0版本

[root@localhost ~]# wget -O /usr/bin/docker-compose https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64

2)授权可执行权限

[root@localhost ~]# chmod +x /usr/bin/docker-compose

3)测试是否安装成功

[root@localhost ~]# docker-compose -v

Docker Compose version v2.16.0

4、创建相关配置文件

1)创建Prometheus配置文件

[root@localhost ~]# mkdir -p /opt/monitor/conf

[root@localhost ~]# vim /opt/monitor/conf/prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s
 
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - alertmanager:9093

rule_files:
  - "/opt/prometheus/rules/node.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['prometheus:9090']

  - job_name: 'node'
    static_configs:
    - targets: ['node-exporter:9100']

  - job_name: 'alertmanager'
    static_configs:
    - targets: ['alertmanager:9093']

2)配置Prometheus告警规则

[root@localhost ~]# vim /opt/monitor/conf/node.yml

groups:
- name: Node Resource Monitoring
  rules:
  - alert: Node实例已宕机
    expr: up{instance =~ ".*:9100"} == 0
    for: 30s
    labels:
      user: root
      severity: Emergency
    annotations:
      summary: "{{ $labels.instance }} 客户端已停止运行,请尽快处理!"
      description: "Node_Exporter客户端已停止运行,当前状态:{{ $value }} "

3)创建Alertmanager配置文件

[root@localhost ~]# vim /opt/monitor/conf/alertmanager.yml

global:
  # 每2分钟检查一次是否恢复
  resolve_timeout: 2m
# route用来设置报警的分发策略
route:
  # 采用哪个标签来作为分组依据
  group_by: ['alertname']
  # 组告警等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
  group_wait: 10s
  # 两组告警的间隔时间
  group_interval: 10s
  # 重复告警的间隔时间,减少相同告警的发送频率
  repeat_interval: 1h
  # 设置默认接收人
  receiver: 'webhook'
receivers:
- name: 'webhook'
  webhook_configs:
  - url: 'http://dingtalk:8060/dingtalk/webhook/send'
    send_resolved: true

4)创建Dingtalk配置文件

[root@localhost ~]# vim /opt/monitor/conf/config.yml

## Request timeout
# timeout: 5s

## Uncomment following line in order to write template from scratch (be careful!)
#no_builtin_template: true

## Customizable templates path
templates:
- '/opt/dingtalk/template/dingtalk.tmpl'

## You can also override default template using `default_message`
## The following example to use the 'legacy' template from v0.3.0
#default_message:
#  title: '{{ template "legacy.title" . }}'
#  text: '{{ template "legacy.content" . }}'

## Targets, previously was known as "profiles"
targets:
  webhook:
    url: 'https://oapi.dingtalk.com/robot/send?access_token=输入Token'
    # secret for signature
    secret: '加签内容'

5)配置钉钉告警告警模板

[root@localhost ~]# vim /opt/monitor/conf/dingtalk.tmpl

{{ define "__subject" }}
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}]
{{ end }}
 

{{ define "__alert_list" }}{{ range . }}
---
{{ if .Labels.owner }}@{{ .Labels.owner }}{{ end }}

告警状态:{{ .Status }} 

告警级别:{{ .Labels.severity }} 

告警类型:{{ .Labels.alertname }} 

告警主机:{{ .Labels.instance }} 

告警详情:{{ .Annotations.description }} 

告警时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} 
{{ end }}{{ end }}
 
{{ define "__resolved_list" }}{{ range . }}
---
{{ if .Labels.owner }}@{{ .Labels.owner }}{{ end }}
告警状态:{{ .Status }}  

告警级别:{{ .Labels.severity }} 

告警类型:{{ .Labels.alertname }} 

告警主机:{{ .Labels.instance }} 

告警详情:{{ .Annotations.description }}  

告警时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} 

恢复时间:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} 
{{ end }}{{ end }}
 
{{ define "default.title" }}
{{ template "__subject" . }}
{{ end }}

{{ define "default.content" }}
{{ if gt (len .Alerts.Firing) 0 }}
**Prometheus故障告警**
{{ template "__alert_list" .Alerts.Firing }}
---
{{ end }}


{{ if gt (len .Alerts.Resolved) 0 }}
**Prometheus故障恢复**
{{ template "__resolved_list" .Alerts.Resolved }}
{{ end }}
{{ end }}
 
{{ define "ding.link.title" }}{{ template "default.title" . }}{{ end }}
{{ define "ding.link.content" }}{{ template "default.content" . }}{{ end }}
{{ template "default.title" . }}
{{ template "default.content" . }}

6)创建docker-compose.yml

[root@localhost ~]# vim /opt/monitor/docker-compose.yml

version: '3.3'
services:
  prometheus:
    image: bitnami/prometheus:2.37.0
    container_name: prometheus
    hostname: prometheus
    restart: always
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--web.enable-lifecycle'
      - '--storage.tsdb.retention.time=90d'
    volumes:
      - /opt/monitor/conf/prometheus.yml:/etc/prometheus/prometheus.yml
      - /opt/monitor/conf/node.yml:/opt/prometheus/rules/node.yml
    ports:
      - "9090:9090"
    environment: 
      - TZ=Asia/Shanghai
    networks:
      - monitor

  alertmanager:
    image: bitnami/alertmanager:0.25.0
    container_name: alertmanager
    hostname: alertmanager
    restart: always
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
    volumes:
      - /opt/monitor/conf/alertmanager.yml:/etc/alertmanager/alertmanager.yml
    ports:
      - "9093:9093"
    environment: 
      - TZ=Asia/Shanghai
    networks:
      - monitor

  dingtalk:
    image: timonwong/prometheus-webhook-dingtalk
    container_name: dingtalk         
    hostname: dingtalk
    restart: always
    volumes:
      - /opt/monitor/conf/config.yml:/etc/prometheus-webhook-dingtalk/config.yml
      - /opt/monitor/conf/dingtalk.tmpl:/opt/dingtalk/template/dingtalk.tmpl
    ports:
      - 8060:8060
    environment: 
      - TZ=Asia/Shanghai
    networks:
      - monitor

  node-exporter:
    image: bitnami/node-exporter:1.5.0
    container_name: node-exporter
    hostname: node-exporter
    restart: always
    ports:
      - "9100:9100"
    environment: 
      - TZ=Asia/Shanghai
    networks:
      - monitor
networks:
  monitor:
    driver: bridge

7)启动容器

[root@localhost ~]# cd /opt/monitor

[root@localhost monitor]# docker-compose up -d

8)查看容器运行状态

[root@localhost monitor]# docker-compose ps -a

NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS

alertmanager bitnami/alertmanager:0.25.0 "/opt/bitnami/alertm…" alertmanager 3 minutes ago Up 3 minutes 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp

dingtalk timonwong/prometheus-webhook-dingtalk "/bin/prometheus-web…" dingtalk 3 minutes ago Up 3 minutes 0.0.0.0:8060->8060/tcp, :::8060->8060/tcp

node-exporter bitnami/node-exporter:1.5.0 "/opt/bitnami/node-e…" node-exporter 3 minutes ago Up 3 minutes 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp

prometheus bitnami/prometheus:2.37.0 "/opt/bitnami/promet…" prometheus 3 minutes ago Up 3 minutes 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp

5、验证钉钉告警

# 浏览器访问Prometheus管理界面可以看到如下信息:

1)模拟停止node_exporter服务,触发钉钉告警

[root@localhost monitor]# docker-compose stop node-exporter

2)再次查看Prometheus界面的Alerts可以看到告警状态。

绿色表示正常。

黄色状态为PENDING表示Alerts还没有发送至Alertmanager,因为rules里面配置了for: 30s。

30秒后状态由PENDING变为FIRING,此时Prometheus才将告警发给alertmanager,在Alertmanager中可以看到有一个alert。

3)查看Alertmanager

4)查看钉钉告警信息

5)启动node_exporter

[root@localhost monitor]# docker-compose start node-exporter

6)查看钉钉会收到恢复信息

附:

CPU使用率告警规则:

groups:
- name: CPU
  rules:
  - alert: CPU使用率过高
    expr: (100 - (avg by (instance) (irate(node_cpu{mode="idle"}[5m])) * 100)) > 80
    for: 1m
    labels:
    severity: Warning
      annotations:
    summary: "{{ $labels.instance }} CPU使用率过高"
      description: "{{ $labels.instance }}: CPU使用率超过80%,当前使用率({{ $value }})."

内存使用率告警规则:

groups:
- name: Memory
  rules:
  - alert: 内存使用率过高
    expr: (node_memory_MemTotal - (node_memory_MemFree+node_memory_Buffers+node_memory_Cached )) / node_memory_MemTotal * 100 > 80
    for: 1m  # 告警持续时间,超过这个时间才会发送给alertmanager
    labels:
      severity: Warning
    annotations:
      summary: "{{ $labels.instance }} 内存使用率过高"
      description: "{{ $labels.instance }}:内存使用率超过80%,当前使用率({{ $value }})."

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
微信公众号
微信扫一扫,关注我!
weinxin
小柒博客
  • 本文由 小柒博客 发表于 2023年5月4日15:50:52
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/9124.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证