区别
监控 | Zabbix | Prometheus |
---|---|---|
数据采集 | zabbix-agent,自定义key | 第三方单一功能exporter |
数据存储 | 第三方数据库,例如mysql | Prometheus自带TSDB |
数据展示 | zaibbix-server的PHP页面,需要LNP | 自身PromQL,第三方可视化工具Grafana |
告警 | zabbix-server(报警媒介、触发器、动作) | 第三方告警工具Alertmanager(Prometheus告警规则、路由、接收器) |
Zabbix 10051
- 被监控主机zabbix-agent采集数据——》(主动或被动)发送给服务端zabbix-server——》数据库存储数据,php页面展示数据。
规模 | 平台 | CPU/内存 | 数据库 | 受监控的主机数量 |
---|---|---|---|---|
小 型 | CentOS | Virtual Appliance | MySQL InnoDB | 100 |
中 型 | CentOS | 2 CPU cores/2GB | MySQL InnoDB | 500 |
大 型 | RedHat Enterprise Linux | 4 CPU cores/8GB | RAID10 MySQL InnoDB 或 PostgreSQL | >1000 |
极 大 型 | RedHat Enterprise Linux | 8 CPU cores/16GB | Fast RAID10 MySQL InnoDB 或 PostgreSQL | >10000 |
部署Zabbix监控端 10051
+ Zabbix集成了Cacti和Nagios的优点,是一个高度集成的监控解决方案,可以实现企业级的开源分布式监控。它提供了一个可扩展且灵活的平台网站,用于监控各种硬件设备、操作系统、网络设备、数据库、应用程序以及其他关键业务指标。
+ 实施监控的几个方面:
+ 数据采集(被监控端):被监控对象是操作系统则安装zabbix-agent(软件),是网络设备则配置SNMP(简单网络管理协议)。
+ 数据存储(监控端):使用数据库存储监控数据。
+ 数据展示(监控端):通过Web页面呈现监控情况(需要部署LNMP)。
+ 监控端安装`zabbix.server`,在被监控端上安装`zabbix.agent`来被采集数据,将数据存储到监控端的Mysql数据库,通过监控端的监控网站进行图形化呈现。
+ Zabbix软件分为zabbix-server(监控端)与zabbix-agent(被监控端)。
+ Zabbix的页面是php,需要部署LNMP。依赖包括nginx和php
+ Zabbix官网下载软件包:https://www.zabbix.com/cn/download
+ 软件要下载带LTS字样的(long term support,长期支持版),有漏洞官方会发布补丁。
+ 中文手册:https://www.zabbix.com/documentation/6.0/zh
假设Zabbix-server没有启动,监控网页也能运行和查看已有的数据库数据,但不会有新增数据。
zabbix服务器的搭建:
1. 准备Zabbix相关软件并存储在YUM仓库:
zabbix-server-mysql、zabbix-web-mysql、zabbix-nginx-conf、zabbix-sql-scripts、zabbix-selinux-policy、
fping、zabbix-web、zabbix-web-deps、zabbix-agent、zabbix-get、
nginx、php、php-fpm、php-mysqlnd、mysql-server
2. 安装Zabbix相关软件:
zabbix-server-mysql、zabbix-web-mysql、zabbix-nginx-conf、zabbix-sql-scripts、zabbix-selinux-policy
(依赖包括fping、zabbix-web、zabbix-web-deps、nginx、php、php-fpm、php-mysqlnd)
3. 安装并部署数据库,将zabbix提供的sql文件导入数据库中
4. 配置zabbix-server连接数据库
5. 配置nginx,修改端口8080展示zabbix
6. 启动服务:zabbix-server、nginx、php-fpm
7. 访问监控网页进行初始化
1. 准备软件并存储在YUM仓库
YUM仓库:
[root@yum ~]# ls /var/ftp/zabbix/
fping-3.16-1.el8.x86_64.rpm
zabbix-agent-6.0.11-release1.el8.x86_64.rpm
zabbix-get-6.0.12-release1.el8.x86_64.rpm
zabbix-nginx-conf-6.0.11-release1.el8.noarch.rpm
zabbix-selinux-policy-6.0.11-release1.el8.x86_64.rpm
zabbix-server-mysql-6.0.11-release1.el8.x86_64.rpm
zabbix-sql-scripts-6.0.11-release1.el8.noarch.rpm
zabbix-web-6.0.11-release1.el8.noarch.rpm
zabbix-web-deps-6.0.11-release1.el8.noarch.rpm
zabbix-web-mysql-6.0.11-release1.el8.noarch.rpm
repodata
Zabbix服务器(192.168.88.111):
2. 安装zabbix相关软件,
[root@zabbix ~]# dnf install -y zabbix-server-mysql zabbix-web-mysql zabbix-nginx-conf zabbix-sql-scripts zabbix-selinux-policy
[root@zabbix ~]# id zabbix
uid=994(zabbix) gid=991(zabbix) groups=991(zabbix)
[root@zabbix ~]# rpm -q nginx php-fpm php-mysqlnd # 依赖包含nginx和php
nginx-1.14.1-9.module+el8.4.0+542+81547229.x86_64
php-fpm-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64
php-mysqlnd-7.2.24-1.module+el8.4.0+413+c9202dda.x86_64
[root@zabbix ~]# id nginx
uid=995(nginx) gid=992(nginx) groups=992(nginx)
3. 部署数据库,建库、创用户、赋权、导入数据
[root@zabbix ~]# dnf install -y mysql-server langpacks-zh_CN
[root@zabbix ~]# systemctl enable mysqld.service --now
# 设置全局变量log_bin_trust_function_creators的值为1,允许将创建、修改或删除函数的语句记录在二进制日志中,允许不具备SUPER权限的用户创建具有非确定性行为的存储函数。默认值0不允许。
[root@zabbix ~]# mysql -e "set global log_bin_trust_function_creators = 1;"
[root@zabbix ~]# mysql -e "create database zabbix character set utf8mb4 collate utf8mb4_bin;"
[root@zabbix ~]# mysql -e "create user zabbix@localhost identified by 'zabbix';"
[root@zabbix ~]# mysql -e "grant all on zabbix.* to zabbix@localhost;"
[root@zabbix ~]# mysql -uzabbix -pzabbix -hlocalhost zabbix
mysql> ^DBye // 成功进入数据库,Cttl+D退出数据库
[root@zabbix ~]# rpm -ql zabbix-sql-scripts | grep server.sql.gz # sql文件
/usr/share/zabbix-sql-scripts/mysql/server.sql.gz
/usr/share/zabbix-sql-scripts/postgresql/server.sql.gz
[root@zabbix ~]# zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql --default-character-set=utf8mb4 zabbix -uzabbix -pzabbix
4. 配置zabbix-server连接数据库
[root@zabbix ~]# vim /etc/zabbix/zabbix_server.conf
129 DBPassword=zabbix // 解除注释,设置密码
[root@zabbix ~]# grep -n '^[A-Z]' /etc/zabbix/zabbix_server.conf
38:LogFile=/var/log/zabbix/zabbix_server.log
49:LogFileSize=0
72:PidFile=/var/run/zabbix/zabbix_server.pid
82:SocketDir=/var/run/zabbix
105:DBName=zabbix
121:DBUser=zabbix
129:DBPassword=zabbix
391:SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
515:Timeout=4
601:LogSlowQueries=3000
716:StatsAllowedIP=127.0.0.1
5. 配置nginx,修改端口
[root@zabbix ~]# vim /etc/nginx/conf.d/zabbix.conf
2 listen 8080; // 解除注释,修改端口
3 server_name example.com; // 解除注释
6. 启服务
[root@zabbix ~]# systemctl enable zabbix-server.service nginx.service php-fpm.service --now
[root@zabbix ~]# ss -ntul | egrep -w '10051|3306|8080'
tcp LISTEN 0 128 0.0.0.0:10051 0.0.0.0:*
tcp LISTEN 0 128 0.0.0.0:8080 0.0.0.0:*
tcp LISTEN 0 128 [::]:10051 [::]:*
tcp LISTEN 0 128 *:3306 *:*
7. 网页初始化
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
监控主机 10050
- 监控任意主机步骤:被监控主机安装zabbix-agent、配置、启服务——》监控网页添加主机、关联模板
zabbix监控任意linux主机步骤:
1. 被监控的主机安装zabbix-agent、配置、启服务
2. 监控网页创建主机,指定主机的主机名和IP地址、端口
3. 监控网页创建模板,定义需要监控的指标,主机应用模板开始监控
4. 如果在监控网页的配置无法生效,重启zabbix-server
1. 部署zabbix-agent
任意被监控主机(192.168.88.5):
[root@client ~]# yum install -y zabbix-agent
[root@client ~]# vim /etc/zabbix/zabbix_agentd.conf
117 Server=127.0.0.1,192.168.88.111 // 修改该行。zabbix agent被动报告数据的目标IP地址
125 # ListenPort=10050 // zabbix agent默认端口10050
172 ServerActive=127.0.0.1 // zabbix agent主动汇报数据的目标IP地址
182 Hostname=主机名 // 修改该行。被zabbix-server识别的代表本zabbix-agent的唯一标识ID,用于主动监控,建议同主机名
[root@client ~]# systemctl enable zabbix-agent.service --now
[root@client ~]# ss -ntul | grep 10050
tcp LISTEN 0 128 0.0.0.0:10050 0.0.0.0:*
tcp LISTEN 0 128 [::]:10050 [::]:*
2. 监控网页添加主机、关联模板
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
+ "配置"——》"主机"——》右上角"创建主机":"主机名称"自定义,一般同主机名,'Interfaces'选择"客户端"
如果主机的ZBX没有变绿,可以重启zabbix-server
中文乱码修复
// 中文乱码修复
Zabbix服务器(192.168.88.111):
// 查看字体
// 指定字体的配置文件
[root@zabbix ~]# less /usr/share/zabbix/include/defines.inc.php
define('ZBX_FONTPATH', realpath('assets/fonts')); // where to search for font (GD > 2.0.18)
define('ZBX_GRAPH_FONT_NAME', 'graphfont'); // font file name
// 字体文件的路径
[root@zabbix ~]# ll /usr/share/zabbix/assets/fonts/graphfont.ttf
lrwxrwxrwx 1 root root 33 Oct 30 14:23 /usr/share/zabbix/assets/fonts/graphfont.ttf -> /etc/alternatives/zabbix-web-font
[root@zabbix ~]# ll /etc/alternatives/zabbix-web-font
lrwxrwxrwx 1 root root 38 Oct 30 14:23 /etc/alternatives/zabbix-web-font -> /usr/share/fonts/dejavu/DejaVuSans.ttf
[root@zabbix ~]# ll /usr/share/fonts/dejavu/DejaVuSans.ttf
-rw-r--r-- 1 root root 756072 May 17 2015 /usr/share/fonts/dejavu/DejaVuSans.ttf
// 修改字体
// 准备字体
[root@zabbix ~]# ls FZZHJW.TTF
FZZHJW.TTF
// 方式一:修改配置文件
[root@zabbix ~]# vim /usr/share/zabbix/include/defines.inc.php
define('ZBX_GRAPH_FONT_NAME', 'FZZHJW'); // font file name
[root@zabbix ~]# cp FZZHJW.TTF /usr/share/zabbix/assets/fonts/FZZHJW.ttf
// 方式二:替换链接指向
[root@zabbix ~]# cp cp FZZHJW.TTF /usr/share/fonts/
[root@zabbix ~]# ln -s /usr/share/fonts/FZZHJW.TTF /etc/alternatives/zabbix-web-font
// 方式三:替换目标字体
[root@zabbix ~]# mv /usr/share/fonts/dejavu/DejaVuSans.ttf{,.bak}
[root@zabbix ~]# cp FZZHJW.TTF /usr/share/fonts/dejavu/DejaVuSans.ttf
此时,刷新监控网页 http://192.168.88.111:8080,中文不乱码
配置文件
服务端
说明 | 目录或文件 |
---|---|
配置文件 | /etc/zabbix/zabbix_server.conf |
日志文件 | LogFile=/var/log/zabbix/zabbix_server.log |
systemctl.service | /usr/lib/systemd/system/zabbix-server.service |
用于实现告警的脚本的目录 | /usr/lib/zabbix/alertscripts/ |
zbx服务端配置文件详解 /etc/zabbix/zabbix_server.conf | 说明 |
---|---|
ListenPort=10051 | 服务端端口 |
LogFile=/var/log/zabbix/zabbix_server.log | 日志文件 |
DBHost=localhost | 数据库地址 |
DBName=zabbix | 数据库名字 |
DBUser=zabbix | 数据库用户名 |
DBPassword=zabbix | 数据库密码 |
Timeout=4 | 超时时间 |
客户端
区别 | zabbix-agent | zabbix-agent2 |
---|---|---|
开发语言 | C语言 | Go语言和C语言 |
性能 | 独立进程方式运行 | 1个进程多线程技术运行,减少资源消耗,占用较少tcp资源,能够承受更高并发 |
说明 | 目录或文件 |
---|---|
配置文件 | /etc/zabbix/zabbix_agent.conf 或 /etc/zabbix/zabbix_agent2.conf |
子配置文件 | /etc/zabbix/zabbix_agent.d/ 或 /etc/zabbix/zabbix_agent2.d/ |
日志文件 | /var/log/zabbix/zabbix_agentd.log |
systemctl.service | /usr/lib/systemd/system/zabbix-agent.service 或 /usr/lib/systemd/system/zabbix-agent2.service |
zbx客户端主配置文件详解/etc/zabbix/zabbix_agent.conf | 说明(默认是被动监控,主动监控无需监听端口) |
---|---|
Server=127.0.0.1,IP地址,IP地址 | zabbix-agent被动报告数据的目标IP地址(被动监控) |
ListenPort=10050 | zabbix-agent被动监控监听的端口 |
StartAgents=数字 | zabbix-agent进程的最大数量,默认为3。为0时禁用被动监控。 |
ServerActive=127.0.0.1,IP地址,IP地址 | zabbix-agent主动汇报数据的目标IP地址(主动监控)省略端口默认10051 |
Hostname=主机名 | 被zabbix-server识别的代表本zabbix-agent的唯一标识ID,用于主动监控,建议同主机名 |
RefreshActiveChecks=秒数 | 主动汇报的时间间隔 |
自定义监控 UserParameter
- https://www.zabbix.com/documentation/4.0/zh/manual/config/items/itemtypes/zabbix_agent
- https://www.zabbix.com/documentation/4.0/zh/manual/config/items/itemtypes/zabbix_agent/win_keys
自定义监控流程:
1. 被监控主机,通过命令、脚本得到对应的值(也可以使用zbx内置的key)
2. 被监控主机,书写zabbix-agent配置文件,创建key,获取主机数据
3. 被监控主机,重启zabbix-agent,测试key是否可用
4. zabbix服务器,测试zabbix-agent的key是否可用
5. zabbix监控网页,模板创建监控项关联zabbix-agent的key,主机应用模板。注意,如果主机本身没有该key则无法获取。
+ "配置"——》"模板"——》右上角"创建模板"
+ "配置"——》"模板"——》查找具体模板的"名称"——》"监控项"——》右上角"创建监控项":"名称"是监控网页自定义监控项名称,"键值"是被监控端自定义的key名称。历史数据的数量决定于更新间隔,不建议保留太久30d占用空间,趋势数据是在历史数据的基础上增大间隔,建议比历史数据保留时间长3650d。"测试"Get value测试Key,Get value and test测试监控项。
+ "配置"——》"主机"——》单击主机名称进入配置,应用模板
# 自定义键值的格式
`/etc/zabbix/zabbix_agentd.conf` 中 `Include=/etc/zabbix/zabbix_agentd.d/*.conf`
]# vim /etc/zabbix/zabbix_agentd.d/任意取名.conf
UserParameter=key,cmd
# key是自定义key名称,多单词用`.`分隔
# cmd是有输出结果的命令或脚本
# 客户端测试键值
]# zabbix_agent -t key名称
# 监控端测试键值
]# yum install -y zabbix-get
]# zabbix_get -s 客户端IP地址 -p 端口 -k key名称 // 端口省略默认10050
// 自定义监控
被监控主机(192.168.88.5):查看用户数量
1. 被监控主机,通过命令、脚本得到对应的值
命令方式:
[root@client ~]# sed -n '$=' /etc/passwd
脚本方式:
[root@client ~]# echo "#!/bin/bash" > /root/user_num.sh
[root@client ~]# echo "sed -n '$=' /etc/passwd" >> /root/user_num.sh
[root@client ~]# bash /root/user_num.sh
2. 被监控主机,书写zabbix-agent配置文件,创建key,获取主机数据
命令方式:
[root@client ~]# cat /etc/zabbix/zabbix_agentd.d/user_num.conf
UserParameter=user.num,sed -n '$=' /etc/passwd
脚本方式:
[root@client ~]# cat /etc/zabbix/zabbix_agentd.d/user_num.conf
UserParameter=user.num,bash /root/user_num.sh
3. 被监控主机,重启zabbix-agent,测试key是否可用
[root@client ~]# systemctl restart zabbix-agent.service
[root@client ~]# zabbix_agentd -t user.num
user.num [t|23] // 具体含义 man zabbix_agentd
Zabbix服务器(192.168.88.111):
4. zabbix服务器,测试key是否可用
[root@zabbix ~]# yum install -y zabbix-get
[root@zabbix ~]# zabbix_get -s 192.168.88.5 -k user.num
23
5. zabbix监控网页,模板创建监控项关联key,主机应用模板
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
+ "配置"——》"模板"——》右上角"创建模板"
+ "配置"——》"模板"——》查找具体模板的"名称"——》"监控项"——》右上角"创建监控项":"名称"是监控网页自定义监控项名称,"键值"是被监控端自定义的key名称。历史数据的数量决定于更新间隔,不建议保留太久30d占用空间,趋势数据是在历史数据的基础上增大间隔,建议比历史数据保留时间长3650d。"测试"Get value测试Key,Get value and test测试监控项。
+ "配置"——》"主机"——》单击主机名称进入配置,应用模板
自定义监控(带参数)
// 自定义监控(带参数)
被监控主机(192.168.88.5):
[root@client ~]# cat /etc/zabbix/zabbix_agentd.d/lastlog.conf
# 没有传参,awk正常使用
UserParameter=root.login.check,lastlog -u root | tail -1 | awk '{print $3}'
# [*]传参,`$数字`使用参数,awk取列使用`$$数字`
UserParameter=user.login.check[*],lastlog -u $1 | tail -1 | awk '{print $$3}'
# [*]可以传递多个参数
UserParameter=test.print[*],echo "$1 $2 $3"
[root@client ~]# systemctl restart zabbix-agent.service
[root@client ~]# zabbix_agentd -t root.login.check
root.login.check [t|192.168.88.254]
[root@client ~]# zabbix_agentd -t user.login.check[root]
user.login.check[root] [t|192.168.88.254]
[root@client ~]# zabbix_agentd -t test.print[root,tomcat,nginx]
test.print[root,tomcat,nginx] [t|root tomcat nginx]
Zabbix服务器(192.168.88.111):
[root@zabbix ~]# zabbix_get -s 192.168.88.5 -k root.login.check
192.168.88.254
[root@zabbix ~]# zabbix_get -s 192.168.88.5 -k user.login.check[root]
192.168.88.254
[root@zabbix ~]# zabbix_get -s 192.168.88.5 -k test.print[nginx,tomcat,root]
nginx tomcat root
zabbix监控网页,模板创建监控项关联key,主机应用模板
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
+ "配置"——》"模板"——》查找具体模板的"名称"——》"监控项"——》右上角"创建监控项":"名称"是监控网页自定义监控项名称,"键值"`user.login.check[root]`,"信息类型"选择字符串
+ "配置"——》"主机"——》单击主机名称进入配置,应用模板
监控网页设置触发器
- 触发器是用于监控指标并在满足特定条件时触发告警的组件。当监控到的指标满足特定条件时,触发器会将主机的状态设置为"PROBLEM",并触发相应的告警动作。
创建触发器
# 监控网页设置触发器
+ "配置"——》"模板"——》查找具体模板的"名称"——》"触发器"——》右上角"创建触发器":"名称"是监控网页自定义触发器名称,"表达式"满足条件时触发器生效,勾选"允许手动关闭"
表达式格式
zbx 6.0的格式:last(/主机名/key名称) 比较符 值
函数last()表示最新的值,last(,#数字)表示最近第几次的值
例如:`last{/client/user.num} < 10`:表示条件为倒数第一次(最近一次)的值小于10
`last{/client/user.num,#1} <> last{/client/user.num,#2}`:表示条件为倒数第一次的值不等于倒数第二次的值
zbx 5.x及之前的格式:{ 主机名:key名称.函数 } 比较符 值
例如:{ client:user.num.last() } < 10
常见触发器函数
触发器函数(功能) | 作用 |
---|---|
last() 、last(, #数字) | 最近值。#数字 表示最近第几次,省略默认为#1 ,注意#数字 与) 之间无空格 |
nodata() | 是否有数据 |
diff() | 是否发生变化,一般配合md5check() |
avg() | 平均值 |
min() | 最小值 |
max() | 最大值 |
// 举例
last(/client/vfs.file.cksum[/etc/passwd,sha256],#1) <> last(/client/vfs.file.cksum[/etc/passwd,sha256],#2)
最近5分钟可用内存小于指定的值,and并且内存大小大于0
max(/client/vm.memory.size[available],5m) < {$MEMORY.AVAILABLE.MIN} and last(/client/vm.memory.size[total]) > 0
实例:异地登陆
# 实例:异地登陆
被监控主机(192.168.88.5):
[root@client ~]# cat /etc/zabbix/zabbix_agentd.d/lastlog.conf
UserParameter=user.login.check[*],lastlog -u $1 | tail -1 | awk '{print $$3}'
[root@client ~]# systemctl restart zabbix-agent.service
省略测试环节
zabbix监控网页:
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
+ "配置"——》"模板"——》查找具体模板的"名称"
——》"监控项"——》右上角"创建监控项":"名称"`root登陆IP地址`,"键值"`user.login.check[root]`,"信息类型"选择字符串,"测试"
——》"触发器"——》右上角"创建触发器":"名称"`root用户存在异常登陆`,"表达式"`last(/client/user.login.check[root],#1) <> last(/client/user.login.check[root],#2)`,勾选"允许手动关闭"和"已启用"
+ "配置"——》"主机"——》单击主机名称进入配置,应用模板
实例:Nginx连接数
# 实例:Nginx连接数
被监控主机(192.168.88.5):
[root@client ~]# yum install -y nginx
[root@client ~]# vim /etc/nginx/nginx.conf
47 location / {
48 }
49
50 location /status { # 新增location{},调用stub_status模块
51 stub_status on;
52 }
53
54 error_page 404 /404.html;
[root@client ~]# systemctl enable nginx.service --now
[root@client ~]# curl http://192.168.88.100/status
Active connections: 1
server accepts handled requests
1067 1067 1002
Reading: 0 Writing: 1 Waiting: 0
# connections:当前活跃连接数。等于下面Reading、Writing、Waiting之和
# accepts:自Nginx启动以来的总连接数。
# handled:自Nginx启动以来成功处理的连接数。
# requests:自Nginx启动以来收到的总请求数。
# reading:正在读取客户端请求的连接数。
# writing:正在向客户端发送响应的连接数。
# waiting:空闲连接数,等待处理客户端请求的连接数。
[root@client ~]# cat ngx_status.sh
#!/bin/bash
curl='curl -s http://192.168.88.100/status'
case $1 in
active)
$curl | awk '/Active/{print $NF}';;
waiting)
$curl | awk '/Waiting/{print $NF}';;
accepts)
$curl | awk 'NR==3{print $1}';;
esac
[root@client ~]# chmod +x ngx_status.sh
[root@client ~]# cat /etc/zabbix/zabbix_agentd.d/ngx_status.conf
UserParameter=ngx.status[*],/root/ngx_status.sh $1
省略测试环节
zabbix监控网页:
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
+ "配置"——》"模板"——》查找具体模板的"名称"
——》"监控项"——》右上角"创建监控项":"名称"`nginx连接数`,"键值"`nginx.status[active]`,"信息类型"选择字符串,"测试"
——》"触发器"——》右上角"创建触发器":"名称"`nginx连接数过高`,"表达式"`last(/client/nginx.status[active]) > 10000`,勾选"允许手动关闭"和"已启用"
+ "配置"——》"主机"——》单击主机名称进入配置,应用模板
监控网页设置告警
- 默认情况下,监控网页不会自动发送告警消息,需要设置触发器与告警,并且设置报警方式发送信息给联系人。
- 触发器:告警条件,当条件达标时,将会执行某个动作。
- 动作:触发器条件达标之后要采取的行为,比如发邮件或执行命令。
- 报警媒介:动作执行的报警方式。
- 动作是用于在触发器满足特定条件时执行一系列操作的组件。可以通过动作来发送告警邮件、发送短信、执行脚本等等。
- 步骤:设置"报警媒介类型"——》“用户"关联"报警媒介类型”——》为"模板"创建"触发器"——》“主机"关联"模板”——》创建"动作"(动作的条件关联"主机的触发器",操作的操作关联"报警媒介类型"和"用户")
邮件告警
- 设置邮件告警步骤:
- 准备邮件服务器。
- 监控网页设置邮件告警。
- 配置发件人:设置"报警媒介类型",自定义名称
Email
,类型为电子邮件
,设置邮件服务器和发件人。 - 配置收件人:监控网页"用户"
Admin
关联"报警媒介类型"Email
,设置收件人。 - 配置监控触发邮件告警:
- “模板"创建"触发器”,“主机"关联模板。或者直接"主机"创建"触发器”。
- 设置"动作":动作的"条件"关联主机的触发器,操作的"操作"关联用户
Admin
和报警媒介类型Email
。
- 配置发件人:设置"报警媒介类型",自定义名称
- 触发邮件告警:主机的触发器的监控条件达标,触发动作的操作,用指定用户
Admin
进行指定的报警媒介类型Email
操作,即Admin执行Email将邮件发送到收件人。
# 邮件告警
1. 准备邮件服务器:安装postfix或者163邮箱
zabbix服务器(192.168.88.111):
[root@zabbix ~]# yum install -y postfix,mailx
[root@zabbix ~]# systemctl enable postfix.service --now
163邮箱:登陆——》设置——》POP3/SMTP/IMAP
2. 监控网页设置邮件告警
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
2.1 配置发件人:创建或修改"报警媒介类型"`Email` :
"管理Adminstration"——》"报警媒介类型Media types"——》单击具体报警媒介的"名称Name"`Email`(其已存在一些信息模板):
+ "名称"是监控网页自定义报警媒介类型名称。"类型"为`电子邮件`。"SMTP电邮"自定义发件邮箱地址(任意)。
+ 邮件服务器:"SMTP服务器"为`localhost`。"端口"`25`。
+ 163邮箱:"SMTP服务器"为`smtp.163.com`。启用SSL"端口"`465`,不启用则`25`。使用用户和密码认证(用户为真实邮箱名,密码为授权码)
2.2 配置收件人:"用户"关联"报警媒介类型":
"管理Adminstration"——》"用户Users"——》单击具体"用户名称Username"管理员`Admin`——》"报警媒介Media"添加并更新:
+ "类型"选择"Email"。"收件人"是真实收件邮箱地址,服务器本地用户root的邮箱为`root@localhost.localdomain`。
2.3 配置监控触发邮件告警
注意:可以为模板创建触发器,再应用到主机,也可以直接为主机创建触发器(单击具体主机的"触发器"——》右上角"创建触发器")。但主机创建的触发器只能应用于单台主机,模板创建的触发器可以应用于多台主机。
2.3.1 "模板"创建"触发器" :
"配置Configuration"——》"模板Templates"——》单击具体模板的"触发器Triggers"——》右上角"创建触发器Create trigger":
+ "名称Name"是监控网页自定义触发器名称。添加"表达式Expression"("监控项"选择已有的监控项名称)。
2.3.2 "主机"关联"模板" :
"配置Configuration"——》"主机Hosts"——》单击具体主机的"名称Name"——》链接"模板"("模板"为已存在的模板名称)。
2.3.3 创建"动作"关联"主机的触发器"、"报警媒介类型"和"用户" :
"配置Configuration"——》"动作Actions"——》"Trigger actions"——》右上角"创建动作Create action"——》设置"动作"——》设置"操作":
+ "动作":"名称"是监控网页自定义动作名称。添加"条件"(关联"主机的触发器",不添加条件则所有触发器均告警):
+ "类型"设置为`触发器`,"触发器"选择主机存在的触发器名称。
+ "操作":添加"操作"(关联"报警媒介类型"和"用户"):
+ "步骤"是发送消息次数。"步骤持续时间"是发送消息的间隔秒数。"用户Send to users"是接收消息用户,选择`Admin`(已添加报警媒介类型`Email`)。"仅送到"是发送消息方式,选择`Email`。
触发邮件告警:主机的触发器的监控条件达标,触发动作的操作,用指定用户`Admin`进行指定的报警媒介类型`Email`操作,即Admin执行Email将邮件发送到收件人。
验证:使"监控项"条件达标,然后可以在"报表"的"动作日志"查看到告警内容。也可以在收件人处看到告警邮件。
钉钉机器人告警(脚本告警)
- 设置钉钉机器人告警步骤:
- 在钉钉群中创建自定义机器人,"自定义关键词"
warn
,得到webhook地址
。 - 在zabbix服务器编写脚本
dingalert.py
(使用机器人webhook地址
),用以控制该机器人输出语句。 - 赋予该脚本执行权限
x
,并拷贝到zabbix的告警脚本目录下/usr/lib/zabbix/alertscripts/
,才能被监控网页识别。 - 在监控网页设置钉钉机器人告警。注意输出语句要带有自定义关键词
warn
。- 设置"报警媒介类型",自定义名称
ding
,类型为脚本
,指定脚本dingalert.py
,设置脚本参数和消息模板。 - 监控网页"用户"
Admin
关联"报警媒介类型"ding
。 - 配置监控触发脚本告警:
- “模板"创建"触发器”,“主机"关联模板。或者"主机"创建"触发器”。
- 设置"动作":动作的"条件"关联主机的触发器,操作的"操作"关联用户
Admin
和报警媒介类型ding
。
- 设置"报警媒介类型",自定义名称
- 在钉钉群中创建自定义机器人,"自定义关键词"
- 触发脚本告警:主机的触发器的监控条件达标,触发动作的操作,用指定用户
Admin
进行指定的报警媒介类型ding
操作,即Admin执行ding
的脚本/usr/lib/zabbix/alertscripts/dingalert.py
。
告警脚本
- https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
// 监控端编写python脚本,用以控制钉钉机器人输出语句
在钉钉群中创建自定义机器人,"自定义关键词"`warn,得到webhook地址:https://oapi.dingtalk.com/robot/send?access_token=9f4041a82565a2b5949aaf7aa51244052656e9fe4fd2c190beeef4f10926a6b1
zabbix服务器(192.168.88.111):
[root@zabbix ~]# yum install -y python3-requests // python3与Web服务交互的软件,依赖包含python3
[root@zabbix ~]# cat dingalert.py // 编写控制钉钉机器人输出的python脚本
#!/usr/bin/env python3
import json
import requests
import sys
def send_msg(url, remiders, msg):
headers = {'Content-Type': 'application/json; charset=utf-8'}
data = {
"msgtype": "text",
"at": {
"atMobiles": remiders,
"isAtAll": False,
},
"text": {
"content": msg,
}
}
r = requests.post(url, data=json.dumps(data), headers=headers)
return r.text
if __name__ == '__main__':
msg = sys.argv[1]
remiders = []
url = 'https://oapi.dingtalk.com/robot/send?access_token=9f4041a82565a2b5949aaf7aa51244052656e9fe4fd2c190beeef4f10926a6b1'
print(send_msg(url, remiders, msg))
[root@zabbix ~]# chmod +x dingalert.py // 赋予脚本可执行权限
[root@zabbix ~]# ./dingalert.py 'warn: 测试消息' // 测试脚本,注意变量msg'输出语句'中要包含关键字warn
{"errcode":0,"errmsg":"ok"} // 此时,钉钉机器人在群中发送了一条消息:`warn: 测试消息`
[root@zabbix ~]# cp dingalert.py /usr/lib/zabbix/alertscripts/ // 拷贝到zabbix的告警脚本目录
注意:假设是在Windows系统编写的脚本,其文件格式是Windows的,在Linux系统中只能被查看而不能写入,可以通过dos2unix转换其文件格式
监控端zabbixser(192.168.88.5):
[root@zabbix ~]# ls dingalert.py
dingalert.py
[root@zabbix ~]# yum install -y dos2unix
[root@zabbix ~]# dos2unix dingalert.py
dos2unix: converting file dingalert.py to Unix format...
[root@zabbix ~]# chmod +x dingalert.py
[root@zabbix ~]# ./dingalert.py 'warn: 测试消息' // 测试该脚本,注意'输出语句'中要包含关键字warn
[root@zabbix ~]# cp dingalert.py /usr/lib/zabbix/alertscripts/
监控网页设置钉钉机器人告警
# 钉钉机器人告警
1.告警脚本目录下准备钉钉机器人脚本
[root@zabbix ~]# ll /usr/lib/zabbix/alertscripts/dingalert.py
-rwxr-xr-x 1 root root 666 Oct 31 16:44 /usr/lib/zabbix/alertscripts/dingalert.py
2.监控网页设置钉钉机器人告警
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
2.1 创建"报警媒介类型"`ding`:
"管理Adminstration"——》"报警媒介类型Media types"——》右上角"创建媒体类型"——》设置"报警媒介类型"——》设置"Message templates":
+ "报警媒介类型":"名称"是监控网页自定义报警媒介类型名称`ding`。"类型"为`脚本`。"脚本名称"是告警脚本目录`/usr/lib/zabbix/alertscripts/`下的脚本,`dingalert.py`。"脚本参数"使用宏`{ALERT.MESSAGE}`(调用"Message templates"中具体的输出语句)
+ "Message templates"(定义具体的输出语句):自定义"Message type"和"主题","消息"是输出语句(一定要包含机器人的"自定义关键词"`warn`)。
2.2 "用户"关联"报警媒介类型" :
+ "管理Adminstration"——》"用户Users"——》单击具体"用户名称Username"管理员`Admin`——》"报警媒介"添加并更新:
+ "类型"选择`ding`。"收件人"`Admin`。
2.3 配置监控触发脚本告警
注意:可以为模板创建触发器,再应用到主机,也可以直接为主机创建触发器(单击具体主机的"触发器"——》右上角"创建触发器")。但主机创建的触发器只能应用于单台主机,模板创建的触发器可以应用于多台主机。
2.3.1 "模板"创建"触发器" :
"配置Configuration"——》"模板Templates"——》单击具体模板的"触发器Triggers"——》右上角"创建触发器Create trigger":
+ "名称Name"是监控网页自定义触发器名称。添加"表达式Expression"("监控项"选择已有的监控项名称)。
2.3.2 "主机"关联"模板" :
"配置Configuration"——》"主机Hosts"——》单击具体主机的"名称Name"——》链接模板("模板"为已存在的模板名称)。
2.3.3 创建"动作"关联"主机的触发器"、"报警媒介类型"和"用户" :
"配置Configuration"——》"动作Actions"——》"Trigger actions"——》右上角"创建动作Create action"——》设置"动作"——》设置"操作":
+ "动作":"名称"是监控网页自定义动作名称。添加"条件"(不添加条件则所有触发器均告警)
+ "类型"设置为`触发器`,"触发器"为已存在的触发器名称。
+ "操作":添加"操作"(关联"报警媒介类型"和"用户"):
+ "步骤"是发送消息次数。"步骤持续时间"是发送消息的间隔秒数。"用户Send to users"是接收消息用户,选择`Admin`(已添加报警媒介类型`ding`)。"仅送到"是发送消息方式,选择`ding`。
触发脚本告警:主机的触发器的监控条件达标,触发动作的操作,用指定用户`Admin`进行指定的报警媒介类型`ding`操作,即Admin执行`ding`的脚本`/usr/lib/zabbix/alertscripts/dingalert.py`。
验证:使"监控项"条件达标,然后可以在"报表"的"动作日志"查看到告警内容。也可以在钉钉群看到告警消息。
企业微信告警(脚本告警)
- https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
告警脚本
// 监控端编写python脚本,用以控制企业微信机器人输出语句
在企业微信中创建应用机器人,获取企业ID(wxd074861951c67ba6)、agentid(1)、机器人密码(QtraZrI936DZ0jZ3aSWTZlFVheAMgLmq3toM4B9U1A)
zabbix服务器(192.168.88.111):
[root@zabbix ~]# yum install -y python3-requests
[root@zabbix ~]# /usr/lib/zabbix/alertscripts/wechat.py
#!/usr/bin/env python
import requests
import sys
import os
import json
import logging
logging.basicConfig(level = logging.DEBUG, format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join('/tmp','wechat.log'),
filemode = 'a')
#id和secret需要修改
corpid='wxd074861951c67ba6'
appsecret='QtraZrI936DZ0jZ3aSWTZlFVheAMgLmq3toM4B9U1A'
agentid=1
#获取accesstoken
token_url='https:qyapi.weixin.qq.com/cgibin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']
#发送消息
msgsend_url='https:qyapi.weixin.qq.com/cgibin/message/send?access_token=' + accesstoken
#脚本参数
touser=sys.argv[1]
subject=sys.argv[2]
message=sys.argv[2] + "\n\n" +sys.argv[3]
params={
"touser": touser,
"msgtype": "text",
"agentid": agentid,
"text": {
"content": message
},
"safe":0
}
req=requests.post(msgsend_url, data=json.dumps(params))
logging.info('sendto:' + touser + 'subject:' + subject + 'message:' + message)
[root@zabbix ~]# chmod +x /usr/lib/zabbix/alertscripts/wechat.py
// 测试
[root@zabbix ~]# python3 /usr/lib/zabbix/alertscripts/wechat.py 收件人企业微信用户id或部门id "报警标题" "报警信息"
监控网页设置企业微信机器人告警
# 企业微信机器人告警
1.告警脚本目录下准备企业微信机器人脚本
[root@zabbix ~]# ll /usr/lib/zabbix/alertscripts/wechat.py
-rwxr-xr-x 1 root root 666 Oct 31 16:44 /usr/lib/zabbix/alertscripts/wechat.py
2.监控网页设置企业微信机器人告警
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
2.1 创建"报警媒介类型"`wechat`:
"管理Adminstration"——》"报警媒介类型Media types"——》右上角"创建媒体类型"——》设置"报警媒介类型"——》设置"Message templates":
+ "报警媒介类型":"名称"是监控网页自定义报警媒介类型名称`wechat`。"类型"为`脚本`。"脚本名称"是告警脚本目录`/usr/lib/zabbix/alertscripts/`下的脚本,`wechat.py`。"脚本参数"三个,分别为收件人`{ALERT.SENDTO}`、报警标题`{ALERT.SUBJECT}`、报警信息`{ALERT.MESSAGE}`
+ "Message templates"(定义具体的输出语句):自定义"Message type"和"主题","消息"是输出语句。
2.2 "用户"关联"报警媒介类型" :
+ "管理Adminstration"——》"用户Users"——》单击具体"用户名称Username"管理员`Admin`——》"报警媒介"添加并更新:
+ "类型"选择`wechat`。"收件人"`企业微信用户id`。
2.3 配置监控触发脚本告警
注意:可以为模板创建触发器,再应用到主机,也可以直接为主机创建触发器(单击具体主机的"触发器"——》右上角"创建触发器")。但主机创建的触发器只能应用于单台主机,模板创建的触发器可以应用于多台主机。
2.3.1 "模板"创建"触发器" :
"配置Configuration"——》"模板Templates"——》单击具体模板的"触发器Triggers"——》右上角"创建触发器Create trigger":
+ "名称Name"是监控网页自定义触发器名称。添加"表达式Expression"("监控项"选择已有的监控项名称)。
2.3.2 "主机"关联"模板" :
"配置Configuration"——》"主机Hosts"——》单击具体主机的"名称Name"——》链接模板("模板"为已存在的模板名称)。
2.3.3 创建"动作"关联"主机的触发器"、"报警媒介类型"和"用户" :
"配置Configuration"——》"动作Actions"——》"Trigger actions"——》右上角"创建动作Create action"——》设置"动作"——》设置"操作":
+ "动作":"名称"是监控网页自定义动作名称。添加"条件"(不添加条件则所有触发器均告警)
+ "类型"设置为`触发器`,"触发器"为已存在的触发器名称。
+ "操作":添加"操作"(关联"报警媒介类型"和"用户"):
+ "步骤"是发送消息次数。"步骤持续时间"是发送消息的间隔秒数。"用户Send to users"是接收消息用户,选择`Admin`(已添加报警媒介类型`wechat`)。"仅送到"是发送消息方式,选择`wechat`。
触发脚本告警:主机的触发器的监控条件达标,触发动作的操作,用指定用户`Admin`进行指定的报警媒介类型`ding`操作,即Admin执行`ding`的脚本`/usr/lib/zabbix/alertscripts/dingalert.py`。
验证:使"监控项"条件达标,然后可以在"报表"的"动作日志"查看到告警内容。也可以在钉钉群看到告警消息。
监控网页设置自动发现(批量部署)
- 自动发现功能:自动搜索IP地址,符合条件的就自动实现创建"主机"、添加到"主机群组"、 关联"模板"。
设置自动发现步骤:
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
1. 创建"自动发现"规则:
"配置"——》"自动发现"——》右上角"创建发现规则":
+ "名称"是监控网页自定义自动发现规则名称`add_hosts`。"IP范围"是自动发现的IP地址范围`192.168.88.195-205`。"检查"是自动发现的方式,设置为`SSH`。由于没有配置名称解析,"主机名称"和"可见的名称"均选择`IP地址`。
2. 创建"动作"关联"自动发现" :
"配置"——》"动作"——》"Discovery actions"——》右上角"创建动作"——》设置"动作"——》设置"操作":
+ "动作":"名称"是监控网页自定义动作名称`discovery`。添加"条件"
+ 方式一:"类型"设置为`主机IP地址`。"值"`192.168.88.195-205`。
+ 方式二:"类型"设置为`自动发现规则`。"自动发现"`add_hosts`。
+ "操作":
+ "Operation"设置为`添加到主机群组`。"主机群组"是主机群组名称。
+ "Operation"设置为`与模板关联`。"模板"是已存在的模板名称。
验证:创建一台主机,IP地址范围`192.168.88.195-205`,在zabbix监控网页的"配置"的"主机"会发现该新主机,且自动加入主机群组、链接模板。该主机要部署zabbix-agent才可被监控。
批量部署监控:
1. 主机群配置IP地址、修改主机名
2. 主机群安装zabbix-agent
3. ansible控制端使用变量ansible_hostname修改zabbix-agent后使用template上传至主机群
4. ansible将自定义key的配置文件上传至主机群
5. 主机群启服务zabbix-agent.service
6. 监控网页创建模板(选择新的主机群组),设置监控项、触发器、图形
7. 监控网页创建自动发现,应用模板
主动监控
- 如果监控数据更新频率较高,使用被动监控可能占用zabbix服务器资源,可以使用主动监控。
- zabbix默认使用的是被动监控,主被动监控都是针对被监控主机而言的。
- 被动监控(常用):zabbix-server向zabbix-agent发起请求,索取监控数据,zabbix-agent被动提供。
- 主动监控:zabbix-agent向监控端zabbix-server发起连接,向Server主动汇报。
主动监控的步骤:
1. 被监控主机禁用被动监控,启用主动监控
2. 监控网页创建主机并应用主动监控模板
1. 被监控主机禁用被动监控,启用主动监控
被监控主机(192.168.88.5):
[root@client ~]# vim /etc/zabbix/zabbix_agentd.conf
142 StartAgents=0 # 解除注释,修改该行
171 ServerActive=192.168.88.111 # 修改该行。相当于 ServerActive=192.168.88.111:10051
182 Hostname=主机名 # 修改该行。被zabbix-server识别的代表本zabbix-agent的唯一标识ID,用于主动监控,建议同主机名
242 RefreshActiveChecks=120 # 解除注释
[root@client ~]# systemctl restart zabbix-agent.service
[root@client ~]# ss -ntulp | grep :10050 # 没有返回内容,zabbix_agentd进程不再监听10050
2. 监控网页创建主机并应用主动监控模板
浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
"配置Configuration"——》"主机Hosts"——》右上角"创建主机Create host":
+ "主机名称"必须同被监控主机`/etc/zabbix/zabbix_agentd.conf`中的`Hostname`的值。
+ "模板"选择带`active`的主动监控模板。
+ "群组"任意。
其他类型客户端
监控网页主机的 Interfaces类型 | 作用 | 操作 |
---|---|---|
客户端 (zabbix-agent、 zabbix-agent2) | 几乎适用于所有情况,支持自定义监控, 支持linux、windows、Mac、android/ios | 客户端安装zabbix-agent、zabbix-agent2,创建key启服务 zbx监控网页创建主机并创建对应的监控项 |
SNMP | 用于监控网络设备 Simple Network Management Protocal 简单网络管理协议 | 网络设备开启SNMP功能, zbx监控网页创建主机关联对应的SNMP模板 |
JMX | 用于监控java app(tomcat), 未来推荐自定义监控:zabbix_agent2 + jmap/jstats | Java应用服务器开启Java远程监控功能jmxremote, zbx服务器安装与开启java工具zabbix-java-gateway zbx监控网页创建主机关联对应的JMX模板 |
IPMI | 用于监控硬件:物理服务器,联想(IBM X86架构 ThinkServer), 华为,浪潮,Dell,IBM,HP | 硬件设备开启IPMI功能, zbx监控网页创建主机关联对应的IPMI模板 |
监控Windows/Mac zabbix-agent
监控Windows zabbix-agent:
1. 安装windows客户端:
在zabbix官网选择对应系统的zabbix-agent,下载后安装
安装时的配置内容(主机名、监控端IP)会自动加载到zabbix-agent.conf
+ 自动识别本机主机名,注意不要包含中文
+ 监控端ip:"Zabbix server IP/DNS"、"Server or Proxy for active checks"为`192.168.88.111`
开机自启动:任务管理器——》服务——》打开服务——》搜索zabbix——》启动类型"自动"
2. 监控网页添加主机:浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
模板选择带Windows字样的
Interfaces类型`客户端`
监控网络设备 SNMP
监控网络设备 SNMP:
1. 网络设备开启SNMP功能:
SNMP有多个版本
+ v2c版本使用团体名作为认证。
+ v3版本使用用户名和密码认证。
命令行连接测试网络设备
[root@zabbix ~]# yum install -y net-snmp-utils
[root@zabbix ~]# snmpwalk -v 2c -c 团体名 网络设备IP地址 指令
指令有:SysDesc、sysUptime、IfNumber、IfDescr、IfInOctet等
2. 监控网页添加主机:浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
模板选择带SNMP字样的
Interfaces类型`SNMP`:具体的网络设备IP地址、SNMP版本、v2填写团体名(可以使用变量"宏")、v3填写用户密码
监控Java应用 JMX
监控方案 | 步骤 |
---|---|
方案一:JMX | Java应用服务器开启Java远程监控功能jmxremote zbx服务器安装与开启java工具zabbix-java-gateway zbx监控网页创建主机关联对应的JMX模板 |
方案二:自定义监控,通过java命令获取想要指标 | 在Java应用服务器安装zabbix-agent,然后通过jmap/jstats等命令获取key来自定义监控 |
// 监控Java应用
// 命令行工具(由openjdk-devel或jdk-devel提供)
jps -lvm
jmap PID :查看jvm信息、内存信息
jstack PID :查看进程信息
jstat -gc PID :查看进程信息
Tomcat服务器(192.168.88.88,Tomcat目录为/usr/local/tomcat):
[root@tomcat ~]# jps
2018 Bootstrap
2613 Jps
[root@tomcat ~]# jps -l
2625 sun.tools.jps.Jps
2018 org.apache.catalina.startup.Bootstrap
[root@tomcat ~]# jps -lv
2018 org.apache.catalina.startup.Bootstrap -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp
2637 sun.tools.jps.Jps -Dapplication.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el8_5.x86_64 -Xms8m
[root@tomcat ~]# jps -lvm
2018 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp
2649 sun.tools.jps.Jps -lvm -Dapplication.home=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el8_5.x86_64 -Xms8m
[root@tomcat ~]# jstat -gc 2018
[root@tomcat ~]# jstack 2018
[root@tomcat ~]# jmap 2018
// 图形工具
jconsole
jvisualvm
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \ # jmxremote 开启功能
-Dcom.sun.management.jmxremote.port=12345 \ # 指定端口号 12345固定端口 +2个随机端口
-Dcom.sun.management.jmxremote.authenticate=false \ # 是否开启认证功能,一般使用内网访问无需认证
-Dcom.sun.management.jmxremote.ssl=false \ # 是否启用ssl,一般使用内网访问无需ssl
-Djava.rmi.server.hostname=内网IP地址" # 监听的IP,选择内网IP,使用内网访问
Tomcat服务器(192.168.88.88,Tomcat目录为/usr/local/tomcat):
[root@tomcat tomcat]# bin/catalina.sh // 注释行后增加六行
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=192.168.88.88"
[root@tomcat tomcat]# ss -ntulp | grep 12345
tcp LISTEN 0 50 *:12345 *:* users:(("java",pid=3010,fd=22))
开发在Windows找到jconsole或jvisualvm所在的路径,运行后使用连接192.168.88.88的12345端口
监控Java应用方案一:
1. Java应用服务器(tomcat)开启远程监控功能
Tomcat服务器(192.168.88.88,Tomcat目录为/usr/local/tomcat):
[root@tomcat tomcat]# bin/catalina.sh // 注释行后增加六行
CATALINA_OPTS="$CATALINA_OPTS \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=192.168.88.88"
[root@tomcat tomcat]# bin/startup.sh
[root@tomcat tomcat]# ss -ntulp | grep 12345
tcp LISTEN 0 50 *:12345 *:* users:(("java",pid=3010,fd=22))
如果只是监控jar包应用:java -jar xxx.jar
]# java \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=jmx所在IP地址" \
-jar xxx.jar
2. zbx服务端部署zabbix-java-gateway
Zabbix服务器(192.168.88.111):
[root@zabbix ~]# yum install -y zabbix-java-gateway
[root@zabbix ~]# grep '^[a-Z]' /etc/zabbix/zabbix_java_gateway.conf
LISTEN_PORT=10052
PID_FILE="/var/run/zabbix/zabbix_java_gateway.pid"
[root@zabbix ~]# systemctl enable zabbix-java-gateway.service --now
[root@zabbix ~]# grep -n 'Java.*=' /etc/zabbix/zabbix_server.conf
317:JavaGateway=127.0.0.1
325:JavaGatewayPort=10052
333:StartJavaPollers=5 # 开启5个收集Java数据的进程
[root@zabbix ~]# systemctl restart zabbix-server.service
3. 监控网页添加主机:浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
模板选择带JMX字样的
Interfaces类型`JMX`,IP地址`192.168.88.88`,端口`12345`。与Java应用服务器(tomcat)的catalina.sh中的jmxremote配置一致
监控硬件设备 IPMI
监控方案 | 步骤 |
---|---|
方案一:IPMI | 硬件设备开启IPMI功能 zbx监控网页创建主机关联对应的IPMI模板 |
方案二:通过客户端命令获取指标实现监控硬件:megacli、ipmitool | megacli获取raid卡状态 ipmitool获取cpu温度,风扇转速 |
监控硬件设备 IPMI 方案一:
1. 硬件设备开启IPMI功能:
https://www.bilibili.com/video/BV1rb411n7a8/?vd_source=e3622fece92919affb4c221c28573094
2. 监控网页添加主机:浏览器访问 http://192.168.88.111:8080,用户Admin 密码zabbix
模板选择带IPMI字样的
Interfaces类型`IPMI`
Prometheus 9090
- Prometheus官方网站:https://prometheus.io/
- Prometheus监控架构是基于HTTP的Pull模型,Prometheus从exporter获取信息,存放到自身的数据库。Prometheus将警报推送到第三方Alertmanager,由Alertmanager发送告警信息。第三方grafana通过连接Prometheus的数据库来展示信息。
- 被监控主机安装exporter采集数据——》主动或被动发送给服务端prometheus——》promethus自带TSDB时序数据库存储数据,grafana展示数据。
- exporter是专用的,针对一个功能使用一个exporter,由第三方提供或自己开发。
- prometheus提供了查询语言PromQL,但是可视化效果不好,使用第三方可视化工具grafana(开源、基于Web)展示数据。
- prometheus使用go语言,其安装包包含了所需的功能,没有额外依赖,解压即用。缺点:占用存储。
- 被监控主机安装exporter采集数据——》主动或被动发送给服务端prometheus——》promethus自带TSDB时序数据库存储数据,grafana展示数据。
部署Prometheus监控端 9090
// 部署Prometheus监控端
Prometheus服务器(192.168.88.222):
1. 准备软件
[root@prometheus ~]# ls
1-node-exporter-for-prometheus-dashboard-update-1102_rev11.json mysql-overview_rev5.json
alertmanager-0.25.0.linux-amd64.tar.gz node_exporter-1.5.0.linux-amd64.tar.gz
grafana-enterprise-9.3.2-1.x86_64.rpm prometheus-2.37.5.linux-amd64.tar.gz
mysqld_exporter-0.14.0.linux-amd64.tar.gz pushgateway-1.5.1.linux-amd64.tar.gz
/*
prometheus-2.37.5.linux-amd64.tar.gz // 监控端的监控软件
grafana-enterprise-9.3.2-1.x86_64.rpm // 可视化工具软件
node_exporter-1.5.0.linux-amd64.tar.gz // 被监控端的硬件信息数据的被监控软件,端口9100
mysqld_exporter-0.14.0.linux-amd64.tar.gz // 被监控端的数据库信息数据的被监控软件,端口9104
alertmanager-0.25.0.linux-amd64.tar.gz // 监控端的告警软件
pushgateway-1.5.1.linux-amd64.tar.gz // 被监控主机主动推送数据的组件
1-node-exporter-for-prometheus-dashboard-update-1102_rev11.json // 仪表盘模板
mysql-overview_rev5.json // 仪表盘模板
*/
2. 校对时间,修改时区
[root@prometheus ~]# timedatectl set-timezone Asia/Shanghai
3. 解压即用,使用/usr/local/prometheus/prometheus启动,创建system.service
[root@prometheus ~]# tar -xf prometheus-2.37.5.linux-amd64.tar.gz
[root@prometheus ~]# mv prometheus-2.37.5.linux-amd64 /usr/local/prometheus
[root@prometheus ~]# ls /usr/local/prometheus/
console_libraries consoles data LICENSE NOTICE prometheus prometheus.yml promtool
[root@prometheus ~]# cat /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring System
After=network.target
[Service]
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.path=/usr/local/prometheus/data/
[Install]
WantedBy=multi-user.target
[root@prometheus ~]# systemctl daemon-reload
[root@prometheus ~]# systemctl enable prometheus.service --now
[root@prometheus ~]# ss -ntulp | grep 9090 // 监控prometheus软件本身的运行信息
tcp LISTEN 0 128 *:9090 *:* users:(("prometheus",pid=842,fd=7))
浏览器访问prometheus自带监控网页 http://192.168.88.222:9090,Status——》Targets
配置文件prometheus.yml
prometheus的配置文件
[root@prometheus ~]# cat /usr/local/prometheus/prometheus.yml
# my global config
global: # 全局配置,可以在这设置参数
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. # 抓取间隔
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # 评估规则的间隔
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting: # 告警配置
alertmanagers: # 处理和发送告警的组件
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files: # 评估的规则文件
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs: # 抓取配置
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
监控主机 static_configs
- 监控方式:
- 拉取pull:监控端联系被监控主机,采集数据。
- 推送push。被监控主机主动把数据发给监控端。被监控主机安装额外的组件pushgateway。
- 被监控主机根据自身运行的服务,可以运行不同的exporter(被监控主机安装的、用于与Prometheus通信、实现数据传递的软件)
- exporter列表:https://prometheus.io/docs/instrumenting/exporters/
// 监控主机。以监控硬件信息(node_exporter)为例
1. 被监控主机安装对应的exporter并启动(创建system.service)
2. Prometheus识别exporter:修改配置文件后重启
1. 被监控主机安装对应的exporter并启动
任意被监控主机(192.168.88.5):
1.1 准备对应的exporter
[root@client ~]# ls node_exporter-1.5.0.linux-amd64.tar.gz
node_exporter-1.5.0.linux-amd64.tar.gz // 用于监控硬件
1.2 安装node_exporter
[root@client ~]# tar -xf node_exporter-1.5.0.linux-amd64.tar.gz
[root@client ~]# mv node_exporter-1.5.0.linux-amd64 /usr/local/node_exporter
[root@client ~]# ls /usr/local/node_exporter
LICENSE node_exporter NOTICE
1.3 system.service
[root@client ~]# cat /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
[root@client ~]# systemctl daemon-reload
1.4 启服务
[root@client ~]# systemctl enable node_exporter.service --now
[root@client ~]# ss -ntlnp | grep node_exporter
LISTEN 0 128 *:9100 *:* users:(("node_exporter",pid=917,fd=3))
2. 监控端识别exporter:修改配置文件后重启
Prometheus服务器(192.168.88.222):
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml // 文末新增三行30-32,注意对齐缩进
21 scrape_configs: # 指定被监控主机
23 - job_name: "prometheus"
28 static_configs:
29 - targets: ["localhost:9090"] # 监控本机的prometheus软件本身的运行信息
30 - job_name: "client_node"
31 static_configs:
32 - targets: ["192.168.88.5:9100"] # 监控192.168.88.5的9100端口的exporter
[root@prometheus ~]# systemctl restart prometheus.service
[root@prometheus ~]# ss -ntulp | grep 9090
tcp LISTEN 0 128 *:9090 *:* users:(("prometheus",pid=20024,fd=7))
浏览器访问prometheus自带监控网页 http://192.168.88.222:9090,Status——》Targets
// 如果Prometheus也要监控本身硬件信息,也安装启用node_exporter
Prometheus服务器(192.168.88.222):
[root@prometheus ~]# ls node_exporter-1.5.0.linux-amd64.tar.gz
node_exporter-1.5.0.linux-amd64.tar.gz
[root@prometheus ~]# tar -xf node_exporter-1.5.0.linux-amd64.tar.gz
[root@prometheus ~]# mv node_exporter-1.5.0.linux-amd64 /usr/local/node_exporter
[root@prometheus ~]# cat /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
[root@prometheus ~]# systemctl daemon-reload
[root@prometheus ~]# systemctl enable node_exporter.service --now
[root@prometheus ~]# ss -ntulp | grep :9100
tcp LISTEN 0 128 *:9100 *:* users:(("node_exporter",pid=1336,fd=3))
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml // 新增三行33-35,注意对齐缩进
// 虽然一个job_name可以监控多个exporter(targets),但建议一个exporter编写一个job_name,注意job_name唯一
21 scrape_configs: # 指定被监控主机
23 - job_name: "prometheus"
28 static_configs:
29 - targets: ["localhost:9090"] # 监控本机的prometheus软件本身的运行信息
30 - job_name: "client_node"
31 static_configs:
32 - targets: ["192.168.88.5:9100"] # 监控192.168.88.5的9100端口的exporter
33 - job_name: "prometheus_node"
34 static_configs:
35 - targets: ["localhost:9100"] # 监控本机的9100端口的exporter
[root@prometheus ~]# systemctl restart prometheus.service
[root@prometheus ~]# ss -ntulp | grep 9090
tcp LISTEN 0 128 *:9090 *:* users:(("prometheus",pid=20024,fd=7))
浏览器访问prometheus自带监控网页 http://192.168.88.222:9090,Status——》Targets
可视化 Grafana 3000
- grafana仪表盘模板:https://grafana.com/grafana/dashboards/
# Grafana
1. 安装启用grafana
2. 初始化grafana:修改密码——》连接数据库(对接Prometheus)
3. grafana导入对应的仪表盘,展示数据
Prometheus服务器(192.168.88.222):
1. 安装启用grafana
[root@prometheus ~]# ls grafana-enterprise-9.3.2-1.x86_64.rpm
grafana-enterprise-9.3.2-1.x86_64.rpm
[root@prometheus ~]# yum install -y ./grafana-enterprise-9.3.2-1.x86_64.rpm
[root@prometheus ~]# systemctl enable grafana-server.service --now
2. 初始化grafana:修改密码——》连接数据库(对接Prometheus)
浏览器访问grafana http://192.168.88.222:3000,用户名admin密码admin,修改密码1234.com
修改语言:"Configuration"——》"Preferences"——》"language"
连接数据库:"Configuration"——》"Data sources"——》"Add data source"——》选择"Prometheus":
+ "Settings"——》"URl"`http://192.168.88.222:9090`,"Save & test"
+ "Dashboards"——》单击"Prometheus 2.0 Stats"的"import"——》单击"Prometheus 2.0 Stats"
3. grafana导入对应的仪表盘,展示数据
浏览器访问 http://192.168.88.222:3000,用户名admin密码1234.com
仪表盘模板:https://grafana.com/grafana/dashboards/,找到合适的模板,"Copy ID to clipboard"或者"Download JSON"
例如:`12377`,`1-node-exporter-for-prometheus-dashboard-update-1102_rev11.json`
新增仪表盘:"Dashboards"——》"New"下拉"Import"——》"Import via grafana.com"粘贴仪表盘ID`12377`,或者"Upload JSON file"`1-node-exporter-for-prometheus-dashboard-update-1102_rev11.json`
实例:监控MySQL数据库
// 监控MySQL数据库(msyqld_exporter)
1. 被监控主机安装对应的exporter并启动
2. Prometheus识别exporter:修改配置文件后重启
3. Grafana导入对应的仪表盘,展示数据
1. 被监控主机安装对应的exporter并启动
任意被监控主机(192.168.88.5):
1.0 部署数据库
[root@client ~]# yum install -y mysql-server
[root@client ~]# systemctl enable mysqld.service --now
[root@client ~]# mysql -e "create user exporter@localhost identified by '123456';"
[root@client ~]# mysql -e "grant select on *.* to exporter@localhost;"
1.1 准备对应的exporter
[root@client ~]# ls mysqld_exporter-0.14.0.linux-amd64.tar.gz
mysqld_exporter-0.14.0.linux-amd64.tar.gz // 用于监控MySQL
1.2 安装mysqld_exporter
[root@client ~]# tar -xf mysqld_exporter-0.14.0.linux-amd64.tar.gz
[root@client ~]# mv mysqld_exporter-0.14.0.linux-amd64 /usr/local/mysqld_exporter
[root@client ~]# ls /usr/local/mysqld_exporter
LICENSE mysqld_exporter NOTICE
1.3 编写用于连接MySQL的配置文件
[root@client ~]# cat /usr/local/mysqld_exporter/.my.cnf
[client] # 必须写[client]
host = 127.0.0.1
port = 3306
user = exporter
password = 123456
1.4 system.service
[root@client ~]# cat /usr/lib/systemd/system/mysqld_exporter.service
[Unit]
Description=mysqld_exporter
After=network.target
[Service]
ExecStart=/usr/local/mysqld_exporter/mysqld_exporter --config.my-cnf=/usr/local/mysqld_exporter/.my.cnf
[Install]
WantedBy=multi-user.target
[root@client ~]# systemctl daemon-reload
1.4 启服务
[root@client ~]# systemctl enable mysqld_exporter.service --now
[root@client ~]# ss -ntulp | grep mysqld_exporter
tcp LISTEN 0 128 *:9104 *:* users:(("mysqld_exporter",pid=4090,fd=3))
2. 监控端识别exporter:修改配置文件后重启
Prometheus服务器(192.168.88.222):
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml // 文末新增三行30-32,注意对齐缩进
21 scrape_configs: # 指定被监控主机
36 - job_name: "client_mysqld" # 注意job_name唯一
37 static_configs:
38 - targets: ["192.168.88.5:9104"]
[root@prometheus ~]# systemctl restart prometheus.service
[root@prometheus ~]# ss -ntulp | grep 9090
tcp LISTEN 0 128 *:9090 *:* users:(("prometheus",pid=20024,fd=7))
3. Grafana导入对应的仪表盘,展示数据
浏览器访问grafana http://192.168.88.222:3000,用户名admin1234.com
新增仪表盘:"Dashboards"——》"New"下拉"Import"——》"Upload JSON file"`mysql-overview_rev5.json`
端口
软件或服务 | 端口 | 作用 |
---|---|---|
prometheus.service | 9090 | Prometheus自带监控网页 |
grafana.service | 3000 | 可视化工具 |
node_exporter.service | 9100 | 采集硬件信息的exporter |
mysqlnd_exporter.service | 9104 | 采集数据库信息的exporter |
alertmanager.service | 9093 | 告警网页 |
自动发现
-
自动发现是指Prometheus自动对节点进行监控,不需要手动一个一个去添加,和Zabbix的自动发现、自动注册一个道理。
-
Prometheus有多种自动发现,比如基于文件自动发现(
file_sd_configs
)、基于K8S自动发现、基于openstack自动发现、基于consul自动发现等。-
File-based服务发现:Prometheus可以通过读取文件的方式自动发现服务实例,并收集它们的指标数据。
Kubernetes服务发现:Prometheus可以通过Kubernetes API自动发现Kubernetes集群中的服务和Pod,从而收集它们的指标数据。
Consul服务发现:Prometheus可以通过Consul API自动发现Consul中的服务实例,并收集它们的指标数据。
DNS服务发现:Prometheus可以通过DNS解析自动发现服务实例,并收集它们的指标数据。
-
基于文件的自动发现 file_sd_configs
- 使用文件自动发现(
file_sd_configs
,file service discovery)功能后,Prometheus会定期检查目标文件(refresh_interval
)是否有更新。如果有更新的话就将新加入的节点接入监控,此时服务端无需重启服务。
// 基于文件的自动发现 `file_sd_configs`
1. 修改prometheus配置文件后重启服务:使用文件自动发现,指定监控实例文件
2. 编写监控实例文件,等待自动发现
Prometheus服务器(192.168.88.222):
[root@prometheus ~]# cp /usr/local/prometheus/prometheus.yml{,.static}
1. 修改prometheus配置文件后重启服务:使用文件自动发现,指定目标文件
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml // 删除22-$的静态配置,添加自动发现配置
21 scrape_configs:
22 - job_name: "file_sd"
23 file_sd_configs:
24 - refresh_interval: 60s
25 files:
26 - /usr/local/prometheus/sd_config/*.yml /* 自定义监控实例文件路径 */
[root@prometheus ~]# systemctl restart prometheus.service
[root@prometheus ~]# ss -ntulp | grep 9090
tcp LISTEN 0 128 *:9090 *:* users:(("prometheus",pid=2651,fd=7))
2. 编写目标文件,等待自动发现
[root@prometheus ~]# mkdir /usr/local/prometheus/sd_config
[root@prometheus ~]# cat /usr/local/prometheus/sd_config/discover.yml
- targets:
- localhost:9090 # prometheus.service本身的信息
- localhost:9100 # prometheus的硬件信息
- 192.168.88.5:9100 # client的硬件信息
- 192.168.88.5:9104 # client的数据库信息
每次修改指定的监控实例文件后,无需重启prometheus.service,等待refresh_interval自动检查更新就可
浏览器访问prometheus自带监控网页 http://192.168.88.222:9090,Status——》Targets,可以看到file_sd
浏览器访问grafana http://192.168.88.222:3000,用户名admin密码1234.com
告警 Alertmanager 9093
- 告警规则官网文档:https://prometheus.io/docs/alerting/latest/notification_examples/
- 告警步骤:
- 安装alertmanager,配置指定告警方式(接收器类型),启服务
- 修改prometheus,指定alertmanager位置,并指定告警规则文件
- 编写告警规则文件(复制官方文档后修改),重启prometheus.service
- 告警流程:prometheus.service根据配置文件指定的告警规则,在规则达标时发送警报给指定的alertmanager.service——》alertmanager接收到警报后,尝试匹配抑制规则——》如果无需抑制,则将警报写入告警模板并转发(路由)到接收器指定的接收器(收件人或路径)。
Prometheus对接Alertmanager
// prometheus对接alertmanager
1. 安装启用alertmanager
2. prometheus对接alertmanager
Prometheus服务器(192.168.88.222):
1. 安装启用alertmanager
[root@prometheus ~]# ls alertmanager-0.25.0.linux-amd64.tar.gz
alertmanager-0.25.0.linux-amd64.tar.gz
[root@prometheus ~]# tar -xf alertmanager-0.25.0.linux-amd64.tar.gz
[root@prometheus ~]# mv alertmanager-0.25.0.linux-amd64 /usr/local/alertmanager
[root@prometheus ~]# ls /usr/local/alertmanager/
alertmanager alertmanager.yml amtool LICENSE NOTICE
[root@prometheus ~]# cat /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager Service
[Service]
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
[root@prometheus ~]# systemctl enable alertmanager.service --now
[root@prometheus ~]# ss -ntulp | grep alertmanager
udp UNCONN 0 0 *:9094 *:* users:(("alertmanager",pid=1000,fd=7))
tcp LISTEN 0 128 *:9093 *:* users:(("alertmanager",pid=1000,fd=8))
tcp LISTEN 0 128 *:9094 *:* users:(("alertmanager",pid=1000,fd=3))
此时,浏览器可以访问alertmanager http://192.168.88.222:9093
2. prometheus对接alertmanager
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml
8 alerting:
9 alertmanagers:
10 - static_configs:
11 - targets:
12 - localhost:9093 # 解除注释,指定alertmanager
[root@prometheus ~]# systemctl restart prometheus.service
配置文件alertmanager.yml
- Alertmanager配置文件
alertmanager.yml
中主要包含以下几个部分:- 全局配置(global):用于定义一些全局的公共参数,如邮件告警的SMTP发件配置。
- 模板(templates):用于定义告警通知时的模板,如HTML模板、邮件模板。
- 告警路由(route):根据标签匹配,决定警报应该发送到哪个接收器,并将警报写入告警模板。起分配转发作用的都可以叫路由。
- 接收器(receivers):告警信息的去处。可以是邮箱收件人、微信、Slack、Webhook等,接收器一般配合告警路由使用。
- 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生。
alertmanager的配置文件
[root@prometheus ~]# cat /usr/local/alertmanager/alertmanager.yml
route: # 路由(转发)配置
group_by: ['alertname'] # 使用alertname进行分组
group_wait: 30s # 同一组警报发出第一个警报后等待30秒再发送下一个警报
group_interval: 5m # 同一组警报的发送间隔
repeat_interval: 1h # 重复发送已解决警报通知的间隔时间
receiver: 'web.hook' # 定义警报的接收器
receivers: # 接收器配置
- name: 'web.hook' # 自定义接收器名称
webhook_configs: # 接收器类型
- url: 'http://127.0.0.1:5001/'
inhibit_rules: # 抑制规则配置
- source_match: # 抑制规则的源匹配条件
severity: 'critical' # 源匹配条件中警报严重性为critical
target_match: # 抑制规则的目标匹配条件
severity: 'warning' # 目标匹配条件中警报严重性为warning
equal: ['alertname', 'dev', 'instance'] # 匹配的标签键值对,如果源匹配条件和目标匹配条件的标签键值对都相等,则抑制警报
邮件告警
// 邮件告警
前提:已安装并启用alertmanager,prometheus已对接alertmanager
1. 准备邮件服务器
2. 修改alertmanager配置文件后重启服务:新增全局配置(指定邮件服务器),修改接收器(修改类型为邮件,指定收件人)
3. 修改prometheus配置文件后重启服务:指定告警规则文件
4. 编写告警规则文件,自定义告警规则,重启prometheus.service
Prometheus服务器(192.168.88.222):
1. 准备邮件服务器
[root@prometheus ~]# yum install -y postfix mailx
[root@prometheus ~]# systemctl enable postfix.service --now
[root@prometheus ~]# ss -ntulp | grep 25
tcp LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=2504,fd=13))
tcp LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=2504,fd=14))
2. 修改alertmanager配置文件后重启服务:新增全局配置(指定邮件服务器),修改接收器(修改类型为邮件,指定收件人)
[root@prometheus ~]# cp /usr/local/alertmanager/alertmanager.yml{,.ori}
[root@prometheus ~]# cat /usr/local/alertmanager/alertmanager.yml
global: # 新增全局配置
smtp_from: 'prometheus@aletr.local' # 自定义发件人
smtp_smarthost: 'localhost:25' # 指定邮件服务器
smtp_require_tls: false # 是否使用加密传输邮件,不加密端口25,加密端口各服务器不一样
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'default_receiver' # 指定接收器
receivers:
- name: 'default_receiver' # 自定义接收器名称
email_configs: # 接收器类型为邮件
- to: 'root@localhost.localdomain' # 指定收件人
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
[root@prometheus ~]# systemctl restart alertmanager.service
[root@prometheus ~]# ss -ntulp | grep 9093
tcp LISTEN 0 128 *:9093 *:* users:(("alertmanager",pid=2577,fd=8))
3. 修改prometheus配置文件后重启服务:指定告警规则文件
[root@prometheus ~]# vim /usr/local/prometheus/prometheus.yml // 新增一行16
8 alerting:
9 alertmanagers:
10 - static_configs:
11 - targets:
12 - localhost:9093
15 rule_files:
16 - /usr/local/prometheus/rules/*.yml /* 自定义告警规则文件路径 */
[root@prometheus ~]# systemctl restart prometheus.service
[root@prometheus ~]# ss -ntulp | grep 9090
tcp LISTEN 0 128 *:9090 *:* users:(("prometheus",pid=2651,fd=7))
4. 编写告警规则文件,自定义告警规则,重启prometheus服务
[root@prometheus ~]# mkdir /usr/local/prometheus/rules
[root@prometheus ~]# cat /usr/local/prometheus/rules/alert_hoststats.yml // 从官方文档复制后修改
groups:
- name: example
rules:
- alert: InstanceDown # 自定义告警规则名称
expr: up == 0 # 告警规则判断表达式:`up`是可查的prometheus监控项,0为监控实例不可达,1为监控实例可达
for: 5m # 表达式成立持续时间
labels:
severity: warn # 严重程度标签:赋予warn
annotations: # 注解,也是邮件内容
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
# 以上是官方文档
- alert: hostMemUsageAlert # 自定义告警规则名称
expr: (node_memory_MemTotal - node_memory_MemAvailable)/node_memory_MemTotal > 0.85 # `node_memory_MemTotal`、`node_memory_MemAvailable`、`node_memory_MemTotal`均是可查的prometheus监控项
for: 1m
labels:
severity: warn
annotations:
summary: "Instance {{ $labels.instance }} MEM usgae high"
[root@prometheus ~]# systemctl restart prometheus.service
[root@prometheus ~]# ss -ntulp | grep 9090
tcp LISTEN 0 128 *:9090 *:* users:(("prometheus",pid=2841,fd=7))
浏览器访问prometheus自带监控网页 http://192.168.88.222:9090,Status——》Rules,可以看到InstanceDown和HostMemUsageAlert
过程:以prometheus告警规则InstanceDown为例:
prometheus.service发现监控实例不可达持续5分钟,则会向配置文件中的`alertmanagers`(localhost:9093)发出警报,本机9093端口的alertmanagers.service接收到警报,不符合抑制规则,就转发(路由)给接收器,根据接收器的邮件类型发送给收件人
// 验证
关闭client主机(192.168.88.5),使prometheus.service的监控实例(192.168.88.5:9100和192.168.88.5:9104)不可达
[root@client ~]# shutdown -h now
5分钟后,收件人`root@localhost.localdomain`,即prometheus.service本机的root收到邮件
[root@prometheus ~]# mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N 1 prometheus@aletr.loc Thu Nov 2 11:57 263/12891 "[FIRING:2] InstanceDown (file_sd warn)"
&
Message 1:
From prometheus@aletr.local Thu Nov 2 11:57:46 2023
Return-Path: <prometheus@aletr.local>
X-Original-To: root@localhost.localdomain
Delivered-To: root@localhost.localdomain
From: prometheus@aletr.local
Subject: [FIRING:2] InstanceDown (file_sd warn)
To: root@localhost.localdomain
Date: Thu, 02 Nov 2023 11:57:45 +0800
Content-Type: multipart/alternative; boundary=398c09305cea14449b5c4addb4810350aad357959b02c0bac755eb6449af
Status: R
……省略一万字
将告警邮件内容从【`<!DOCTYPE ...`】这一行到【`</html>`】复制,粘贴到一个文件中,如文件名为`alert.html`,用浏览器打开
浏览器访问alertmanager http://192.168.88.222:9093,可以看见告警