# Zabbix和Prometheus

区别

监控ZabbixPrometheus
数据采集zabbix-agent,自定义key第三方单一功能exporter
数据存储第三方数据库,例如mysqlPrometheus自带TSDB
数据展示zaibbix-server的PHP页面,需要LNP自身PromQL,第三方可视化工具Grafana
告警zabbix-server(报警媒介、触发器、动作)第三方告警工具Alertmanager(Prometheus告警规则、路由、接收器)

Zabbix 10051

  • 被监控主机zabbix-agent采集数据——》(主动或被动)发送给服务端zabbix-server——》数据库存储数据,php页面展示数据
规模平台CPU/内存数据库受监控的主机数量
小 型CentOSVirtual ApplianceMySQL InnoDB100
中 型CentOS2 CPU cores/2GBMySQL InnoDB500
大 型RedHat Enterprise Linux4 CPU cores/8GBRAID10 MySQL InnoDB 或 PostgreSQL>1000
极 大 型RedHat Enterprise Linux8 CPU cores/16GBFast 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-agentzabbix-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=10050zabbix-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测试KeyGet 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`,勾选"允许手动关闭""已启用"
+ "配置"——》"主机"——》单击主机名称进入配置,应用模板

监控网页设置告警

  • 默认情况下,监控网页不会自动发送告警消息,需要设置触发器与告警,并且设置报警方式发送信息给联系人。
    • 触发器:告警条件,当条件达标时,将会执行某个动作。
    • 动作:触发器条件达标之后要采取的行为,比如发邮件或执行命令。
    • 报警媒介:动作执行的报警方式。
  • 动作是用于在触发器满足特定条件时执行一系列操作的组件。可以通过动作来发送告警邮件、发送短信、执行脚本等等。
  • 步骤:设置"报警媒介类型"——》“用户"关联"报警媒介类型”——》为"模板"创建"触发器"——》“主机"关联"模板”——》创建"动作"(动作的条件关联"主机的触发器",操作的操作关联"报警媒介类型"和"用户")

邮件告警

  • 设置邮件告警步骤:
    1. 准备邮件服务器。
    2. 监控网页设置邮件告警。
      1. 配置发件人:设置"报警媒介类型",自定义名称Email,类型为电子邮件,设置邮件服务器和发件人。
      2. 配置收件人:监控网页"用户"Admin关联"报警媒介类型"Email,设置收件人。
      3. 配置监控触发邮件告警:
        1. “模板"创建"触发器”,“主机"关联模板。或者直接"主机"创建"触发器”。
        2. 设置"动作":动作的"条件"关联主机的触发器,操作的"操作"关联用户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将邮件发送到收件人。
验证:使"监控项"条件达标,然后可以在"报表"的"动作日志"查看到告警内容。也可以在收件人处看到告警邮件。

钉钉机器人告警(脚本告警)

  • 设置钉钉机器人告警步骤:
    1. 在钉钉群中创建自定义机器人,"自定义关键词"warn,得到webhook地址
    2. 在zabbix服务器编写脚本dingalert.py(使用机器人webhook地址),用以控制该机器人输出语句。
    3. 赋予该脚本执行权限x,并拷贝到zabbix的告警脚本目录下/usr/lib/zabbix/alertscripts/,才能被监控网页识别。
    4. 在监控网页设置钉钉机器人告警。注意输出语句要带有自定义关键词warn
      1. 设置"报警媒介类型",自定义名称ding,类型为脚本,指定脚本dingalert.py,设置脚本参数和消息模板。
      2. 监控网页"用户"Admin关联"报警媒介类型"ding
      3. 配置监控触发脚本告警:
        1. “模板"创建"触发器”,“主机"关联模板。或者"主机"创建"触发器”。
        2. 设置"动作":动作的"条件"关联主机的触发器,操作的"操作"关联用户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

监控方案步骤
方案一:JMXJava应用服务器开启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.88Tomcat目录为/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.88Tomcat目录为/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.8812345端口
监控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、ipmitoolmegacli获取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语言,其安装包包含了所需的功能,没有额外依赖,解压即用。缺点:占用存储。

部署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:9090Status——》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.59100端口的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:9090Status——》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.59100端口的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:9090Status——》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.service9090Prometheus自带监控网页
grafana.service3000可视化工具
node_exporter.service9100采集硬件信息的exporter
mysqlnd_exporter.service9104采集数据库信息的exporter
alertmanager.service9093告警网页

自动发现

  • 自动发现是指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:9090Status——》Targets,可以看到file_sd
浏览器访问grafana http://192.168.88.222:3000,用户名admin密码1234.com

告警 Alertmanager 9093

  • 告警规则官网文档:https://prometheus.io/docs/alerting/latest/notification_examples/
  • 告警步骤:
    1. 安装alertmanager,配置指定告警方式(接收器类型),启服务
    2. 修改prometheus,指定alertmanager位置,并指定告警规则文件
    3. 编写告警规则文件(复制官方文档后修改),重启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:9090Status——》Rules,可以看到InstanceDownHostMemUsageAlert

过程:以prometheus告警规则InstanceDown为例:
prometheus.service发现监控实例不可达持续5分钟,则会向配置文件中的`alertmanagers`(localhost:9093)发出警报,本机9093端口的alertmanagers.service接收到警报,不符合抑制规则,就转发(路由)给接收器,根据接收器的邮件类型发送给收件人

// 验证
关闭client主机(192.168.88.5),使prometheus.service的监控实例(192.168.88.5:9100192.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,可以看见告警

end

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值