Prometheus+Grafana+Alertmanager监控告警

Prometheus+Grafana+Alertmanager告警

Alertmanager开源地址:github.com/prometheus

Prometheus是一款基于时序数据库的开源监控告警系统,它是SoundCloud公司开源的,SoundCloud的服务架构是微服务架构,他们开发了很多微服务,由于服务太多,传统的监控已经无法满足它的监控需求,于是他们在2012就着手开发新的监控系统。

本篇使用的组件:

  • Prometheus
  • Grafana
  • Node-exporter
  • Alertmanager

本篇忽略前三个组件的安装步骤

IP 部署组件
10.22.51.65 Prometheus服务端、Grafana、Alertmanager报警
10.22.51.66 Node-exporter
120.78.156.217 Node-exporter
10.22.51.64 Node-exporter

1、Prometheus架构原理

1.架构图

来自官方的架构图

2.怎么采集监控数据

要采集目标的监控数据,首先就要在被采集目标地方安装采集组件(如node-exporter),这种采集组件被称为Exporter。prometheus.io官网上有很多这种exporter,官方 exporter列表

采集完了怎么传输到Prometheus?

采集了数据,要传输给prometheus。怎么做?

Exporter 会暴露一个HTTP接口,prometheus通过Pull模式的方式来拉取数据,会通过HTTP协议周期性抓取被监控的组件数据。

不过prometheus也提供了一种方式来支持Push模式,你可以将数据推送到Push Gateway,prometheus通过pull的方式从Push Gateway获取数据。

3.主要流程

  1. Prometheus server定期从静态配置的 targets 或者服务发现的 targets 拉取数据(zookeeper,consul,DNS SRV Lookup等方式)
  2. 当新拉取的数据大于配置内存缓存区的时候,Prometheus会将数据持久化到磁盘,也可以远程持久化到云端。
  3. Prometheus通过PromQL、API、Console和其他可视化组件展示数据。Prometheus支持很多方式图表可视化,比如Grafana,自带的Promdash。它还提供HTTP API的查询方式,自定义输出。
  4. Prometheus 可以配置rules,然后定时查询数据,当条件触发的时候,会将alert推送到配置的Alertmanager。
  5. Alertmanager收到告警的时候,会根据配置,聚合,去重,降噪,最后发出警告。

2、Centos7部署Alertmanager

1.Alertmanager下载安装

cd /usr/local/src

wget  https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-386.tar.gz

tar -zxvf alertmanager-0.27.0.linux-386.tar.gz -C /data

mv /data/alertmanager-0.27.0.linux-386 /data/alertmanager

2.加入systemd管理

[root@zhongjl-test-02 /data/alertmanager]# cat /etc/systemd/system/alertmanager.service 
[Unit]
Description=AlertManager Service
After=network.target
After=syslog.target

[Service]
Restart=always
ExecStart=/data/alertmanager/alertmanager --config.file=/data/alertmanager/alertmanager.yml

[Install]
WantedBy=multi-user.target

3.启动alertmanager

systemctl start alertmanager.service

[root@zhongjl-test-02 /data/alertmanager]# netstat -tnlp | grep aler
tcp6       0      0 :::9093                 :::*                    LISTEN      663/alertmanager    
tcp6       0      0 :::9094                 :::*                    LISTEN      663/alertmanager

3、prometheus文件配置

修改prometheus主配置文件data/prometheus/prometheus.yml

[root@zhongjl-test-02 /data/prometheus]# cat /data/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 10.22.51.65:9093

rule_files:
  - "rules/*.yml"
  - "rules/target_down.yml"

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["10.22.51.65:9090"]

  - job_name: 'node'
    static_configs:
      - targets: ['10.22.51.63:9100', '10.22.51.65:9100', '10.22.51.66:9100', '120.78.156.217:9100', '120.78.156.217:8181']

  - job_name: 'test_cluster'
    file_sd_configs:
      - files: ['/data/prometheus/sd_config/*.yml']

1.配置说明:

alerting:配置Alertmanager与prometheus通讯

sed -i '
/alerting:/, /static_configs:/c\
alerting:\
  alertmanagers:\
    - static_configs:\
        - targets:\
          - 10.22.51.65:9093
' /data/prometheus/prometheus.yml

引入告警规则文件

在prometheus配置文件中创建告警规则,编辑文件vim /data/prometheus/prometheus.yml,新增内容:

rule_files:
  - "rules/*.yml"
  - "rules/target_down.yml"

创建一个job

  - job_name: 'test_cluster'   # 创建一个job
    file_sd_configs:           # 此job基于文件动态添加node
      - files: ['/usr/local/prometheus/sd_config/*.yml']   # 动态添加node的文件路径
        refresh_interval: 5s   # 隔  5s检查一次文件是否有新增或删除

4、Job节点配置与测试

1.job节点配置

[root@zhongjl-test-02 /data/prometheus]# cat sd_config/node.yml 
- targets: ['10.22.51.66:9100']
  #labels:                    # 可以设置标签
  #  name: docker
- targets: ['10.22.51.63:9100']
- targets: ['10.22.51.65:9090']
  #labels:
  #  name: prometheus

2.prometheus界面说明

可以在这个界面使用promeSQL查看监控的数据,后面再说。

Status------->Service Discovery 查看发现的被监控端的机器

Status------->Targets 查看被监控的机器的状态

Status------->Rules 查看配置的告警规则

Status------->Configuration 查看prometheus的配置文件

Graph 可以编辑promeSQL,查看收集到的数据,可以做sql调试,也可以用图形化展示;不过图形化展示建议配合grafna做。

Alerts 可以查看告警的状态

3.查看节点

在prometheus的web页面Status----->Service Discovery查看是否发现了配置的node

在Status----->Targets可以查看当前发现的node状态是否是正常的,up为正常

4.查看收集的数据

根据上面Endpoint的连接,在Prometheus上利用sql查看node的CPU的数据node_cpu_seconds_total

5、告警测试

1.创建告警规则存放文件

mkdir -p /data/prometheus/rules
#创建规则文件,名称自定义
vim /data/prometheus/rules/systemd.yml

systemd.yml配置内容:

groups:
- name: docker
  rules:
  - alert: docker_systemd_down  # 告警聚合的名称依据
    expr: node_systemd_unit_state{name="docker.service", state="inactive", type="notify"} == 1
    for: 1m
    labels:
      severity: 灾难  # 告警级别
    annotations:
      summary: "Instance {{ $labels.name }} 停止工作"
      description: "{{ $labels.instance }}的{{ $labels.name }} 已经停止1分钟以上"
 
  - alert: sshd_systemd_down
    expr: node_systemd_unit_state{name="sshd.service", state="inactive", type="notify"} == 1
    for: 1m
    labels:
      severity: 灾难
    annotations:
      summary: "Instance {{ $labels.name }} 停止工作"
      description: "{{ $labels.instance }}的{{ $labels.name }} 已经停止1分钟以上"
 
  - alert: nginx_systemd_down
    expr: node_systemd_unit_state{name="nginx.service", state="inactive", type="notify"} == 1
    for: 1m
    labels:
      severity: 灾难
    annotations:
      summary: "Instance {{ $labels.name }} 停止工作"
      description: "{{ $labels.instance }}的{{ $labels.name }} 已经停止1分钟以上"

2.告警规则配置说明

docker服务停止告警

groups:
- name: docker
  rules:
  - alert: docker_systemd_down  # 告警聚合的名称依据
    expr: node_systemd_unit_state{name="docker.service", state="inactive", type="notify"} == 1
    for: 1m
    labels:
      severity: 灾难  # 告警级别
    annotations:
      summary: "Instance {{ $labels.name }} 停止工作"
      description: "{{ $labels.instance }}的{{ $labels.name }} 已经停止1分钟以上"

ssh服务停止告警

  - alert: sshd_systemd_down
    expr: node_systemd_unit_state{name="sshd.service", state="inactive", type="notify"} == 1
    for: 1m
    labels:
      severity: 灾难
    annotations:
      summary: "Instance {{ $labels.name }} 停止工作"
      description: "{{ $labels.instance }}的{{ $labels.name }} 已经停止1分钟以上"

nginx服务停止告警

  - alert: nginx_systemd_down
    expr: node_systemd_unit_state{name="nginx.service", state="inactive", type="notify"} == 1
    for: 1m
    labels:
      severity: 灾难
    annotations:
      summary: "Instance {{ $labels.name }} 停止工作"
      description: "{{ $labels.instance }}的{{ $labels.name }} 已经停止1分钟以上"

2.编辑altermanager配置文件

cat /data/prometheus/prometheus.yml

global:   # 全局的配置
  resolve_timeout: 5m  # 解析的超时时间
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: '980521387@qq.com'
  smtp_auth_username: '980521387@qq.com'
  smtp_auth_password: 'kparebywhhvubced'
  smtp_require_tls: false

route:    # 将告警具体怎么发送
  group_by: ['alertname']  # 根据标签进行分组
  group_wait: 10s          # 发送告警等待时间
  group_interval: 10s      # 发送告警邮件的间隔时间
  repeat_interval: 1h      # 重复的告警发送时间
  receiver: 'email'        # 接收者是谁
receivers:                 # 将告警发送给谁
- name: 'email'
  email_configs:
  - to: 'zhongjinlin31314@sunline.cn'
inhibit_rules:   # 抑制告警
  - source_match:
      severity: 'critical'   # 当收到同一台机器发送的critical时候,屏蔽掉warning类型的告警
    target_match:
      severity: 'warning'
    equal: ['alertname', 'severity', 'instance']  # 根据这些标签来定义抑制

3.验证altermanager配置文件

检查altermanager和Prometheus的配置文件,看看是否有报错,是否有发现规则

#检查altermanager配置文件
[root@zhongjl-test-02 /data/alertmanager]# ./amtool check-config alertmanager.yml
Checking 'alertmanager.yml'  SUCCESS
Found:
 - global config
 - route
 - 1 inhibit rules
 - 1 receivers
 - 0 templates


#检查Prometheus的配置文件
[root@zhongjl-test-02 /data/alertmanager]# cd /data/prometheus/
[root@zhongjl-test-02 /data/prometheus]# ./promtool check config prometheus.yml
Checking prometheus.yml
  SUCCESS: 3 rule files found
 SUCCESS: prometheus.yml is valid prometheus config file syntax

Checking rules/systemd.yml
  SUCCESS: 3 rules found

Checking rules/target_down.yml
  SUCCESS: 1 rules found

Checking rules/target_down.yml
  SUCCESS: 1 rules found

没有报错,并且发现了报警规则,可以重启prometheus和altermanager服务

systemctl restart prometheus.service alertmanager.service

4.登陆web验证

登陆prometheus的web页面--点击Alerts,查看是否有规则等

点击Status--再点击Rules

5.docker告警测试

停止docker,进行邮件报警测试

systemctl stop docker.socket
systemctl stop docker

停止docker服务后,不会立即发送报警邮件,可以看到当前的状态已经是PENDING,这个时候altermanager已经收到prometheus的报告,说明docker服务已经挂掉了,等待状态变为FIRING的时候,才会发送邮件。

6.邮件截图

如需配置多台告警,需保证以下条件:

  • 检查其他节点上的 node_exporter 配置,确保 node_exporter 服务文件中包含 --collector.systemd 参数。(参考步骤:7.无法发送消息处理)

  • 确保prometheus配置包含node节点,如:

    - job_name: 'node'
      static_configs:
        - targets: ['10.22.51.63:9100', '10.22.51.65:9100', '10.22.51.66:9100']
    

在 Prometheus Web 界面(通常是 http://<prometheus_host>:9090)中,执行以下 PromQL 查询,确认可以抓取到所有节点上的 node_systemd_unit_state 指标:

node_systemd_unit_state{name="docker.service"}

7.无法发送消息处理

如停止后,无法发送消息,确保 node_exporter 启动时包含了 systemd 采集器。如果 node_exporter 没有正确配置为采集 systemd 状态,Prometheus 将无法获取 Docker 服务状态。

修改vim /usr/lib/systemd/system/node_exporter.service,在 [Service] 部分添加 --collector.systemd 参数,然后,重新加载 systemd 配置并重启 node_exporter 服务:

ExecStart=/data/node_exporter/node_exporter --collector.systemd


systemctl daemon-reload
systemctl restart node_exporter

访问 Prometheus Web 界面,通常是 http://<prometheus_host>:9090。在查询栏输入以下查询:

node_systemd_unit_state{name="docker.service"}

查看返回的结果,确认是否有 inactive 的状态数据。

6、采集失败告警

这条规则针对目标服务器宕机,网络连接问题,Node Exporter 服务未运行等问题。

1.告警规则说明

当Prometheus 无法抓取目标 http://120.78.156.217:9100/metrics 的指标,并显示了 "connection refused" 错误。如图:

2.创建告警规则文件

1.首先,在 rules 目录下创建一个新的规则文件,比如 vim /data/prometheus/rules/target_down.yml

groups:
- name: target_down
  rules:
  - alert: TargetDown
    expr: up == 0
    for: 1m
    labels:
      severity: 灾难
    annotations:
      summary: "抓取目标 {{ $labels.instance }} 下线"
      description: "Prometheus 无法抓取目标 {{ $labels.instance }},状态为 DOWN 超过 1 分钟。"

prometheus.yml 中添加这个规则文件:

rule_files:
  - "rules/*.yml"
  - "rules/target_down.yml"

保存并重启 Prometheus 以应用新的配置

3.验证告警规则

通过 Prometheus 的 Web 界面 http://<prometheus_host>:9090 查看新的告警规则是否加载正确。

登陆120.78.156.217服务器,手动停止Node-exporter,确认当 http://120.78.156.217:9100/metrics 无法访问时,新的告警会被触发。

8、引入告警模板

mkdir -p /data/alertmanager/templates


#{{ define "email.from" }}xxxx@163.com{{ end }}
#{{ define "email.to" }}xxxx@163.com{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
<span style="color:red; font-weight:bold;">===========================</span><br>
故障主机: <span style="color:blue;">{{ .Labels.instance }}</span> <br>
报警级别: <span style="color:red; font-weight:bold;">{{ .Labels.severity }} {{ if .Labels.status }} ({{ .Labels.status }}) {{ end }}</span> <br>
报警类型: <span style="color:orange;">{{ .Labels.alertname }}</span> <br>
报警概述: <span style="font-weight:bold;">{{ .Annotations.summary }}</span> <br>
报警详情: {{ .Annotations.description }} <br>
触发时间: <span style="color:green;">{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}</span> <br>
<span style="color:red; font-weight:bold;">===========================</span><br>
{{ end }}
{{ end }}

修改alertmanager.yml,增加

    html: '{{ template "email.to.html" . }}'

templates:
  - '/data/alertmanager/templates/emails.tmpl'

完整配置如下:

global:   # 全局的配置
  resolve_timeout: 5m  # 解析的超时时间
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: '980521387@qq.com'
  smtp_auth_username: '980521387@qq.com'
  smtp_auth_password: 'kparebywhhvubced'
  smtp_require_tls: false
 
route:    # 将告警具体怎么发送
  group_by: ['alertname']  # 根据标签进行分组
  group_wait: 10s          # 发送告警等待时间
  group_interval: 10s      # 发送告警邮件的间隔时间
  repeat_interval: 1h      # 重复的告警发送时间
  receiver: 'email'        # 接收者是谁

receivers:                 # 将告警发送给谁
- name: 'email'
  email_configs:
  - to: 'zhongjinlin31314@sunline.cn'
    html: '{{ template "email.to.html" . }}'

templates:
  - '/data/alertmanager/templates/emails.tmpl'

inhibit_rules:   # 抑制告警
  - source_match:
      severity: 'critical'   # 当收到同一台机器发送的critical时候,屏蔽掉warning类型的告警
    target_match:
      severity: 'warning'
    equal: ['alertname', 'severity', 'instance', 'status']  # 根据这些标签来定义抑制

9、模拟测试

找台监控的服务器,多开终端,执行命令

cat /dev/urandom | md5sum

显示效果

相关推荐
晴天飛 雪13 小时前
Grafana监控PostgreSQL
数据库·postgresql·grafana
大虾别跑1 天前
docker安装zabbix +grafana
docker·zabbix·grafana
菜鸟挣扎史1 天前
grafana+prometheus+windows_exporter实现windows进程资源占用的监控
windows·grafana·prometheus·进程·process
tester Jeffky2 天前
JMeter监听器与压测监控之Grafana
jmeter·eureka·grafana
牙牙7053 天前
Prometheus结合K8s(二)使用
容器·kubernetes·prometheus
牙牙7054 天前
Prometheus结合K8s(一)搭建
容器·kubernetes·prometheus
福大大架构师每日一题4 天前
32.2 prometheus倒排索引统计功能
ios·iphone·prometheus
DB菜鸟6 天前
Grafana Username password invalid
java·服务器·grafana
让生命变得有价值6 天前
使用 Grafana api 查询 Datasource 数据
grafana·prometheus
福大大架构师每日一题6 天前
31.3 XOR压缩和相关的prometheus源码解读
prometheus