zabbix觸發器表達式詳解
概述:觸發器中的表達式使用很靈活,我們可以創建一個復雜的邏輯測試監控,觸發器表達式形式如下:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
{主機:key.函數(參數)}<表達式>常數,具體的例子,請接着往下走,很簡單
Functions函數:觸發器functions可以引用檢索到的值,當前時間或者其他元素。觸發器表達式支持的function完整列表請點擊官網地址 supported functions
Function參數----大多數數值functions可以使用秒來作為參數。你可以使用前綴“#”來表示它有不同的含義
FUNCTION CALL | 描述 |
---|---|
sum(600) | 600秒內的總和 |
sum(#5) | 最新5個值的和 |
last函數使用不同的參數將會得到不同的值,#2表示倒數第二新的數據。例入從老到最新值為1,2,3,4,5,6,7,8,9,10,last(#2)得到的值為9,last(#9)得到的值為2。last函數必須包含參數。
AVG,count,last,min和max函數還支持額外的參數,以秒為單位的參數time_shift(時間偏移量)。例如avg(1h,1d),那么將會獲取到昨天的1小時內的平均數據。
[warning]備注:觸發器表達式需要使用history歷史數據來計算,如果history不可用(time_shift時間偏移量參數無法使用),因此history記錄一定要保留長久一點,至少要保留需要用的記錄。[/warning]
觸發器表達式可以使用單位符號來替代大數字,例如5m替代300,或者1d替代86400,1k替代1024字節等等。
操作符
優先級 | 操作 | 定義 |
---|---|---|
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 | = | 等於. T用法如下: A=B ⇔ (A>B-0.000001) & (A<B+0.000001) |
9 | & | 邏輯與 |
10 | | | 邏輯或 |
觸發器示例
示例---觸發器名稱:Processor load is too high on www.zabbix.com
{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5
觸發器說明:
www.zabbix.com:host名稱
system.cpu.load[all,avg1]:item值,一分內cpu平均負載值
last(0):最新值
>5:最新值大於5
如上所示,www.zabbix.com這個主機的監控項,最新的CPU負載值如果大於5,那么表達式會返回true,這樣一來觸發器狀態就改變為“problem”了。
示例二---觸發器名稱:www.zabbix.com is overloaded
{www.zabbix.com: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():
{www.zabbix.com: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:
{www.zabbix.com: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,直到溫度低於15°才會接觸警報,異常會解除。別整這些沒用的,我們看實例.
為了達到這個效果,我們需要使用如下觸發器表達式:
示例1---觸發器名稱: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}將會返回當前觸發器的值
示例2---觸發器名稱:Free disk space is too low
Problem: 最近5分鍾剩余磁盤空間小於10GB。(異常)
Recovery: 最近10分鍾磁盤空間大於40GB。(恢復)
簡單說便是一旦剩余空間小於10G就觸發異常,然后接下來剩余空間必須大於40G才能解除這個異常,就算你剩余空間達到了39G(不在報警條件里)那也是沒用的,有意思不!
({TRIGGER.VALUE}=0&{server:vfs.fs.size[/,free].max(5m)}<10G) | ({TRIGGER.VALUE}=1&{server:vfs.fs.size[/,free].min(10m)}<40G)
結尾
這篇文章很有必要細細讀,很重要。
zabbix觸發器依賴關系詳解
概述
zabbix觸發器可以設置依賴性,例如我配置了兩個觸發器,一個觸發器定義www.ttlsa.com這個HOST是否在運行中,另一個是www.ttlsa.com的網絡是否通暢。假如網絡出現故障,但是ttlsa服務器並未出現故障,我們依舊會收到這兩個觸發器給到的故障通知。
現在的問題很明顯,HOST是正常的,肯定不希望收到他的故障信息,因為它正常工作。所以在配置HOST觸發器時,我們需要增加依賴關系,依賴網絡是否暢通這個觸發器。一旦網絡出現故障,將不會出發HOST故障的通知。單個觸發器可以依賴於多個觸發器。
觸發器依賴要點
- 一台HOST的觸發器可以依賴其他HOST的觸發器,但是注意不要有死循環依賴。比如A依賴B,B依賴C,C又依賴A。一個圓圈,沒完沒了。如下是A依賴B,B又依賴A,根本依賴不了,有如下報錯。
- 一個模板的觸發器可以依賴另外一個模板的觸發器,例如模板A觸發器依賴模板B觸發器。一個HOST要鏈接A模板,那么它同時要鏈接A模板(因為模 板A中的觸發器依賴了模板B中的觸發器),但是HOST可以單獨鏈接模板B(B是被依賴)。在一個host單獨鏈接template A,結果出現如下錯誤,所以別忘記了一起把template B也鏈接到HOST中。
- 模板中的觸發器可以依賴HOST中的觸發器。如果某個HOST鏈接這類模板,那么HOST創建的相應的觸發器也同樣會依賴那個HOST的觸發器。 舉個官方的例子,某個模板中的一些觸發器依賴了route/主機的觸發器,凡事鏈接(理解為套用)了這個模板的機器都會依賴這些router/主機。說了 那么多,其實就是繼承了。
- HOST中的觸發器不能依賴模板中的觸發器。
配置
編輯觸發器,選擇選項卡“dependencies”,點擊Add,選擇你需要依賴的觸發器,如下圖:
然后點擊保存,可以看到觸發器多了一個depend on
多個依賴實例
借用官方文檔的示例,Host前面有個Router2,Router2前面有Router1,如下:
Zabbix - Router1 - Router2 - Host
如果Router1掛了,很明顯Router2和Host連不上,我們不希望收到關於連不上Router2和HOST的通知,因此,我們定義了如下依賴關系:
'Host is down' trigger depends on 'Router2 is down' trigger'Router2 is down' trigger depends on 'Router1 is down' trigger
在觸發器將Host的狀態改變為'Host is down'之前,它會檢查host相關的依賴,這時候如果發現它依賴的觸發器只要出現一個problem狀態,那么當前觸發器狀態不會變化,這樣一來action不會執行,報警通知sms/email自然也不會發送了。
zabbix會遞歸執行檢測,如果router1或者router2有一個出現連不上,那么Host的觸發器不會有任何的改變。
zabbix創建觸發器trigger
1. 創建觸發器
了解了什么觸發器,接下來看下zabbix觸發器怎么創建和配置,方法很簡單,請大家往下讀,有什么問題請留言。
創建觸發器步驟:
- 點擊Configuration(配置) → Hosts(主機)
- 點擊hosts(主機)相關行的trigger
- 點擊右上角的創建觸發器(create trigger),你也可以修改列表中的觸發器
在表單中輸入相應的信息
2. 配置觸發器
如下為觸發器
參數介紹
參數 | 描述 |
---|---|
Name | 觸發器名稱. 名稱可以包含宏變量: {HOST.HOST}, {HOST.NAME}, {HOST.CONN}, {HOST.DNS}, {HOST.IP}, {ITEM.VALUE}, {ITEM.LASTVALUE} and {$MACRO} .$1, $2…$9 可以被用來關聯表達式的常量 示例: name:Processor load above $1 on {HOST.NAME}” 表達式:system.cpu.load[percpu,avg1].last(0)}>5 會顯示為:Processor load above 5 on ttlsa雲服務器 |
Expression | 計算觸發器狀態的邏輯表達式,這邊設置為上一次值等於0 |
Multiple PROBLEM events generation | 通過設置該選項,你可以在觸發器產生problem的時候觸發一個事件 |
Description | 觸發器的描述,一般name寫的不清楚,這邊可以具體描述這個觸發器的作用,例如nginx當前離線,請處理等等。Zabbix 2.2版本開始,支持觸發器名稱。 |
URL | 在Monitoring → Triggers中,可以看到URL並且可以點擊,一般情況下他需要配合觸發器ID來使用,在url中包含觸發器ID(宏變量 {TRIGGER.ID}),這樣可以直接點擊到具體觸發器中。 |
Severity | 設置嚴重性級別,上圖我設置為“災難”,你可以相應的設置警告、嚴重等狀態的觸發器 |
Enabled | 當前觸發器是否啟用 |
3. 觸發器依賴
上圖大家可以看到有個Dependencies,他是做什么的? 翻譯為依賴,具體的用法我們后面章節來講
zabbix觸發器嚴重性定義Trigger severity
severity通常用來定義當前item的一個狀態的嚴重性。我們可以根據不同的嚴重性來定義不同的事件,例如報警,zabbix自帶如下嚴重性定義。
Trigger severity表格
SEVERITY | DEFINITION | 顏色 |
---|---|---|
Not classified | 未知. | 灰色 |
Information | 一般信息. | 淺綠 |
Warning | 警告 | 黃色 |
Average | 一般問題. | 橙色 |
High | 嚴重問題. | 紅色 |
Disaster | 災難,會帶來損失的那種. | 深紅 |
severities 用途
- 可視化顯示,不同級別顯示不同顏色,例如一般嚴重性為綠色
- 聲音報警,不同的級別不同聲音.
- 使用用戶自定義媒體報警,例如嚴重問題發短信,其他問題發送郵件。
- 根據嚴重性來定義是否報警
可以自定義觸發器嚴重性以及顏色,請參考:customise trigger severity names and colours.
zabbix自定義觸發器嚴重性
觸發器嚴重性介紹
觸發器嚴重性命名以及顏色定義都可以在zabbix web后台定義,點擊Administration(管理) → General (常規)→ Trigger severities(觸發器嚴重性)。這邊定義好的顏色在每個不同主題/風格里面都是一樣的。
所有系統默認的觸發器名字在各國的語言包中都有翻譯,但是你自定義的其他語言包不會給你翻譯,因為在語言包里面沒有這一個項目。那么怎么保證各國語言包里面都能相應的翻譯自定義的嚴重性呢?
我們知道zabbix默認定義了6個觸發器嚴重性,分別為:Not classified、Information、Warning、Average、High、Disaster,有些人覺得High不好理解或者覺得描述不滿意,想改成Important,請看如下操作:
設置觸發器名稱
點擊Administration(管理) → General (常規)→ Trigger severities(觸發器嚴重性),將High改為important,當然這里你也可以自定義你的顏色,我們這邊就不再敖述了,修改完之后點擊保存。
添加內容到frontend.po
# /data/site/monitor.ttlsa.com/locale/en_US/LC_MESSAGES/frontend.po msgid "Important" msgstr "very Import"
[warning]備注:/data/site/monitor.ttlsa.com/是您zabbix站點根目錄[/warning]
創建.mo文件
需要執行locale目錄下的make_mo.sh文件,如果出現./make_mo.sh: line 4: msgfmt: command not found,那么請你先安裝msgfmt
# yum install gettext
然后執行make_mo.sh
# ./make_mo.sh
效果
隨意選擇一個Host的觸發器列表,看左邊信息,請看如下圖<
在 自定義觸發器名稱之前應該顯示High的,這邊被我們修改成了Very Import。zabbix是一個多語言監控系統,如果你想切換到中文環 境,那么你需要修改zh_CN下的frontend.po,然后make_mo.sh創建frontend.mo。否則將只會顯示Important,如 下:
這邊直接顯示觸發器的MSGID,因為你沒翻譯。
最后
6個觸發器級別,名稱隨你修改,但是大多數情況下我們都不需要修改,默認的挺好的,不是嗎?非要自定義,我不攔你。
zabbix獲取上一個值prev zabbix觸發器函數
zabbix觸發器方法prev用於獲取item前一個返回值,與方法last(#2)是同樣的意思
zabbix觸發器方法prev - web界面
如下是web界面提供的功能:
Previous value is > N
Previous value is < N Previous value is = N Previous value is NOT N
zabbix觸發器方法prev - 實例
CPU前一個負載值大於0.7
{dd-pre-01:system.cpu.load[percpu,avg1].prev()}>0.7
或者使用last獲得同樣的效果
{dd-pre-01:system.cpu.load[percpu,avg1].last(#2)}>0.
zabbix觸發器方法prev - 支持類型
它支持類型包括:float, int, str, text, log
zabbix獲取當前UNIX時間戳now zabbix觸發器函數
獲取當前UNIX時間戳,UNIX時間戳是什么?當前距離1970年1月1日00:00:00一共多少秒。使用zabbix觸發器函數:now(),舉一個簡單的例子。
2020年1月1日0時0分0秒(UNIX時間戳:1577808000)到2020年2月1日0時0分0秒(UNIX時間戳:1580486400)之間,cpu1分鍾負載大於1觸發告警。例子意義不大,希望大家舉一反三。
{ttlsa-server:system.cpu.load[all,avg1].last()}>1 and {ttlsa-server:system.cpu.load[all,avg1].now()}>1577808000 and {ttlsa-server:system.cpu.load[all,avg1].now()}<1580486400
zabbix取平均值avg zabbix觸發器函數
zabbix觸發器方法avg與上一節的abschange多了時間概念。上一節僅僅是取前后兩個值對比,avg有如下取值方式:
- 最后N個值
- 最近XX時間,例如最近1h
- 以上1和2還要結合time_thift時間偏移參數,例如1h
zabbix觸發器方法avg - web界面
如下是web界面提供的功能:
Average value of a period is < N
Average value of a period is > N Average value of a period is = N Average value of a period is NOT N
zabbix觸發器方法avg - 實例
CPU負載最近一小時平均值等於1
{dd-pre-01:system.cpu.load[percpu,avg1].avg(1h)}=1
CPU負載昨天當前時間的上一小時平均值等於1,1d表示時間往前推移1天,你可以寫1h,1m,10d,現在明白了time_thrift的用法了吧?
{dd-pre-01:system.cpu.load[percpu,avg1].avg(1h,1d)}=1
CPU負載最近10次的平均值等於1
{dd-pre-01:system.cpu.load[percpu,avg1].avg(#10)}=1
昨天同一時間CPU負載最近10次的平均值等於1
{dd-pre-01:system.cpu.load[percpu,avg1].avg(#10,1d)}=1
zabbix觸發器方法avg - 支持類型
它支持類型包括:float, int,能平均的除了數字還有誰?
獲取最大值max zabbix觸發器函數
zabbix觸發器函數max - 作用
有如下作用:
- 獲取一個時間周期內最大值
- 獲取幾個返回值中的最大值
- 以上方法,時間往前推移1分鍾,1小時,1天等等
zabbix觸發器函數max - 對應web
文字如下
Maximum value for period T is > N Maximum value for period T is < N Maximum value for period T is = N Maximum value for period T is NOT N
zabbix觸發器函數max - 例子
語法:max (sec|#num,<time_shift>)
一個小時內cpu負載最大值超過10
{dd-pre-01:system.cpu.load[percpu,avg1].max(1h)}>10
cpu負載最近10個返回值,最大值超過10
{dd-pre-01:system.cpu.load[percpu,avg1].max(#10)}>10
最小值min zabbix觸發器函數
功能和上一節將的max整好相反,我們將結合max、min來一個更有意思的實例。
zabbix觸發器函數min - 作用
,有如下作用:
- 獲取一個時間周期內最小值
- 獲取幾個返回值中的最小值
- 以上方法,時間往前推移1分鍾,1小時,1天等等
zabbix觸發器函數min - 對應web
文字如下
Minimum value for period T is > N Minimum valuefor period T is < N Minimum value for period T is = N Minimum value for period T is NOT N
zabbix觸發器函數min - 例子
語法:min(sec|#num,<time_shift>)
一個小時內cpu負載最小值小於0.2
{dd-pre-01:system.cpu.load[percpu,avg1].min(1h)}<0.2
cpu負載最近10個返回值,最小值小於0.2
{dd-pre-01:system.cpu.load[percpu,avg1].min(#10)}<0.2
zabbix觸發器函數min/max - 實例
觸發器名稱:Free disk space is too low
Problem: 最近5分鍾剩余磁盤空間小於10GB。(異常)
Recovery: 最近10分鍾磁盤空間大於40GB。(恢復)
講解:簡單說便是一旦剩余空間小於10G就觸發異常,然后接下來剩余空間必須大於40G才能解除這個異常,就算你剩余空間達到了39G(不在報警條件里)那也是沒用的.
({TRIGGER.VALUE}=0 and {server:vfs.fs.size[/,free].max(5m)}<10G) or ({TRIGGER.VALUE}=1 and {server:vfs.fs.size[/,free].min(10m)}<40G)
abschange前后差值 zabbix觸發器函數
監控實戰中,每個同學對觸發器告警條件要求各不相同,so,zabbix提供了幾十個方法提供使用。部分人對以下功能也不甚了解。接下來,我會一一講解下圖function與zabbix提供function的對應關系,以及他們的功能。
zabbix取前后差值(絕對值)- abschange
如下是web界面提供的功能:
Absolute difference between last and previous value is = N
Absolute difference between last and previous value is > N
Absolute difference between last and previous value is < N
Absolute difference between last and previous value is NOT N
通過實例來一一了解它,例子也許很滑稽很不合理,但是大家可以舉一反三,它只是一個例子
如果(每核)CPU 1分鍾負載浮動1(突然增加1,1分鍾后又降低1)
{ttlsa-web-01:system.cpu.load[percpu,avg1].abschange()}=1
如果(每核)CPU 1分鍾負載浮動大於1
{ttlsa-web-01:system.cpu.load[percpu,avg1].abschange()}>1
如果(每核)CPU 1分鍾負載浮動小於1
{ttlsa-web-01:system.cpu.load[percpu,avg1].abschange()}<1
如果(每核)CPU 1分鍾負載浮動不等於1
{ttlsa-web-01:system.cpu.load[percpu,avg1].abschange()}<>1
abschange支持類型
它支持類型包括:float, int, str, text, log,它不僅僅支持數值,還支持字符串。如果取值為字符串,那么字符串相同值為0,不同則為1
如下為主機名發生變更的觸發器表達式
{ttlsa-web-01:system.hostname.abschange()}=1