Prometheus+Grafana+Alertmanager监控告警

Prometheus+Grafana+Alertmanager告警

Alertmanager开源地址:github.com/prometheus

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

本篇使用的组件:

  • Prometheus
  • Grafana
  • Node-exporter
  • Alertmanager

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

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

1、Prometheus架构原理

1.架构图

来自官方的架构图

img

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/srcwget  https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-386.tar.gztar -zxvf alertmanager-0.27.0.linux-386.tar.gz -C /datamv /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: 15sevaluation_interval: 15salerting:alertmanagers:- static_configs:- targets:- 10.22.51.65:9093rule_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'   # 创建一个jobfile_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界面说明

image-20240730214722564

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

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

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

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

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

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

# Alerts 可以查看告警的状态

3.查看节点

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

image-20240730214019269

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

image-20240730214833942

4.查看收集的数据

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

image-20240730215015428

5、告警测试

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

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

systemd.yml配置内容:

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

2.告警规则配置说明

docker服务停止告警

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

ssh服务停止告警

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

nginx服务停止告警

  - alert: nginx_systemd_downexpr: node_systemd_unit_state{name="nginx.service", state="inactive", type="notify"} == 1for: 1mlabels: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: falseroute:    # 将告警具体怎么发送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.ymlSUCCESS: 3 rule files foundSUCCESS: prometheus.yml is valid prometheus config file syntaxChecking rules/systemd.ymlSUCCESS: 3 rules foundChecking rules/target_down.ymlSUCCESS: 1 rules foundChecking rules/target_down.ymlSUCCESS: 1 rules found

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

systemctl restart prometheus.service alertmanager.service

4.登陆web验证

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

image-20240730211449081

点击Status--再点击Rules

image-20240730211523512

5.docker告警测试

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

systemctl stop docker.socket
systemctl stop docker

image-20240730220212207

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

image-20240730220301942

6.邮件截图

image-20240730220448574

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

  • 检查其他节点上的 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"}

image-20240730224542350

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.systemdsystemctl daemon-reload
systemctl restart node_exporter

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

node_systemd_unit_state{name="docker.service"}

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

image-20240730212426844

6、采集失败告警

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

1.告警规则说明

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

image-20240730220727987

2.创建告警规则文件

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

groups:
- name: target_downrules:- alert: TargetDownexpr: up == 0for: 1mlabels: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 查看新的告警规则是否加载正确。

image-20240730221311896

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

image-20240730221427221

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: falseroute:    # 将告警具体怎么发送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

显示效果

image-20240731112548894

image-20240731112514343

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387620.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP为什么需要四次挥手?

tcp为什么需要四次挥手&#xff1f; 答案有两个&#xff1a; 1.将发送fin包的权限交给被动断开方的应用层去处理&#xff0c;也就是让程序员处理 2.接第一个答案&#xff0c;应用层有了发送fin的权限&#xff0c;可以在发送fin前继续向对端发送消息 为了搞清楚这个问题&…

前端开发知识-vue

大括号里边放键值对&#xff0c;即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤&#xff1a; 1.javascript中引入vue.js 可以src中可以是vue的网址&#xff0c;也可以是本地下载。 2.在javasc…

网络爬虫必备工具:代理IP科普指南

文章目录 1. 网络爬虫简介1.1 什么是网络爬虫&#xff1f;1.2 网络爬虫的应用领域1.3 网络爬虫面临的主要挑战 2. 代理IP&#xff1a;爬虫的得力助手2.1 代理IP的定义和工作原理2.2 爬虫使用代理IP的必要性 3. 代理IP的类型及其在爬虫中的应用3.1 动态住宅代理3.2 动态数据中心…

数据挖掘-数据预处理

来自&#x1f96c;&#x1f436;程序员 Truraly | 田园 的博客&#xff0c;最新文章首发于&#xff1a;田园幻想乡 | 原文链接 | github &#xff08;欢迎关注&#xff09; 文章目录 3.3.1 数据的中心趋势平均数和加权平均数众数&#xff0c;中位数和均值描述数据的离散程度 &a…

【MySQL】用户管理连接池原理{数据库权限/连接池/mysql访问逻辑}

文章目录 1.普通用户的引入用户创建用户删除用户修改用户密码 2.数据库的权限给用户授权回收权限实操过程 3.简略介绍mysql连接池3.一个用户注册/登录/使用网页版mysql逻辑 1.普通用户的引入 用户 MySQL中的用户&#xff0c;都存储在系统数据库mysql的user表中 mysql> use…

uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功

文章目录 导文是因为要添加服务器域名&#xff01; 导文 uniapp微信小程序本地和真机调试文件图片上传成功但体验版不成功 uniapp微信小程序体验版上传图片不成功 微信小程序本地和真机调试文件图片上传成功但体验版不成功 是因为要添加服务器域名&#xff01; 先看一下 你小程…

解决jenkins配置extendreport不展示样式

下载插件&#xff1a;Groovy 、 HTML Publisher plugin 配置&#xff1a; 1&#xff09;Post Steps &#xff1a; 增加 Execute system Groovy script &#xff0c; 内容&#xff1a; System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "&qu…

C++ | string

前言 本篇博客讲解c中的string类的使用(常用接口) &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee:普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389…

Magento2 常用命令以及技巧

1.Magento 命令行工具 Magento2 带有一个命令行工具&#xff0c;在windows下&#xff0c;用管理员权限打开MS-DOS命令提示符&#xff0c;然后cd到Magento根目录&#xff0c;运行下面命令&#xff0c;就可 以看到这个强大的命令行工具的命令清单&#xff1a; php bin/magentoU…

【C++】C++11中R字符串的作用

在 C11 中添加了定义原始字符串的字面量 1.定义和基本使用 定义方式为&#xff1a; R"xxx(原始字符串)xxx"其中 () 两边的字符串可以省略&#xff0c;R只会处理括号中的字符串。 原始字面量 R 可以直接表示字符串的实际含义&#xff0c;而不需要额外对字符串做转义…

半球房屋:高性价比的创新建筑选择—轻空间

在现代建筑领域&#xff0c;半球房屋因其独特的设计和高性价比受到广泛关注。这种建筑形式不仅在外观上引人注目&#xff0c;更在功能和经济效益上表现出色。以下将介绍半球房屋的主要优势&#xff0c;特别是其在成本和效益方面的突出表现。 降低建造成本&#xff0c;节约资源 …

资金管理平台 -SAP创建凭证测试程序及增强!

文章目录 主要程序创建程序程序 代码解析变量定义抬头和项目初始值表头赋值调用BAPI其他的子例程 核心内表增强部分LFACIF5D程序FI_DOCUMENT_CHECK完整程序 BADI增强 主要程序 创建程序 程序 &---------------------------------------------------------------------* *…

Matplotlib面积图绘制秘籍:让你的数据‘膨胀’起来,但不吹泡泡哦!

1. 引言 嘿&#xff0c;数据迷们&#xff01;想不想让你的数据‘活’起来&#xff0c;跳一曲色彩斑斓的面积舞&#xff1f;Matplotlib面积图&#xff0c;不只是数字的堆砌&#xff0c;它是故事的讲述者&#xff0c;让复杂数据变得一目了然&#xff0c;还带点小幽默。快来一探究…

鸿蒙应用框架开发【首选项】 本地数据与文件

首选项 简介 本示例使用ohos.data.preferences接口&#xff0c;展示了使用首选项持久化存储数据的功能。 效果预览 使用说明 1.点击顶部titleBar的右侧切换按钮&#xff0c;弹出主题菜单&#xff0c;选择任意主题则切换相应的主题界面&#xff1b; 2.退出应用再重新进入&a…

C++客户端Qt开发——界面优化(美化登录界面)

美化登录界面 在.ui中拖入一个QFream&#xff0c;顶层窗口的QWidget无法设置背景图片&#xff0c;套上一层QFrame将背景图片设置到QFrame上即可 用布局管理器管理元素&#xff1a;用户名LineEdit&#xff0c;密码LineEdit&#xff0c;记住密码ComboBox&#xff0c;登录Button…

Windows本地构建镜像推送远程仓库

下载 Docker Desktop https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 使用本地docker构建镜像和推送至远程仓库&#xff08;harbor&#xff09; 1、开启docker的2375端口 2、配置远程仓库push镜像可以通过http harbor.soujer.com:5000ps&am…

【C语言】数据类型全解析:编程效率提升的秘诀

目录 C语言数据类型详解1. 基本数据类型1.1 整型示例代码输出结果 1.2 浮点型示例代码输出结果 1.3 字符型示例代码输出结果 2. 派生数据类型2.1 数组示例代码输出结果 2.2 指针示例代码输出结果 2.3 结构体示例代码输出结果 2.4 共用体示例代码输出结果 3. 类型限定符3.1 cons…

为什么Word中正文总会变成标题?

问题 选中文字之后点击正文&#xff0c;格式总是会自动变成标题&#xff0c;然后出现在目录中&#xff0c;改不掉。 方法 是因为段落样式的大纲级别设置了标题级别 选中识别成标题的正文&#xff0c;右键选择段落&#xff0c;把大纲级别设置成正文就好。

微信小程序云开发订单微信支付与小票和标签打印的完整高效流程

一个字“全”&#xff01;&#xff01;&#xff01; 前言一、流程设定1、如何开通云支付流程2、以订单下单为例的支付流程2.1 业务场景介绍2.2 业务场景流程图 二、代码与代码文件组成1、页面JS2、云函数payPre3、支付回调函数pay_cb3.1 准备条件3.2 必要认知3.3 pay_cb 完整函…