promethues+alertmanager+grafana监控宿主机和报警—基于consul的服务自动发现主机—详细文档
相关配套软件包网盘下载链接如下:
网盘地址: https://url28.ctfile.com/f/37115828-589234219-d1cf35?p=4907
访问密码: 4907
本人会经常更新运维相关技术文档,如有兴趣,可以关注我博客,欢迎互动分享
efk7.13.2搜集k8s各容器日志网盘地址: https://url28.ctfile.com/f/37115828-599686611-63bb79?p=4907
访问密码:4907
k8s-helm-51cto课程和笔记-v3版部署k8s集群网盘地址: https://url28.ctfile.com/f/37115828-599686627-f6a619?p=4907
访问密码:4907
阿里云开源插件log-pilot搜集k8s部署应用容器内日志网盘地址: https://url28.ctfile.com/f/37115828-599524530-7be0b5?p=4907
访问密码:4907
k8s重要资料51cto学习视频1和2网盘地址: https://url28.ctfile.com/f/37115828-599688102-7f7abb?p=4907
访问密码:4907
node节点安装node_exporter:(手动到各个节点安装node_exporter,node节点多时也可使用ansible-playbook批量安装)
机器:192.168.10.89 node_exporter被监控端 (web组-web1)
机器:192.168.10.90 node_exporter被监控端 (web组-web2)
机器:192.168.10.92 alertmanager、promethues、grafana、node_exporter被监控端 (db组)
consul是相当于一个中间件:各类型exporter连接consul将暴露的被监控端采集接口地址注册到consul,promethues连接consul获取各接口信息
0.安装consul服务:(在192.168.10.92上安装(哪个机器安装都可)docker安装,快速)
[root@nacos-nfs ~]# docker pull consul
[root@nacos-nfs ~]# docker run -d --name consul --net=host consul
[root@nacos-nfs ~]# docker images |grep consul
consul latest 94840f9c3d71 2 days ago 118MB
[root@nacos-nfs ~]# docker ps |grep consul
fb436ac64ae2 consul “docker-entrypoint.s…” 10 seconds ago Up 8 seconds consul
[root@nacos-nfs ~]# netstat -anput |grep 8500
tcp6 0 0 :::8500 ::😗 LISTEN 9666/consul
访问consul页面:http://192.168.10.92:8500
1.二进制安装node_exporter配置认证,并注册到consul(被监控宿主机安装3台),需要用户名和加密密码才能访问到node_exporter的数据
安装生成加密密码的工具:
yum -y install httpd-tools
htpasswd -nBC 12 ‘’ | tr -d ‘:\n’ #回车
New password: #输入要加密的明文密码: 123456
Re-type new password: #重复输入要加密的明文密码: 123456
$2y
12
12
12vckkSTR4nweF2zMq.GjRzuUNls9Ol5FOws/cMCUn77vY0AvdlUi76 #生成的加密密码保存起来
安装node_exporter:
ls node_exporter-1.3.1.linux-amd64.tar.gz
node_exporter-1.3.1.linux-amd64.tar.gz
tar -zxf node_exporter-1.3.1.linux-amd64.tar.gz
mv node_exporter-1.3.1.linux-amd64 /data/node_exporter
cd /data/node_exporter/
[root@nacos-nfs node_exporter]# ls
LICENSE node_exporter NOTICE
vim config.yml #配置node_exporter用户名和加密密码认证(也可不配置加密认证,无需添加此文件,启动也无需指定该文件)
basic_auth_users:
prometheus: $2y
12
12
12vckkSTR4nweF2zMq.GjRzuUNls9Ol5FOws/cMCUn77vY0AvdlUi76 #用户名: 加密密码
/data/node_exporter/node_exporter --web.config=/data/node_exporter/config.yml #可直接指定配置文件启动
交给systemd管理服务:
vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter daemon
[Service]
Restart=on-failure
ExecStart=/data/node_exporter/node_exporter --web.config=/data/node_exporter/config.yml
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start node_exporter
#systemctl enable node_exporter
#systemctl status node_exporter
● node_exporter.service - node_exporter daemon
Loaded: loaded (/usr/lib/systemd/system/node_exporter.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2022-04-09 21:33:05 CST; 7s ago
netstat -anput |grep 9100
tcp6 0 0 :::9100 ::😗 LISTEN 28801/node_exporter
浏览器通过用户名和密码访问node_exporter采集的数据: 另一个机器同样操作
http://192.168.10.89:9100/ http://192.168.10.90:9100/ http://192.168.10.92:9100/
输入用户名和密码: prometheus/123456
类似的访问90和92也是一样。
将node_exporter都注册到consul(3台被监控端,在哪个节点执行都行)
分别调用consul接口,将自己节点ip注册到consul:
#curl -X PUT -d ‘{“id”:“web-1”,“name”:“webservers”,“address”:“192.168.10.89”,“port”:9100,“tags”:[“service”],“checks”:[{“http”:“http://192.168.10.89:9100”,“interval”:“5s”}]}’ http://192.168.10.92:8500/v1/agent/service/register
#curl -X PUT -d ‘{“id”:“web-2”,“name”:“webservers”,“address”:“192.168.10.90”,“port”:9100,“tags”:[“service”],“checks”:[{“http”:“http://192.168.10.90:9100”,“interval”:“5s”}]}’ http://192.168.10.92:8500/v1/agent/service/register
#curl -X PUT -d ‘{“id”:“db-1”,“name”:“dbservers”,“address”:“192.168.10.92”,“port”:9100,“tags”:[“service”],“checks”:[{“http”:“http://192.168.10.92:9100”,“interval”:“5s”}]}’ http://192.168.10.92:8500/v1/agent/service/register
解释:
#“id”:“web-1”: #id是在consul中显示的名字,类似于promethues的每个实例instance(被监控端的ip:端口),起了一个名
#“name”:“webservers”: #name是在consul中显示的名字,类似于promethues的每个job分组(起一个名),一个分组下有多个实例,用于区别不同的项目进行分组,prometheus分组时可以根据该consul中的分组名,找到对应分组实例
#address":“192.168.10.89”,“port”:9100," #是在consul中显示的名字,每个实例的ip和node_exporter的端口
#“tags”:[“service”] #是在consul中显示的名字,注册的一个标签
#“checks”:[{“http”:“http://192.168.10.89:9100”,“interval”:“5s”}]} #健康检查
#http://192.168.10.92:8500/v1/agent/service/register #consul服务的接口地址
到consul页面查看:http://192.168.10.92:8500 (因为node_exporter设置了用户名和密码认证,所以显示不健康,这个没事,注册进去了就行)
注意:上面的安装node_exporter并注册到consul中,也可通过ansible-playbook实现,下面是使用ansible-playbook实现(效果一样)
机器:192.168.10.89 node_exporter被监控端 (web组-web1)
机器:192.168.10.90 node_exporter被监控端 (web组-web2)
机器:192.168.10.92 alertmanager、promethues、grafana、node_exporter被监控端 (db组)、ansible
在192.168.10.92上安装安装ansible,批量推送到其他机器: (先删除清空之前安装的node_exporter)
[root@nacos-nfs ~]# yum -y install epel-release
[root@nacos-nfs ~]# yum -y install ansible
[root@nacos-nfs ~]# vim /etc/ansible/ansible.cfg
host_key_checking = False #注释打开
[root@nacos-nfs ~]# mkdir ansible-playbook
[root@nacos-nfs ~]# cd ansible-playbook/
[root@nacos-nfs ansible-playbook]# vim hosts #创建主机列表文件并分组
[webservers]
192.168.10.89 name=web1
192.168.10.90 name=web2
[dbservers]
192.168.10.92 name=db1
[root@nacos-nfs ansible-playbook]# vim config.yml #创建node_exporter的认证文件
basic_auth_users:
prometheus: $2y
12
12
12vckkSTR4nweF2zMq.GjRzuUNls9Ol5FOws/cMCUn77vY0AvdlUi76
#配置node_exporter用户名和加密密码认证(也可不配置加密认证,无需添加此文件,启动也无需指定该文件)
#用户名: 加密密码 (promethues:123456)
[root@nacos-nfs ansible-playbook]# vim node_exporter.service #创建node_exporter开启自启文件
[Unit]
Description=node_exporter daemon
[Service]
Restart=on-failure
ExecStart=/data/node_exporter/node_exporter --web.config=/data/node_exporter/config.yml
[Install]
WantedBy=multi-user.target
[root@nacos-nfs ansible-playbook]# rz
上传node_exporter的二进制安装包
[root@nacos-nfs ansible-playbook]# ls node_exporter-1.3.1.linux-amd64.tar.gz
node_exporter-1.3.1.linux-amd64.tar.gz
[root@nacos-nfs ansible-playbook]# vim consul-register.sh #创建各个node_exporter注册到consul中的注册脚本
#!/bin/bash
service_group_name=$1
instance_id=$2
node_exporter_ip=$3
node_exporter_port=KaTeX parse error: Expected '}', got 'EOF' at end of input: …T -d '{"id":"'"instance_id"‘“,“name”:”’“
s
e
r
v
i
c
e
g
r
o
u
p
n
a
m
e
"
′
"
,
"
a
d
d
r
e
s
s
"
:
"
′
"
service_group_name"'","address":"'"
servicegroupname"′","address":"′"node_exporter_ip”‘",“port”:’“KaTeX parse error: Expected '}', got 'EOF' at end of input: …ttp":"http://'"node_exporter_ip”‘:’“KaTeX parse error: Expected 'EOF', got '}' at position 38: …"interval":"5s"}̲]}' http://192.…变量名”’
#service_group_name 分组的名,注册到consul里的分组名,即对应promethues的job的名,prometheus就是通过consul中该名进行区分分组的
#instance_id 注册到consul中的分组中各个机器的实例名,对应promethues中的targets里的实例名
[root@nacos-nfs ansible-playbook]# vim playbook-webservers.yaml
- hosts: webservers
gather_facts: no
vars:
node_exporter_port: 9100
tasks:- name: 推送node_exporter二进制文件
unarchive: src=node_exporter-1.3.1.linux-amd64.tar.gz dest=/data/ - name: 重命名
shell: |
cd /data/
if [ ! -d node_exporter ];then
mv node_exporter-1.3.1.linux-amd64 node_exporter
fi - name: 推送二node_exporter的配置文件
copy: src=config.yml dest=/data/node_exporter/ - name: 推送systemed文件
copy: src=node_exporter.service dest=/usr/lib/systemd/system/ - name: 重启node_exporter服务
systemd: name=node_exporter.service state=restarted enabled=yes daemon_reload=yes - name: 推送注册脚本
copy: src=consul-register.sh dest=/usr/local/bin/ - name: 注册当前node_expoter的节点到consul
服务名 实例名 node_eporter的IP node_exporter的端口
shell: /bin/bash /usr/local/bin/consul-register.sh {{ group_names[0] }} {{ name }} {{ inventory_hostname }} {{ node_exporter_port }}
#注释:
#group_names[0] group_names调用了ansible中的内置变量,即:ansbile的hosts中的分组名:webservers,dbservers等,因为是一个列表0表示获取第一个元素,即该文件中第一行的: webservers
#name: 调用了ansible中hosts文件里定义的变量,值为下面的web1,web2,db1等
#inventory_hostname: 调用了ansible中hosts文件里定义的主机ip,值为下面的:192.168.10.89,192.168.10.90,…
cat hosts
#[webservers]
#192.168.10.89 name=web1
#192.168.10.90 name=web2
#[dbbservers]
#192.168.10.92 name=db1
[root@nacos-nfs ansible-playbook]# vim playbook-dbservers.yaml
- name: 推送node_exporter二进制文件
- hosts: dbservers
gather_facts: no
vars:
node_exporter_port: 9100
tasks:- name: 推送node_exporter二进制文件
unarchive: src=node_exporter-1.3.1.linux-amd64.tar.gz dest=/data/ - name: 重命名
shell: |
cd /data/
if [ ! -d node_exporter ];then
mv node_exporter-1.3.1.linux-amd64 node_exporter
fi - name: 推送二node_exporter的配置文件
copy: src=config.yml dest=/data/node_exporter/ - name: 推送systemed文件
copy: src=node_exporter.service dest=/usr/lib/systemd/system/ - name: 重启node_exporter服务
systemd: name=node_exporter.service state=restarted enabled=yes daemon_reload=yes - name: 推送注册脚本
copy: src=consul-register.sh dest=/usr/local/bin/ - name: 注册当前node_expoter的节点到consul
服务名 实例名 node_eporter的IP node_exporter的端口
shell: /bin/bash /usr/local/bin/consul-register.sh {{ group_names[0] }} {{ name }} {{ inventory_hostname }} {{ node_exporter_port }}
#注释:
#group_names[0] group_names调用了ansible中的内置变量,即:ansbile的hosts中的分组名:webservers,dbservers等,因为是一个列表0表示获取第一个元素,即该文件中第一行的: dbservers
#name: 调用了ansible中hosts文件里定义的变量,值为下面的web1,web2,db1等
#inventory_hostname: 调用了ansible中hosts文件里定义的主机ip,值为下面的:192.168.10.89,192.168.10.90,…
cat hosts
#[webservers]
#192.168.10.89 name=web1
#192.168.10.90 name=web2
#[dbbservers]
#192.168.10.92 name=db1
[root@nacos-nfs ansible-playbook]# ls
config.yml consul-register.sh hosts node_exporter-1.3.1.linux-amd64.tar.gz node_exporter.service playbook-dbservers.yaml playbook-webservers.yaml
[root@nacos-nfs ansible-playbook]# ansible-playbook -i hosts playbook-webservers.yaml -uroot -k #部署webserver的node_exporter和注册到consul
SSH password: 输入对方主机密码Yzc.123 (若做了ssh-key免密登录则不需要)
[root@nacos-nfs ansible-playbook]# ansible-playbook -i hosts playbook-dbservers.yaml -uroot -k #部署dbserver的node_exporter和注册到consul
SSH password: 输入对方主机密码Yzc.123 (若做了ssh-key免密登录则不需要)
到两个webservers主机和dbservers主机查看node_exporter运行情况:(192.168.10.89、192.168.10.90和192.168.10.92)
ls /data/node_exporter/
config.yml LICENSE node_exporter NOTICE
systemctl status node_exporter
netstat -anput |grep 9100|grep LISTEN
tcp6 0 0 :::9100 ::😗 LISTEN 23848/node_exporter
到consul页面查看:http://192.168.10.92:8500 (因为node_exporter设置了用户名和密码认证,所以显示不健康,这个没事,注册进去了就行)
2.二进制安装alertmanager: (192.168.10.92)(邮箱使用qq邮箱靠谱点,163邮箱有时候不报警)
[root@nacos-nfs ~]# ls alertmanager-0.24.0.linux-amd64.tar.gz
alertmanager-0.24.0.linux-amd64.tar.gz
[root@nacos-nfs ~]# tar -zxf alertmanager-0.24.0.linux-amd64.tar.gz
[root@nacos-nfs ~]# mv alertmanager-0.24.0.linux-amd64 /data/alertmanager
[root@nacos-nfs ~]# cd /data/alertmanager/
[root@nacos-nfs alertmanager]# ls
alertmanager alertmanager.yml amtool LICENSE NOTICE
[root@nacos-nfs alertmanager]# cp alertmanager.yml alertmanager.yml.bak
[root@nacos-nfs alertmanager]# vim alertmanager.yml
global:
resolve_timeout: 1m
#配置邮箱服务器:
smtp_smarthost: ‘smtp.qq.com:25’
#配置发件人:
smtp_from: ‘1036981484@qq.com’
smtp_auth_username: ‘1036981484@qq.com’
#配置发件人的授权密码:
smtp_auth_password: ‘fwbxnmbfnrpvbedi’
smtp_require_tls: false
- name: 推送node_exporter二进制文件
#配置路由树:
route:
group_by: [‘alertname’] #根据告警规则组名进行分组,默认这里就是用alertname就可以了,可以精确到每一个告警规则,alertname的取值就是promethues中rules中自定义的告警规则的名称,根据触发情况取值会有所变动
group_wait: 10s #分组内第一个告警等待时间,10s内如有第二个告警会合并一个告警
group_interval: 10s #发送新告警间隔时间
repeat_interval: 10s #重复告警间隔发送时间
receiver: ‘mail’ #发送给哪个接收人,定义一个名字,具体接收人是谁,可以在下面的该名字下定义
receivers:
- name: ‘mail’
email_configs:- to: ‘1441107787@qq.com’
send_resolved: true #设置恢复时候也提醒恢复信息,默认是没有的
- to: ‘1441107787@qq.com’
[root@nacos-nfs alertmanager]# ./alertmanager --config.file=./alertmanager.yml #指定配置文件启动
交给systemed管理服务:
[root@nacos-nfs alertmanager]# vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager daemon
[Service]
Restart=on-failure
ExecStart=/data/alertmanager/alertmanager --config.file=/data/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
[root@nacos-nfs alertmanager]# systemctl daemon-reload
[root@nacos-nfs alertmanager]# systemctl enable alertmanager
[root@nacos-nfs alertmanager]# systemctl start alertmanager
[root@nacos-nfs alertmanager]# systemctl status alertmanager
● alertmanager.service - alertmanager daemon
Loaded: loaded (/usr/lib/systemd/system/alertmanager.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2022-04-10 17:43:02 CST; 4s ago
[root@nacos-nfs alertmanager]# netstat -anput |grep 9093
tcp6 0 0 :::9093 ::😗 LISTEN 30260/alertmanager
访问web界面如下:http://192.168.10.92:9093/
3.二进制安装promethues,配置基于文件自动发现,并测试告警(192.168.10.92上)
[root@nacos-nfs ~]# ls
prometheus-2.35.0-rc0.linux-amd64.tar.gz
[root@nacos-nfs ~]# tar -zxf prometheus-2.35.0-rc0.linux-amd64.tar.gz
[root@nacos-nfs ~]# ls
prometheus-2.35.0-rc0.linux-amd64 prometheus-2.35.0-rc0.linux-amd64.tar.gz
[root@nacos-nfs ~]# mv prometheus-2.35.0-rc0.linux-amd64 /data/prometheus
[root@nacos-nfs ~]# cd /data/prometheus/
[root@nacos-nfs prometheus]# ls
console_libraries consoles LICENSE NOTICE prometheus prometheus.yml promtool
[root@nacos-nfs prometheus]# cp prometheus.yml prometheus.yml.bak
[root@nacos-nfs prometheus]# vim prometheus.yml
global:
scrape_interval: 15s # 采集数据时间间隔
evaluation_interval: 15s # 评估的告警规则的时间间隔,每多少时间评估一次告警规则
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.10.92:9093 #当安装了alertmanager,需要告警时可以指定alertmanager的ip和端口,若不用告警则可注释该行.
#下面配置告警规则引用的文件:
rule_files:
- “rules/*.yml” #告警相关规则配置,不用可注释,rules是在promethues安装目录中创建一个rules目录
scrape_configs: #下面是被监控端的相关配置
# metrics_path defaults to '/metrics'
- job_name: “webservers” #每一个job_name可以认为是一个分组,一个分组可以在targets里定义多个监控的主机,相当于一个分组可以包含一批机器
basic_auth: #下面为连接node_exporter所需的用户名和密码
username: prometheus
password: 123456
consul_sd_configs:- server: 192.168.10.92:8500 #配置基于consul的自动发现,连接到consul即可
services: [‘webservers’] #serives:是固定格式,后面的webservers是node_exporter调用consul接口注册到consul时定义的分组名,和consul中分组名要一致
- server: 192.168.10.92:8500 #配置基于consul的自动发现,连接到consul即可
- job_name: “dbservers” #每一个job_name可以认为是一个分组,一个分组可以在targets里定义多个监控的主机,相当于一个分组可以包含一批机器
basic_auth: #下面为连接node_exporter所需的用户名和密码
username: prometheus
password: 123456
consul_sd_configs:- server: 192.168.10.92:8500 #配置基于consul的自动发现,连接到consul即可
services: [‘dbservers’] #serives:是固定格式,后面的webservers是node_exporter调用consul接口注册到consul时定义的分组名,和consul中分组名要一致
[root@nacos-nfs prometheus]# mkdir /data/prometheus/rules #创建配置告警规则目录
[root@nacos-nfs prometheus]# vim /data/prometheus/rules/general.yml #配置告警触发条件和告警规则
groups:
- server: 192.168.10.92:8500 #配置基于consul的自动发现,连接到consul即可
- name: general.rules #告警规则组名称
rules:- alert: InstanceDown #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
expr: up == 0 #基于promSQL的触发条件
for: 1m #等待评估时间,1分钟,就是满足触发条件后不直接发送告警到alertmanager,而是等待1分钟,若1分钟内一直是触发的才发送告警,任何实例1分钟内无法访问发出告警
labels: #自定义标签
severity: error
annotations: #指定附加信息
summary: “Instance {{ $labels.instance }} 停止工作”
description: “{{ $labels.instance }}: job {{ $labels.job }} 已经停止1分钟以上.”
[root@nacos-nfs prometheus]# vim /data/prometheus/rules/node.yml #配置告警触发条件和告警规则
groups:
- alert: InstanceDown #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
- name: node.rules #告警规则组名称
rules:- alert: NodeFilesystemUsage #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
expr: 100 - (node_filesystem_free_bytes{fstype=~“ext4|xfs”} / node_filesystem_size_bytes{fstype=~“ext4|xfs”} * 100) > 1 #这种就是在promethues中语句试验出来的报警语句,下面类似
for: 2m
labels:
severity: warning
annotations:
summary: “{{KaTeX parse error: Expected 'EOF', got '}' at position 16: labels.instance}̲}: {{labels.mountpoint }} 分区使用过高”
description: “{{KaTeX parse error: Expected 'EOF', got '}' at position 16: labels.instance}̲}: {{labels.mountpoint }} 分区使用大于 80% (当前值: {{ $value }})” - alert: NodeMemoryUsage #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
expr: 100 - (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 > 1
for: 2m
labels:
severity: warning
annotations:
summary: “{{KaTeX parse error: Expected 'EOF', got '}' at position 16: labels.instance}̲}: 内存使用过高" de…labels.instance}}: 内存使用大于 80% (当前值: {{ $value }})” - alert: NodeCPUUsage #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
expr: 100 - (avg(irate(node_cpu_seconds_total{mode=“idle”}[5m])) by (instance) * 100) > 1
for: 2m
labels:
severity: warning
annotations:
summary: “{{KaTeX parse error: Expected 'EOF', got '}' at position 16: labels.instance}̲}: CPU使用过高" d…labels.instance}}: CPU使用大于 80% (当前值: {{ $value }})”
[root@nacos-nfs prometheus]# ./promtool check config ./prometheus.yml #检查配置文件是否正确
Checking ./prometheus.yml
SUCCESS: ./prometheus.yml is valid prometheus config file syntax
[root@nacos-nfs prometheus]# /data/prometheus/prometheus --config.file=/data/prometheus/prometheus.yml #指定配置文件启动
交给systemed管理:
[root@nacos-nfs prometheus]# vim /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus daemon
[Service]
Restart=on-failure
ExecStart=/data/prometheus/prometheus --config.file=/data/prometheus/prometheus.yml
[Install]
WantedBy=multi-user.target
[root@nacos-nfs prometheus]# systemctl daemon-reload
[root@nacos-nfs prometheus]# systemctl enable Prometheus
[root@nacos-nfs prometheus]# systemctl start prometheus
[root@nacos-nfs prometheus]# systemctl status prometheus
● prometheus.service - Prometheus daemon
Loaded: loaded (/usr/lib/systemd/system/prometheus.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2022-04-09 23:35:06 CST; 6s ago
[root@nacos-nfs prometheus]# netstat -anput |grep 9090|grep LISTEN
tcp6 0 0 :::9090 ::😗 LISTEN 28970/prometheus
访问promethues: http://192.168.10.92:9090/
测试告警:
停止webserver组的node_exporter(192.168.10.89和192.168.10.90),查看告警情况:
systemctl stop node_exporter
查看promethues告警触发情况:
查看发送邮件情况:
4.二进制安装grafana:界面展示(192.168.10.92)
[root@nacos-nfs ~]# ls grafana-enterprise-8.4.5.linux-amd64.tar.gz
grafana-enterprise-8.4.5.linux-amd64.tar.gz
[root@nacos-nfs ~]# tar -zxf grafana-enterprise-8.4.5.linux-amd64.tar.gz
[root@nacos-nfs ~]# mv grafana-8.4.5/ /data/grafana
[root@nacos-nfs ~]# cd /data/grafana/
[root@nacos-nfs grafana]# ls
bin conf LICENSE NOTICE.md plugins-bundled public README.md scripts VERSION
[root@nacos-nfs grafana]# ls bin/
grafana-cli grafana-cli.md5 grafana-server grafana-server.md5
[root@nacos-nfs grafana]# /data/grafana/bin/grafana-server #即可启动grafana
交给systemed管理启动:
[root@nacos-nfs grafana]# vim /usr/lib/systemd/system/grafana.service
[Unit]
Description=grafana daemon
[Service]
Restart=on-failure
ExecStart=/data/grafana/bin/grafana-server -homepath=/data/grafana #指定安装目录启动
[Install]
WantedBy=multi-user.target
[root@nacos-nfs grafana]# systemctl start grafana
[root@nacos-nfs grafana]# systemctl status grafana
● grafana.service - grafana daemon
Loaded: loaded (/usr/lib/systemd/system/grafana.service; disabled; vendor preset: disabled)
Active: active (running) since Sat 2022-04-09 20:14:52 CST; 11s ago
[root@nacos-nfs grafana]# systemctl enable grafana
[root@nacos-nfs grafana]# netstat -anput |grep 3000
tcp6 0 0 :::3000 ::😗 LISTEN 28647/grafana-serve
访问grafana: http://192.168.10.92:3000 默认用户名和密码都是admin
添加promethues数据源:
导入node节点主机监控仪表盘,或者选择相应的id输入导入:
- alert: NodeFilesystemUsage #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
补充1:主机监控的告警规则补充(上面的规则太少,不够用,补充一下主机监控告警规则,下面基本全面了,其他不变)
[root@nacos-nfs ~]# cat /data/prometheus/rules/node.yml
groups:
- name: node.rules #告警规则组名称
rules:
#主机实例宕机-
alert: InstanceDown #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
expr: up == 0 #基于promSQL的触发条件,实例宕机
for: 1m #等待评估时间,1分钟,就是满足触发条件后不直接发送告警到alertmanager,而是等待1分钟,若1分钟内一直是触发的才发送告警,任何实例1分钟内无法访问发出告警
labels: #自定义标签
severity: error
annotations: #指定附加信息
summary: “Instance {{ $labels.instance }} 停止工作,实例宕机”
description: “{{ $labels.instance }}: job {{ $labels.job }} 已经停止1分钟以上.”
#node节点磁盘使用率高,>80% -
alert: NodeFilesystemUsage #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
expr: 100 - (node_filesystem_free_bytes{fstype=~“ext4|xfs”} / node_filesystem_size_bytes{fstype=~“ext4|xfs”} * 100) > 80 #这种是在promethues中语句试验出来的报警语句
#也可使用此表达式: (1-(node_filesystem_free_bytes{fstype=“ext4|xfs”,mountpoint!“.*tmp|.*boot” }/node_filesystem_size_bytes{fstype=“ext4|xfs”,mountpoint!“.*tmp|.*boot” }))*100 >80
for: 2m
labels:
severity: warning
annotations:
summary: “{{KaTeX parse error: Expected 'EOF', got '}' at position 16: labels.instance}̲}: {{labels.mountpoint }} 分区使用过高”
description: “{{KaTeX parse error: Expected 'EOF', got '}' at position 16: labels.instance}̲}: {{labels.mountpoint }} 分区使用大于 80% (当前值: {{ $value }})”
#node节点内存使用率高 >98% -
alert: NodeMemoryUsage #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
expr: 100 - (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 > 98
#也可使用类似表达式,不唯一: (1-((node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes)/node_memory_MemTotal_bytes))*100
for: 2m
labels:
severity: warning
annotations:
summary: “{{KaTeX parse error: Expected 'EOF', got '}' at position 16: labels.instance}̲}: 内存使用过高" de…labels.instance}}: 内存使用大于 80% (当前值: {{ $value }})”
#node节点cpu使用率高,>80% -
alert: NodeCPUUsage #自定义的告警规则名称,触发报警时该值就作为alertmanager.yml中定义的alertname的取值
expr: 100 - (avg(irate(node_cpu_seconds_total{mode=“idle”}[5m])) by (instance) * 100) > 80
#也可用类似表达式:不唯一 100- (sum(increase(node_cpu_seconds_total{mode=“idle”}[5m])) by (instance)/sum(increase(node_cpu_seconds_total[5m])) by (instance) *100) > 98
for: 2m
labels:
severity: warning
annotations:
summary: “{{KaTeX parse error: Expected 'EOF', got '}' at position 16: labels.instance}̲}: CPU使用过高" d…labels.instance}}: CPU使用大于 80% (当前值: {{ $value }})”
#node节点cpu的5分钟负载高, >10 -
alert: NodeCpuLoadHigh-5分钟内cpu负载高
expr: sum(node_load5) by (instance) > 10
for: 1m
labels:
severity: warning
annotations:
summary: “5分钟内cpu负载过高”
description: “主机{{$labels.instance}}: 5分钟内cpu负载高,超过10 (当前值: {{ $value }})”
#node节点磁盘IO_WAIT负载过高,磁盘繁忙,>10 -
alert: NodeIoWait-5分钟内磁盘IO_WAIT负载高
expr: ((sum(increase(node_cpu_seconds_total{mode=“iowait”}[5m])) by (instance))/(sum(increase(node_cpu_seconds_total[5m])) by (instance))) * 100 > 10
for: 1m
labels:
severity: warning
annotations:
summary: “5分钟内磁盘IO_WAIT负载过高”
description: “主机{{$labels.instance}}: 5分钟内磁盘io_wait负载过高,超过10 (当前值: {{ $value }})”
#主机ESTABLISHED连接数过高,>1000 -
alert: NodeNetworkConnection-ESTABLISHED-主机TCP连接数过高
expr: sum(node_netstat_Tcp_CurrEstab) by (instance) > 1000
for: 1m
labels:
severity: warning
annotations:
summary: “主机ESTABLISHED连接数过高”
description: “主机{{$labels.instance}}: 主机ESTABLISHED连接数过高,大于1000, (当前值: {{ $value }})”
#主机网卡入口流量过高,>100M/s(单位:字节/秒),每秒网卡接收多少字节数据,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值 -
alert: NodeNetworkThroughputIn-主机网络接收流量速率(流入速率)
expr: sum by (instance, device) (rate(node_network_receive_bytes_total{device=~“ens.*”}[2m])) / 1024 / 1024 > 100
for: 1m
labels:
severity: ‘warning’
annotations:
summary: “主机网卡入口流量过高”
description: “主机: {{ $labels.instance }}, 网卡: {{ $labels.device }} 入口流量高 (> 100 MB/s), 当前值: {{ $value }}”
#主机网卡出口流量过高,>100M/s(单位:字节/秒),每秒网卡流出(发送)多少字节数据,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签 -
alert: NodeNetworkThroughputTransmit-主机网络传输流量速率(流出速率)
expr: sum by (instance, device) (rate(node_network_transmit_bytes_total{device=~“ens.*”}[2m])) / 1024 / 1024 > 100
for: 1m
labels:
severity: ‘warning’
annotations:
summary: “主机网卡出口流量过高”
description: “主机: {{ $labels.instance }}, 网卡: {{ $labels.device }} 出口流量高 (> 100 MB/s), 当前值: {{ $value }}”
#主机文件系统磁盘读取速率高,>50M/s(单位:字节/秒),每秒读取多少字节,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值 -
alert: NodeDiskReadRate-主机文件系统磁盘读取速率
expr: sum by (instance, device) (rate(node_disk_read_bytes_total{device=~“sd.*”}[2m])) / 1024 / 1024 > 50
for: 1m
labels:
severity: ‘warning’
annotations:
summary: “主机磁盘读取速率过高”
description: “主机: {{ $labels.instance }}, 磁盘: {{ $labels.device }} 读取速度过高(>50 MB/s), 当前值: {{ $value }}”
#主机文件系统磁盘写入速率高,>50M/s(单位:字节/秒),每秒写入多少字节,下面除以两个1024转换为M单位,by (标签):按主机实例,容器名,网卡接口划分,划分后,下面才能调用标签的值 -
alert: NodeDiskReadWrite-主机文件系统磁盘写入速率
expr: sum by (instance, device) (rate(node_disk_written_bytes_total{device=~“sd.*”}[2m])) / 1024 / 1024 > 50
for: 1m
labels:
severity: ‘warning’
annotations:
summary: “主机磁盘写入速率过高”
description: “主机: {{ $labels.instance }}, 磁盘: {{ $labels.device }} 写入速度过高(>50 MB/s), 当前值: {{ $value }}”
#主机分区Inode节点不足,可用百分比<10% -
alert: NodeOutOfInodes-主机分区Inode节点不足
expr: node_filesystem_files_free{fstype=“ext4|xfs”,mountpoint!“.*tmp|.*boot” } / node_filesystem_files{fstype=“ext4|xfs”,mountpoint!“.*tmp|.*boot” } * 100 < 10
for: 1m
labels:
severity: ‘warning’
annotations:
summary: “主机分区Inode节点不足”
description: “主机: {{ $labels.instance }} {{ $labels.mountpoint }}分区inode节点不足,可用百分比小于10% 当前值:{{ $value }}%)”
#下面两项是监控主机磁盘读写延迟的,一般不会延迟,所以一般很难测出来,只有遇到故障时才能体现出来,配置上监控即可,不用测试报警: -
alert: HostUnusualDiskReadLatency
expr: rate(node_disk_read_time_seconds_total{device=~“sd."}[1m]) / rate(node_disk_reads_completed_total{device=~"sd.”}[1m]) > 0.1 and rate(node_disk_reads_completed_total{device=~“sd.*”}[1m]) > 0
for: 2m
labels:
severity: ‘warning’
annotations:
title: “主机磁盘Read延迟过高”
description: “主机: 【{{ $labels.instance }}】, 磁盘: {{ $labels.device }} Read延迟过高 (read operations > 100ms), 当前延迟值: {{ $value }}ms” -
alert: HostUnusualDiskWriteLatency
expr: rate(node_disk_write_time_seconds_total{device=~“sd."}[1m]) / rate(node_disk_writes_completed_total{device=~"sd.”}[1m]) > 0.1 and rate(node_disk_writes_completed_total{device=~“sd.*”}[1m]) > 0
for: 2m
labels:
severity: ‘warning’
annotations:
title: “主机磁盘Write延迟过高”
description: “主机: 【{{ $labels.instance }}】, 磁盘: {{ $labels.device }} Write延迟过高 (write operations > 100ms), 当前延迟值: {{ $value }}ms”
#主机的普罗米修斯监控参考链接:
#链接1:主机,mysql,es,redis,网站等详细:
#https://blog.csdn.net/wangshui898/article/details/120321640?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5-120321640-blog-122500343.pc_relevant_without_ctrlist_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-5-120321640-blog-122500343.pc_relevant_without_ctrlist_v2&utm_relevant_index=9
#链接2:(感觉不是很好,可做参考):https://blog.csdn.net/weixin_43815140/article/details/119730821
-
补充2:主机监控的邮件告警内容自定义模板,其他不变(上面没有配置自定义模板,会使用默认内置模板,显示内容不友好)
[root@nacos-nfs ~]# vim /data/alertmanager/alertmanager.yml #修改alertmanager的配置文件
global:
resolve_timeout: 1m
#配置邮箱服务器:
smtp_smarthost: ‘smtp.qq.com:25’
#配置发件人:
smtp_from: ‘1036981484@qq.com’
smtp_auth_username: ‘1036981484@qq.com’
#配置发件人的授权密码:
smtp_auth_password: ‘fwbxnmbfnrpvbedi’
smtp_require_tls: false
#添加下面:
templates:
- ‘/data/alertmanager/templates/*.tmpl’ #定义模板路径
#配置路由树:
route:
group_by: [‘alertname’] #根据告警规则组名进行分组,默认这里就是用alertname就可以了,可以精确到每一个告警规则,alertname的取值就是promethues中rules中自定义的告警规则的名称,根据触发情况取值会有所变动
group_wait: 10s #分组内第一个告警等待时间,10s内如有第二个告警会合并一个告警
group_interval: 10s #发送新告警间隔时间
repeat_interval: 10s #重复告警间隔发送时间
receiver: ‘mail’ #发送给哪个接收人,定义一个名字,具体接收人是谁,可以在下面的该名字下定义
receivers:- name: ‘mail’
email_configs:- to: ‘1441107787@qq.com’
send_resolved: true #设置恢复时候也提醒恢复信息,默认是没有的
#添加下面:
html: ‘{{ template “email.template.tmpl” . }}’ #配置调用哪个模板
- to: ‘1441107787@qq.com’
- name: ‘mail’
[root@nacos-nfs ~]# mkdir /data/alertmanager/templates #创建自定义报警模板路径
[root@nacos-nfs ~]# vim /data/alertmanager/templates/email.template.tmpl #编写自定义报警模板
{{ define “email.template.tmpl” }}
{{- if gt (len .Alerts.Firing) 0 -}}{{ range.Alerts }}
告警名称: {{ .Labels.alertname }}
实例名: {{ .Labels.instance }}
摘要: {{ .Annotations.summary }}
详情: {{ .Annotations.description }}
级别: {{ .Labels.severity }}
开始时间: {{ (.StartsAt.Add 28800e9).Format “2006-01-02 15:04:05” }}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}{{ range.Alerts }}
Resolved-告警恢复了。
告警名称: {{ .Labels.alertname }}
实例名: {{ .Labels.instance }}
摘要: {{ .Annotations.summary }}
详情: {{ .Annotations.description }}
级别: {{ .Labels.severity }}
开始时间: {{ (.StartsAt.Add 28800e9).Format “2006-01-02 15:04:05” }}
恢复时间: {{ (.EndsAt.Add 28800e9).Format “2006-01-02 15:04:05” }}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++
{{ end }}{{ end -}}
{{- end }}
[root@nacos-nfs ~]# systemctl restart alertmanager
重新将node主机监控的规则参数阀值调低一些,举几个例子(将磁盘使用率,内存使用率,cpu使用率,cpu5分钟负载阀值调为0)
[root@nacos-nfs ~]# vim /data/prometheus/rules/node.yml
将相关阀值调为0
[root@nacos-nfs ~]# systemctl restart prometheus
测试报警:
查看报警邮件内容:
当阀值调整为正常,报警恢复时,恢复邮件模板内容如下:
相关配套软件包网盘下载链接如下:
网盘地址: https://url28.ctfile.com/f/37115828-589234219-d1cf35?p=4907
访问密码: 4907