promethues+alertmanager+grafana监控宿主机和报警—基于consul的服务自动发现主机—详细文档

本文档详细介绍了如何使用Prometheus、Alertmanager和Grafana监控宿主机,并基于Consul实现服务自动发现。内容涵盖Consul的安装、node_exporter的配置与认证、服务注册到Consul以及Ansible自动化部署。同时,文档还涉及了Prometheus的告警规则设置和Alertmanager的邮件告警模板定制。
摘要由CSDN通过智能技术生成

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
  • 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

#配置路由树:
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 #设置恢复时候也提醒恢复信息,默认是没有的

[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中分组名要一致
  • 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:
  • 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:
  • 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输入导入:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

补充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” . }}’ #配置调用哪个模板

[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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维实战课程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值