触发器例子

Posted zhengliming

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了触发器例子相关的知识,希望对你有一定的参考价值。

例子 :

https://www.zabbix.com/documentation/3.4/zh/manual/config/triggers/expression  #官网 

触发器名称:Processor load is too high on host
{host:system.cpu.load[all,avg1].last(0)}>5
触发器说明:
hosthost名称
system.cpu.load[all,avg1]:item值,一分内cpu平均负载值
last(0):最新值
>5:最新值大于5
如上所示,www.zabbix.com这个主机的监控项,最新的CPU负载值如果大于5,那么表达式会返回true,这样一来触发器状态就改变为“problem”了

 

触发器名称:www.zabbix.com is overloaded
{host:system.cpu.load[all,avg1].last(0)}>5|{www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2

当前cpu负载大于5或者最近10分内的cpu负载大于2,那么表达式将会返回true.

 

触发器名称:/etc/passwd has been changed 使用函数 diff():
{host:vfs.file.cksum[/etc/passwd].diff(0)}>0

/etc/passwd最新的checksum与上一次获取到的checksum不同,表达式将会返回true. 我们可以使用同样的方法监控系统重要的配置文件,例如/etc/passwd,/etc/inetd.conf等等。这些zabbix一般都会自带,没带的你自己加上吧

 

触发器名称:Someone is downloading a large file from the Internet 使用函数 min:
{host:net.if.in[eth0,bytes].min(5m)}>100K

当前主机网卡eth0最后5分钟内接收到的流量超过100KB那么触发器表达式将会返回true

 

触发器名称:Both nodes of clustered SMTP server are down
{smtp1.zabbix.com:net.tcp.service[smtp].last(0)}=0 & {smtp2.zabbix.com:net.tcp.service[smtp].last(0)}=0

smtp1.zabbix.com和smtp2.zabbix.com两台主机上的SMTP服务器都离线,表达式将会返回true

 

触发器名称:Zabbix agent needs to be upgraded 使用函数str():
{zabbix.zabbix.com:agent.version.str("beta8")}=1

如果当前zabbix agent版本包含beta8(假设当前版本为1.0beta8),这个表达式会返回true

 

触发器名称:Server is unreachable
{zabbix.zabbix.com:icmpping.count(30m,0)}>5

如上表达式表示最近30分钟zabbix.zabbix.com这个主机超过5次不可到达

 

触发器名称:No heartbeats within last 3 minutes 使用函数 nodata():
{zabbix.zabbix.com:tick.nodata(3m)}=1

tick为Zabbix trapper类型,首先我们要定义一个类型为Zabbix trapper,key为tick的item。我们使用zabbix_sender定期发送数据给tick,如果在3分钟内还未收到zabbix_sender发送来的数据,那么表达式返回一个true,与此同时触发器的值变为“PROBLEM”

 

触发器名称:CPU activity at night time 使用函数 time():
{zabbix:system.cpu.load[all,avg1].min(5m)}>2 & {zabbix:system.cpu.load[all,avg1].time(0)}>000000 & {zabbix:system.cpu.load[all,avg1].time(0)}<060000

只有在凌晨0点到6点整,最近5分钟内cpu负载大于2,表达式返回true,触发器的状态变更为“problem”

 

触发器名称:Check if client local time is in sync with Zabbix server time 使用函数 fuzzytime():
{mysql_DB:system.localtime.fuzzytime(10)}=0

主机MySQL_DB当前服务器时间如果与zabbix server之间的时间相差10秒以上,表达式返回true,触发器状态改变为“problem”

 

触发器名称:Comparing average load today with average load of the same time yesterday (使用 time_shift 时间偏移量参数).
{server:system.cpu.load.avg(1h)} / {server:system.cpu.load.avg(1h,1d)}>2

This expression will fire if the average load of the last hour tops the average load of the same hour yesterday more than two times.

最新一小时的平均负载峰值超过昨天同时段指标两次进行报警

 

特性之Hysteresis(迟滞,滞后):

简单的说触发器状态转变为problem需要一个条件,从problem转变回来还需要一个条件才行。一般触发器只需要不满足触发器为problem条件即可恢复。明白了么?不明白就看例子吧。 有时候触发器需要使用不同的条件来表示不同的状态,举个官网很有趣的例子:机房温度正常稳定为15-20°,当温度超过20°,触发器值为problem,当前情况下,只有温度处在这个温度之间触发器值才会为FALSE。(慢慢理解,这个表达式有点绕) 为了达到这个效果,我们需要使用如下触发器表达式:

触发器名称:Temperature in server room is too high
({TRIGGER.VALUE}=0&{server:temp.last(0)}>20) | ({TRIGGER.VALUE}=1&{server:temp.last(0)}<15)

注意:宏变量 {TRIGGER.VALUE}将会返回当前触发器的值

 

触发器名称:Free disk space is too low Problem: 最近5分钟内剩余磁盘空间小于10GB。 Recovery: 最近10分钟内磁盘空间大于40GB
({TRIGGER.VALUE}=0&{server:vfs.fs.size[/,free].max(5m)}<10G) | ({TRIGGER.VALUE}=1&{server:vfs.fs.size[/,free].min(10m)}<40G)

 

参数 :

https://www.zabbix.com/documentation/3.4/zh/manual/appendix/triggers/functions  #官网

Zabbix触发器的语法如下:

{<server>:<key>.<function>(<parameter>)}<operator><constant>

Template App Zabbix Agent模板中的主机ping监控的触发器来进行说明:

{Template App Zabbix Agent:agent.ping.nodata(5m)}=1

<server>    Template App Zabbix Agent #即监控模板
<key>    agent.ping #即监控模板里的项目Items
<function>     nodata() #及项目所使用的方法
<parameter>    5m #及方法所使用的参数

<operator>  #操作人,选填

<constant>   #持续性,选填

 

(#5)  #五个最新值的平均值

(1h)  #一个小时的平均值

(1h,1d)  #一天前一个小时的平均值。

 

类型 : 浮点数(float), 整数(int), 字符(str), 文本(text), 日志(log)

 

abschange  #最近获取值与之前获取值差的绝对值

支持值的类型: float, int, str, text, log

返回值 : 0 - 两值相等

   1 - 两值不等

例子 : (最近获取值;之前获取值=abschange)

3;1=2

0;-2.5=2.5

 

avg (sec|#num,<time_shift>)  #返回一段时间的平均值

参数:秒或#num

支持值的类型: float, int

例如 : ? avg(#5) → 五个最新值的平均值

? avg(1h) → 一个小时的平均值

? avg(1h,1d) → 一天前一个小时的平均值。

 

band (sec|#num,mask,<time_shift>)  #项目值和掩码的按位与值

参数:#num 参数和其它一些函数的作用不通 (参照 last()).

支持值的类型: int

注意此处的 #num 参数和其它一些函数的作用不用 (参照 last()).

尽管以二进制方式进行比较,但是所有的参数和返回值都是十进制数。 例如, 检查第三位是和4做比较而不是100。

例如 : ? band(,12)=8 or band(,12)=4 → 第三位和第四位被设置,但不是同时

? band(,20)=16 → 第三位没有被设置但是第五位被设置了。

 

change  #返回最近获得值与之前获得值的差值,对于字符串0表示相等,1表示不同

支持的值类型: float, int, str, text, log

change(0)>n:忽略参数一般输入0,表示最近得到的值与上一个值的差值大于n

例如: (最近获取值;之前获取值=change)

3;1=-2

0;-2.5=-2.5

 

count (sec|#num,<pattern>,<operator>,<time_shift>)  #返回指定时间间隔内数值的统计

支持值的类型: float, int, str, text, log

参数:秒或#num

举例:
count(600)最近10分钟得到值的个数
count(600,12)最近10分钟得到值的个数等于12
count(600,12,"gt")最近10分钟得到值的个数大于12
count(#10,12,"gt")最近10个值中,值大于12的个数
count(600,12,"gt",86400)24小时之前的10分钟内值大于12的个数
count(600,6/7,"band")-过去10分钟值最低三个有效位是 ‘110‘ (十进制)的个数
count(600,,,86400)24小时之前的10分钟数据值的个数
第一个参数:指定时间段
第二个参数:样本数据
第三个参数:操作参数
第四个参数:漂移参数
#支持的操作类型
eq: 相等
ne: 不相等
gt: 大于
ge: 大于等于
lt: 小于
le: 小于等于
like: 内容匹配

 

last (sec|#num,<time_shift>)  #最近的值,如果为秒,则忽略,#num表示最近第N个值,请注意当前的#num和其他一些函数的#num的意思是不同的

参数:秒或#num
支持值类型:float,int,str,text,log

例如:

last(0)等价于last(#1)

last(#3)表示最近**第**3个值(并不是最近的三个值)
本函数也支持第二个参数**time_shift**,例如
last(0,86400)返回一天前的最近的值
如果在history中同一秒中有多个值存在,Zabbix不保证值的精确顺序

logeventid (pattern)  #检查最近的日志条目的EventID是否匹配正则表达式.参数为正则表达式,POSIX扩展样式.当返回值为0时表示不匹配,1表示匹配

参数:string
支持值类型:log

 

max (sec|#num,<time_shift>)  #返回指定时间间隔的最大值.时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#)

参数:秒或#num
支持值类型:float,int

 

min (sec|#num,<time_shift>)  #返回指定时间间隔的最小值.时间间隔作为第一个参数可以是秒或收集值的数目(前缀为#)

参数:秒或#num
支持值类型:float,int

 

nodata (sec)  #当返回值为1表示指定的间隔(间隔不应小于30秒)没有接收到数据,0表示其他

参数:秒
支持值类型:any

返回值:

1 - 指定评估期没有接收到数据

0 - 其它

 

now  #返回距离Epoch(1970年1月1日00:00:00UTC)时间的秒数

支持值类型:any

 

 

 

date  #返回当前的时间,格式YYYYMMDD

支持值的类型: any

返回值如: 20150731

 

percentile (sec|#num,<time_shift>,percentage)  #一段时间的百分值,(percentage) 做为第三个参数

支持值的类型: float, int

percentage - 0 and 100 (包括)之间的一个浮点数,小数点后最多四位

sec or #num - 评估期以秒值或最新值个数(跟在#号后)表示time_shift (可选) - see avg()

 

prev  #返回之前的值,类似于last(#2)

支持值类型:float,int,str,text,log

 

regexp (pattern,<sec|#num>)  #检查最近的值是否匹配正则表达式,参数的正则表达式为POSIX扩展样式,第二个参数为秒数或收集值的数目,将会处理多个值.本函数区分大小写。当返回值为1时表示找到,0为其他

参数:第一个参数为string,第二个参数为秒或#num
支持值类型:str,log,text

返回值:

1 - 找到

0 - 其它

该函数区分大小写

 

str (pattern,<sec|#num>)  #查找最近值中的字符串。第一个参数指定查找的字符串,大小写敏感。第二个可选的参数指定秒数或收集值的数目,将会处理多个值。当返回值为1时表示找到,0为其他

参数:第一个参数为string,第二个参数为秒或#num
支持值类型:str,log,text

返回值:

1 - 找到

0 - 其它

该函数区分大小写

 

strlen (sec|#num,<time_shift>)  #指定最近值的字符串长度(并非字节),参数值类似于last函数.例如strlen(0)等价于strlen(#1),strlen(#3)表示最近的第三个值,strlen(0,86400)表示一天前的最近的值

参数:秒或#num
支持值类型:str,log,text

例如:

? strlen()(等同于 strlen(#1)) → 最新值的长度

? strlen(#3) → 最新的第三个值的长度

? strlen(,1d) → 一天前最新值的长度。

 

sum (sec|#num,<time_shift>)  #返回指定时间间隔中收集到的值的总和.时间间隔作为第一个参数支持秒或收集值的数目(以#开始).从Zabbix1.8.2开始,本函数支持time_shift作为第二个参数。可以查看avg函数获取它的用法

参数:秒或#num
支持值类型:float,int

 

time  #返回当前时间,格式为HHMMSS,例如123055

支持值类型:any

 

timeleft (sec|#num,<time_shift>,threshold,<fit>)  #达到阀值需要多久时间

例如:

? timeleft(#10,,0) → 根据最新的十个值估计项目值达到0需要的时间

? timeleft(1h,,100) → 根据过去一小时的值估计项目值达到100需要的时间

? timeleft(1h,1d,0) → 根据一天前的一个小时值估计项目值达到0需要的时间

? timeleft(1h,,200,polynomial2) → 根据过去一小时并按照二次多项式方式估计项目值达到200需要的时间

 

 

dayofmonth   #返回当前是本月的第几天(取值范围从1到31)

支持值的类型: any

 

dayofweek  #返回当前是本周的第几天

支持值的类型: any

 

delta (sec|#num,<time_shift>)   #返回时间间隔内的最大值与最小值的差值

参数:秒或#num

支持类型:float,int

 

diff  #返回值为1表示最近的值与之前的值不同,0为相同

支持值类型:float,int,str,text,log

 

forecast (sec|#num,<time_shift>,time,<fit>,<mode>)  #预算下一个值的最大值,最小值,差值或平均值

支持值的类型: float, int

例如:

? forecast(#10,,1h) → 根据最新的十个值估计一小时后的数值

? forecast(1h,,30m) → 根据过去一小时的值估计三十分钟后的数值

? forecast(1h,1d,12h) → 根据一天前的一个小时值估计十二个小时后的数值

? forecast(1h,,10m,exponential) → 根据过去一小时并按照指数函数方式估计十分钟后的数值

? forecast(1h,,2h,polynomial3,max) → 根据过去一小时并按照三次多项式方式估计两小时的最大数值

? forecast(#?2,,?-20m) → 根据最新的两个值估计二十分钟前的数值 (比使用last()或prev()函数更加精确, 特别是项目很少更新的时候, 比如说, 一小时一次)

 

fuzzytime (sec)  #返回值为1表示监控项值的时间戳与ZabbixServer的时间多N秒,0为其他.常使用system.localtime来检查本地时间是否与Zabbixserver时间相同

参数:秒

支持值类型:float,int

例如:

? fuzzytime(60)=0 → 如果时间差超过60秒,就会检测到一个问题

? vfs.file.time[/path/file,modify]键值检测文件是否长时间未更新

 

iregexp (pattern,<sec|#num>)  #该函数和 regexp() 类似,只是不区分大小写

支持值的类型: str, log, text

 

logseverity  #

返回最近日志条目的日志等级(logseverity).当返回值为0时表示默认等级,N为具体对应等级(整数,常用于Windowseventlogs).Zabbix日志等级来源于Windowseventlog的Information列

支持值类型:log

返回值:

0 - 默认等级

N - 对应的等级 (整数,常用语Windows event logs: 1 - Information, 2 - Warning, 4 - Error, 7 - Failure Audit, 8 - Success Audit, 9 - Critical, 10 - Verbose).

Zabbix从Windows event log Information域获取日志等级

 

logsource (pattern)  #检查最近的日志条目是否匹配参数的日志来源.当返回值为0时表示不匹配,1表示匹配。通场用于Windowseventlogs监控.例如logsource["VMWareServer"]

参数:string
支持值类型:log

返回值:

0 - 不匹配

1 - 匹配

通常用于Windows event logs. 例如, logsource("VMware Server")

 

 

<parameter>参数

常用的时间参数有以下几种:

s - seconds (when used, works the same as the raw value)
m - minutes
h - hours
d - days
w - weeks

 

也支持使用容量参数:

K - kilo
M - mega
G - giga
T - tera

 

举例参数的等效转换,参数1中的参数可以等效使用参数2中的进行替换:

  参数1:

{host:zabbix[proxy,zabbix_proxy,lastaccess]}>120
{host:system.uptime[].last(0)}<86400
{host:system.cpu.load.avg(600)}<10

参数2:
{host:zabbix[proxy,zabbix_proxy,lastaccess]}>2m
{host:system.uptime.last(0)}<1d
{host:system.cpu.load.avg(10m)}<10

 

 

优先级

操作符

定义

1

/

2

*

3.

- - - - - -

4

+

5

<

小于 , 用法 :

A < B ? (A <= B - 0.000001)

6

>

大于 , 用法 :

A > B ? (A>= B + 0.000001)

7

#

不等于 , 用法 :

A # B?(A<= B - 0.000001) | (A >= B + 0.000001)

8

=

等于 , 用法 :

A = B ? (A > B - 0.000001) & (A < B + 0.000001)

9

&

逻辑与

10

|

逻辑或

 

在表达式中#可以有更多的作用:

sum(600):表示在600秒之内接收到所有值的和

sum(#5):表示最后5个值的和

如果最近的获取的5个值为3, 7, 2, 6, 5

last(#2) would return 7

last(#5) would return 5

 

  

 

 

 

 

 

 

 

 

 

 

 



































































以上是关于触发器例子的主要内容,如果未能解决你的问题,请参考以下文章

oracle触发器的小例子

oracle触发器及异常处理 简单例子

MySQL基础知识09触发器

sql 应用自定义逻辑以防止某些用户通过应用登录触发器登录MSSQL。这个特定的例子着眼于用户的na

SQL server触发器中 update insert delete 分别给写个例子被

mysql触发器