简介
zabbix([`zæbiks])是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。
zabbix由2部分构成:zabbix server与zabbix agent。
zabbix agent需要安装在被监视的目标服务器上,它主要完成对硬件信息或与操作系统有关的内存,CPU等信息的收集。zabbix agent可以运行在Linux, OS X, Windows ,Solaris,HP-UX,AIX,Free BSD,Open BSD等系统之上。
zabbix server可以单独监视远程服务器的服务状态;同时也可以与zabbix agent配合,可以轮询zabbix agent主动接收监视数据(agent方式),同时还可被动接收zabbix agent发送的数据(trapping方式)。
Zabbix主要术语及作用
Zabbix server
-Zabbix软件的核心流程,用于执行监控,与Zabbix代理和代理交互,计算触发器,发送通知;?中央数据库。
Zabbix agent
-部署在监控目标上的流程,以主动监控本地资源和应用程序。
Zabbix proxy
-可以代表Zabbix服务器收集数据的进程,从而减轻服务器的处理负担。
host-使用IP /DNS监视的网络设备。
host group-主机的逻辑分组;?它可能包含主机和模板。主机组内的主机和模板不以任何方式相互链接。在为不同用户组分配主机的访问权限时使用主机组。
item-希望从主机接收的特定数据,即数据度量。
value preprocessing-在将接收的度量值保存到数据库之前对其进行转换
trigger- 定义问题阈值的逻辑表达式,用于“评估”项目中收到的数据。
当接收的数据高于阈值时,触发器从“Ok”变为“Problem”状态。当接收的数据低于阈值时,触发器保持/返回“OK”状态。
event-单次出现值得关注的事情,例如触发器更改状态或发现/代理自动注册发生.
remote command- 在某些情况下在受监视主机上自动执行的预定义命令。
action- 对事件作出反应的预定义方式。动作由操作(例如发送通知)和条件(当所述操作被执行)组成。
Notification-关于通过所选媒体频道发送给用户的某些事件的消息。
template- 准备应用于一个或多个主机的一组实体(项目,触发器,图形,屏幕,应用程序,低级发现规则,Web场景)。
模板的工作是加快主机上监控任务的部署; 还可以更轻松地将质量变化应用于监控任务。模板直接链接到各个主机。
Zabbix功能特点
- 安装与配置简单,学习成本低
- 支持多语言(包括中文)
- 免费开源
- 自动发现服务器与网络设备
- 分布式监视以及WEB集中管理功能
- 可以无agent监视
- 用户安全认证和柔软的授权方式
- 通过WEB界面设置或查看监视结果
- email等通知功能
Zabbix功能流程图
主页面
监控数据展示界面
一、案例分析
在做性能监控的时候,常常需要监控进程,基本上是根据各个组件服务对应的进程来实施监控。
Zabbix自带模板中缺少一些进程监控的关键指标(比如:内存占用百分比、实际内存使用情况,进程运行时间,进程号等)。
假设有10个进程,需要监控CPU%、MEM%、RES、VIRT(共四项),在zabbix平台中共需要添加40个监控项。每次添加监控项及监控图表的过程都比较复杂繁琐,有很多重复步骤,耽误时间。
所以通过此案例可以解决以上大部分的问题。
二、解决思路
1. top.sh |
---获取监控主机top信息存储到本地
2. 在监控主机上创建定时任务,实时查询top信息: |
3. check_porcess.sh |
---找出内存消耗占用前10的进程名称
4. process_monitor.sh |
---根据进程名称和监控指标名,解析top进程资源情况
5. zabbix_zagentd.conf |
---关键字配置,使得zabbix平台中调用相关脚本,
6.zabbix平台模板配置 |
7.监控主机直接关联模板实现监控 |
三、解决过程
1.编写top.sh:
top -n 1 -b > /tmp/top.txt |
打印输出信息到/tmp/top.txt中
2.创建定时任务(执行linux命令):
# crontab –e; */1 * * * * /opt/zabbix_agent/scripts/top.sh > /dev/null |
分 时 日 月 周(五个星号对应表示时间单位;*/1:每分钟执行一次脚本)
可以用过crontab –l 查看定时任务
3.编写check_porcess.sh:
TABLESPACE=`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$6}END{for(k in a)print a[k]/1024,k}'|sort -gr|head -10|cut -d" " -f2` COUNT=`echo "$TABLESPACE" |wc -l` INDEX=0 echo '{"data":[' echo "$TABLESPACE" | while read LINE; do echo -n '{"{#PROCESSNAME}":"'$LINE'"}' INDEX=`expr $INDEX + 1` if [ $INDEX -lt $COUNT ]; then echo ',' fi done echo ']}' |
TABLESPACE:获取前十的进程名(是以 RES 作为标准衡量资源消耗,可通过其他指标来监控)
COUNT:得到TABLESPACE的行数(10)
后面代码都是为了组装成zabbix能识别读取的标准数据格式。
脚本运行结果:
{"data":[ {"{#PROCESSNAME}":"java"}, {"{#PROCESSNAME}":"postgres"}, {"{#PROCESSNAME}":"vag_dag"}, {"{#PROCESSNAME}":"vag_pag"}, {"{#PROCESSNAME}":"vrm"}, {"{#PROCESSNAME}":"vtdu"}, {"{#PROCESSNAME}":"vod"}, {"{#PROCESSNAME}":"nginx"}, {"{#PROCESSNAME}":"systemd-jo+"}, {"{#PROCESSNAME}":"vag_stream"}]} |
4. 编写process_monitor.sh:
process=$1 name=$2 case $2 in mem_res) echo "`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$6}END{for(k in a)print a[k]/1024,k}'|grep "$process"|cut -d" " -f1`" ;; cpu_p) echo "`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$9}END{for(k in a)print a[k],k}'|grep "$process"|cut -d" " -f1`" ;; mem_virt) echo "`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$5}END{for(k in a)print a[k]/1024,k}'|grep "$process"|cut -d" " -f1`" ;; mem_p) echo "`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$10}END{for(k in a)print a[k],k}'|grep "$process"|cut -d" " -f1`" ;; pid) echo "`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$1}END{for(k in a)print a[k],k}'|grep "$process"|cut -d" " -f1`" ;; runtime) echo "`tail -n +8 /tmp/top.txt|awk '{a[$NF]+=$11}END{for(k in a)print a[k],k}'|grep "$process"|cut -d" " -f1`" ;; *) echo "Error input:" ;; esac exit 0 |
参数:
process:进程名称(zabbix中会自动赋值)
name:监控指标名(在zabbix模板中已经配置好)
后面的代码都是逻辑判断,根据上面的参数信息,获取监控数值
5.修改zabbix_agentd.conf,使得zabbix能够调用脚本:
#top10_process UserParameter=process.discovery,/opt/zabbix_agent/scripts/check_process.sh UserParameter=process.resource[*],/opt/zabbix_agent/scripts/process_monitor.sh $1 $2 |
注意:每次修改此文件后,需要重启zabbix-agentd服务
6.zabbix平台模板配置
6.1创建模板
6.2 创建自动发现规则
注意:数据更新间隔时间与定时任务时间的定时关系
6.3 创建监控原型
依次添加监控项
6.4 创建图形原型
7.监控主机直接关联Top10 Process模板,实现监控
主机关联成功后,自动创建40个监控项
查看图形
四、使用方法
1.解压zabbix-agented安装包(内含上面提到的脚本及配置文件)
2.创建定时任务(详见解决过程中第2步)
3.赋予脚本文件执行权限
chmod +x check_process.sh process_monitor.sh top.sh |
4.zabbix页面中关联模板Top 10 Process
完成以上步骤,就可以自动监控Top10进程
结果展示:
五、经验总结
1. 定时任务的时间频率设置与监控采集数据频率的设置,息息相关。在使用过程中可以合理设置时间频率,请参考三、解决过程中的步骤。本模板默认时间频率间隔都是1min。
2. 进程名称采集是通过Liunx 的top命令,但是有时候会出现多个java进程,无法区分监控对应的服务,暂时还没办法解决。可以协调开发人员,讨论下是否可以更改进程名称来区分。
3. 默认是以 RES 作为标准衡量资源消耗Top10,也可以使用CPU%来衡量,通过修改check_porcess.sh可以实现。
4. 可以直接调用键值process.resource[java,cpu_p]来监控进程