Nagios中的插件就是脚本写的程序,来获取数据使用的: Zabbix中设置item收集数据就是用key完成的,现有的键不能满足需求时就需要自己定义key,监控项就是item,在创建监控项时需要输入键值,键值就是key. Key就是客户端agent收集好数据————> 传给server————>然后绘图,所以Key应该在客户端.
定义Key的语法
UserParameter=<key>,<command>;[<command>..]
command只能有一个返回值(UserParameter=key1,who |wc -l)
此处自己定义那个key1的名字可以自定义,能通过看到这个名字知道是干什么的就行了,但是这个名字,后面的命令一定要是/usr/bin下面的命令,如果是/usr/sbin下面的命令会报错,数据过不去,除非将zabbix用户提权到管理员.
我们首先分析一下怎么做自定义Key,以及当中数据流向
当看到这种需求,首先我们想到的是在需要被监控的那台主机上装上zabbix-agent,以便收取数据,可以理解为ELKB当中的filebeat,logstash,就是收集数据到zabbix-server上,然后进行存储并根据需要做图表或者触发器报警等等.所以我们先把zabbix-agent理解为一个filebeat,logstash收集数据/日志的服务. 然后我们应该想的是怎么将有用的数据传给zabbix-agent,这点zabbix-agent上有自定义的函数UserParameter,通过他我们可以将有用的数据通过传参传给这个函数,然后这个函数发往zabbix-server,或者zabbix-server过来取,至于怎么做分析,做存储,做图表跟agent一点关系都没有. 接下来就是我们怎么去对UserParameter传参,这里我们通过下面两个例子来说明,先说明一种简单的,然后再将上面图的监控做一下.
# 1、解注释,支持写键值的时候可以使用特殊字符
vim /etc/zabbix/zabbix_agentd.conf
UnsafeUserParameters=1
# 2.创建一个文件,并定义key名,命令或脚本,(位置参数下面这种不需要)
vim /etc/zabbix/zabbix_agentd.d/userparameter_user.conf
UserParameter=key1,who |wc -l
systemctl restart zabbix-agent
# 3.检测key能不能传参过来
[root@zabbix ~]# zabbix_agentd -t key1
key1 [t|1]
[root@zabbix ~]# zabbix_get -s 39.108.140.0 -k key1
1
# 4.至此我们就可以到zabbix的web界面去创建监控项了,
# 只不过不用填写官方自定义的key了,
# 而是你自己起名的key,等示例二在进入web界面操作
如果出现一条命令传参到UserParameter无法满足需求,需要用到case或者命令比较长可以考虑使用脚本,可读性强也能满足需求,case等监控rabbitmq在介绍. 1 . 解开注释就不说了,先创建一个文件,定义一下key名,至于是命令还是脚本根据需求来,此处先用脚本,此处需要用到位置参数.
cat /etc/zabbix/zabbix_agentd.d/userparameter_nginx.conf
UserParameter=nginx[*],/etc/zabbix/key/nginx.sh $1
# 此处的nginx可以是自定义的名字,
# [*] 为脚本里面的位置参数
# /etc/zabbix/key/nginx.sh为你写的自定义Key的脚本
# $1为位置参数,还记得我们用zabbix官方自带的key时候里面填网卡名之类的吗,此处的位置参数跟那个差不多.
# 正常来说,如果是简单的key可以直接把命令放到这里来,值就直接传过去了,但此处用到了脚本,我们看下脚本内容.
mkdir /etc/zabbix/key
cat /etc/zabbix/key/nginx.sh
#!/usr/bin/env bash
# *******************************************************************************
# Author: ZhouJian
# Mail: 18621048481@163.com
# Data: 2019-11-12
# Describe: CentOS 7 Zabbix Monitor Nginx Server Status
port=`systemctl status nginx |grep running|awk -F"(" '{print $2}'|awk -F")" '{print $1}'`
if [ "$port" == "running" ];then
port=1
else
port=0
fi
if [ $1 = "port" ];then
echo $port
fi
chmod +x nginx.sh
# 检测下脚本能不能传参成功
# 先重启服务
systemctl restart zabbix-agent
zabbix_agentd -t nginx[port]
nginx[port] [t|0]
接着我们切换到zabbix监控主机上看能不能通过get获取值
zabbix_get -s 116.196.83.113 -k nginx[port]
0
如果此项能获取到值,说明我们可以到zabbix-server上去创建监控项了,就跟创建官方自定义的key监控项一样,只不过到了键值哪里换成配置文件自己取的key名而已.
接下来我们到zabbix的web前端去配置监控项
我们可以看到此处有了最新数据,我们接下来就可以去创建图形了,但是此处就先不做了,创建图形和前面步骤差不多,下面来一个稍微复杂一点的自定义Key监控脚本.
# 在/etc/zabbix/zabbix_agent.d/目录下创建一个配置文件,或者跟其他配置文件共用,配置文件里面通过UserParameter函数传参给zabbix-server,具体都有什么作用请看示例二.
# 1.到这个目录下创建一个userparameter_cpu.conf文件,一定要以conf结尾.
cat /etc/zabbix/zabbix_agentd.d/userparameter_cpu.conf
UserParameter=nginx[*],/etc/zabbix/key/cpu.sh $1
# 2.创建userparameter_cpu.conf中定义的脚本路径,到这个路径写好脚本,并通过位置传输传给UserParameter。
cat /etc/zabbix/key/cpu.sh
#!/usr/bin/env bash
# *******************************************************************************
# Author: ZhouJian
# Mail: 18621048481@163.com
# Data: 2019-11-12
# Describe: CentOS 7 Zabbix Monitor CPU load Status
m1load=`uptime |awk -F",| +" '{print $14}'`
m5load=`uptime |awk -F",| +" '{print $16}'`
m15load=`uptime |awk -F",| +" '{print $18}'`
case $1 in
m1load)
echo $m1load
;;
m5load)
echo $m5load
;;
m15load)
echo $m15load
;;
esac
chmod +x cpu.sh
# 3.重启服务然后测试下参数能不能传过去.
systemctl restart zabbix-agent
zabbix_agentd -t cpu[m1load]
cpu[m1load] [t|0.32]
# 我们切换到zabbix-server机器用get命令,看能不能得到.
zabbix_get -s 116.196.83.113 -k cpu[m1load]
0.10
# 我们看到值是可以get到的,接下来我们到zabbix的web页面上进行创建一个一分钟负载CPU的监控项,并创建触发器.
接下来我们去看下有不有新数据,有的话我们去创建一个图形
item(监控项)只负责收集数据,而通常收集数据的目的还包括在某指标对应的数据超出合理范围时给相关人员发送告警信息,"触发器"正是用于为监控项所收集的数据定义的阈值,靠动作来完成的。每一个触发器仅能关联至一个监控项,但可以为一个监控项同时使用多个触发器.事实上,为一个监控项定义多个具有不同阈值的触发器,可以实现不同级别的报警功能。如:一个监控网络的触发器是不能用在监控cpu上的;而一个item可以设置达到一个值做什么动作,达到另外一个值做什么动作,所以可以设置多个触发器。但是触发器只是触发一个事件,并不会报警,报警 需要靠后续的动作来完成 一个触发器由一个表达式构成,它定义了监控项所采取的数据的一个阈值,一旦某次采集的数据超出了此触发器定义的阈值,触发器状态将会转换为"problem";而当采取的数据再次回归至合理范围内时,其状态将重新返回"ok"。
触发器表达式
https://www.zabbix.com/documentation/3.2/manual/config/triggers/prediction
触发器表达式高度灵活,可以创建出非常复杂的测试条件,基本的触发器表达式如下所示
{<server>:<key><function>{<parameter>}}<operator><constant>
注释
server: 主机名
key: 监控项对应的监控脚本就叫key
function: 评估采集到的数据是否在合理范围内所使用的函数,其评估过程可以根据采集的数据,当前时间及其他因素进行。目前触发器所支持的函数有:avg count change date dayofweek delta diff iregexp(正则表达是匹配) last max min nodata now sum等
parameter:函数参数,大多数数值函数可以接受秒数为其参数,而如果在数值参数之前使用"#"作为前缀,则表示为最近几次的取值,如sum(300)表示300秒内所有的取值之和,而sum(#10)则表示最近10次取值之和。此外avg count last min max还支持使用第二个参数用于完成时间限定:例如 max(1h,7d)将返回一周之前1小时内的最大值
operator操作符:/、*、-、+、<、>、# 不等于、=、& 逻辑与、| 逻辑或
constant:常数,不能超过多少,或者不能低于多少
接下来我们先大概知道一下触发器怎么创建,具体怎么结合报警.
至此一个触发器就完成了
我们可以看到下图有一个触发线,我们尝试着将CPU负载弄上去,然后看有什么变化. 我们通过dd命令看下cpu的负载能不能到达触发器. dd if=/dev/zero of=test bs=1M count=1000 随机生成1百万个1K的文件 seq 1000000 | xargs -i dd if=/dev/zero of={}.dat bs=1024 count=1
了解动作之前我们先了解一下事件(event)。事件(event):即发生了一件值得关注的事情,例如某个触发器状态改变,新的agent或重新上线的agent的自动注册等。而动作是指对于特定事件事先定义的处理方法,包含了操作(如发送通知)和条件(何时执行操作)。由此,可以得知动作是通过事件来触发。 Action(动作)可以基于Event的状态执行不同的操作(发送邮件、执行脚本、添加主机等),最常见的就是发送报警邮件和执行远程命令了。
禁用其他报警媒介
创建组
配置用户
set sendcharsets=iso-8859-1,utf-8
set from=18621048481.com # 用于zabbix服务端转发邮件到指定邮箱
set smtp=smtp.163.com:25
set smtp-auth-user=18621048481@163.com # 个人邮箱
set smtp-auth-password=xxx # 个人邮箱授权密码
set smtp-auth=login
# 测试下,看邮件能不能过来
echo "zabbix test" |mail -s "zabbix" 18621048481@163.com
# 我们停掉nginx
systemctl stop nginx