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

显示效果

相关推荐
逻辑与&&7 小时前
[Prometheus学习笔记]从架构到案例,一站式教程
笔记·学习·prometheus
Walden-20208 小时前
构建基于 DCGM-Exporter, Node exporter,PROMETHEUS 和 GRAFANA 构建算力监控系统
docker·容器·grafana·prometheus
牛角上的男孩1 天前
部署Prometheus、Grafana、Zipkin、Kiali监控度量Istio
grafana·prometheus·istio
福大大架构师每日一题3 天前
文心一言 VS 讯飞星火 VS chatgpt (383)-- 算法导论24.5 3题
prometheus
小安运维日记5 天前
Linux云计算 |【第五阶段】CLOUD-DAY10
linux·运维·云计算·k8s·grafana·prometheus
川石课堂软件测试5 天前
性能测试|linux服务器搭建JMeter+Grafana+Influxdb监控可视化平台
linux·服务器·python·jmeter·机器学习·grafana·1024程序员节
福大大架构师每日一题6 天前
29.2 golang实战项目log2metrics架构说明
架构·prometheus
花开了¥6 天前
prometheus 快速入门
prometheus
無爲謂6 天前
入门 | Kafka数据使用vector消费到Loki中使用grafana展示
分布式·kafka·vector·grafana·loki·日志存储·es限制解决办法
typ20046 天前
promtail+Loki+Grafana
grafana