概述:觸發器中的表達式使用很靈活,咱們能夠建立一個複雜的邏輯測試監控,觸發器表達式形式以下:node
{<server>:<key>.<function>(<parameter>)}<operator><constant>
{主機:key.函數(參數)}<表達式>常數,具體的例子,請接着往下走,很簡單nginx
Functions函數:觸發器functions能夠引用檢索到的值,當前時間或者其餘元素。觸發器表達式支持的function完整列表請點擊官網地址 supported functionsweb
Function參數----大多數數值functions可使用秒來做爲參數。你可使用前綴「#」來表示它有不一樣的含義express
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小時內的平均數據。windows
[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 | | | 邏輯或 |
觸發器示例網絡
{www.zabbix.com:system.cpu.load[all,avg1].last(0)}>5
觸發器說明:app
www.zabbix.com:host名稱frontend
system.cpu.load[all,avg1]:item值,一份內cpu平均負載值tcp
last(0):最新值
>5:最新值大於5
如上所示,www.zabbix.com這個主機的監控項,最新的CPU負載值若是大於5,那麼表達式會返回true,這樣一來觸發器狀態就改變爲「problem」了。
{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.
{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff(0)}>0
/etc /passwd最新的checksum與上一次獲取到的checksum不一樣,表達式將會返回true. 咱們可使用一樣的方法監控系統重要的配置文件,例如/etc/passwd,/etc/inetd.conf等等。這些zabbix通常都會自帶,沒帶 的你本身加上吧。
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
當前主機網卡eth0最後5分鐘內接收到的流量超過100KB那麼觸發器表達式將會返回true
{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.zabbix.com:agent.version.str("beta8")}=1
若是當前zabbix agent版本包含beta8(假設當前版本爲1.0beta8),這個表達式會返回true.
{zabbix.zabbix.com:icmpping.count(30m,0)}>5
如上表達式表示最近30分鐘zabbix.zabbix.com這個主機超過5次不可到達。
{zabbix.zabbix.com:tick.nodata(3m)}=1
tick 爲Zabbix trapper類型,首先咱們要定義一個類型爲Zabbix trapper,key爲tick的item。咱們使用zabbix_sender按期發送數據給tick,若是在3分鐘內還未收到 zabbix_sender發送來的數據,那麼表達式返回一個true,與此同時觸發器的值變爲「PROBLEM」。
{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」
{MySQL_DB:system.localtime.fuzzytime(10)}=0
主機MySQL_DB當前服務器時間若是與zabbix server之間的時間相差10秒以上,表達式返回true,觸發器狀態改變爲「problem」
{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.
簡單的說觸發器狀態轉變爲problem須要一個條件,從problem轉變回來還須要一個條件才行。通常觸發器只須要不知足觸發器爲problem條件便可恢復。明白了麼?不明白就看例子吧。
有時候觸發器須要使用不一樣的條件來表示不一樣的狀態,舉個官網頗有趣的例子:機房溫度正常穩定爲15-20°,當溫度超過20°,觸發器值爲problem,直到溫度低於15°纔會接觸警報,異常會解除。別整這些沒用的,咱們看實例.
爲了達到這個效果,咱們須要使用以下觸發器表達式:
({TRIGGER.VALUE}=0&{server:temp.last(0)}>20)|({TRIGGER.VALUE}=1&{server:temp.last(0)}<15)
如上有兩個小括號,前面一個表示觸發異常的條件,後面一個表達式表示解除異常的條件。
注意:宏變量 {TRIGGER.VALUE}將會返回當前觸發器的值
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觸發器能夠設置依賴性,例如我配置了兩個觸發器,一個觸發器定義www.ttlsa.com這個HOST是否在運行中,另外一個是www.ttlsa.com的網絡是否通暢。假如網絡出現故障,可是ttlsa服務器並未出現故障,咱們依舊會收到這兩個觸發器給到的故障通知。
如今的問題很明顯,HOST是正常的,確定不但願收到他的故障信息,由於它正常工做。因此在配置HOST觸發器時,咱們須要增長依賴關係,依賴網絡是否暢通這個觸發器。一旦網絡出現故障,將不會出發HOST故障的通知。單個觸發器能夠依賴於多個觸發器。
一臺HOST的觸發器能夠依賴其餘HOST的觸發器,可是注意不要有死循環依賴。好比A依賴B,B依賴C,C又依賴A。一個圓圈,沒完沒了。以下是A依賴B,B又依賴A,根本依賴不了,有以下報錯。
zabbix觸發器依賴(1)
一個模板的觸發器能夠依賴另一個模板的觸發器,例如模板A觸發器依賴模板B觸發器。一個HOST要連接A模板,那麼它同時要連接A模板(由於模 板A中的觸發器依賴了模板B中的觸發器),可是HOST能夠單獨連接模板B(B是被依賴)。在一個host單獨連接template A,結果出現以下錯誤,因此別忘記了一塊兒把template B也連接到HOST中。
zabbix觸發器依賴(2)
模板中的觸發器能夠依賴HOST中的觸發器。若是某個HOST連接這類模板,那麼HOST建立的相應的觸發器也一樣會依賴那個HOST的觸發器。 舉個官方的例子,某個模板中的一些觸發器依賴了route/主機的觸發器,凡事連接(理解爲套用)了這個模板的機器都會依賴這些router/主機。說了 那麼多,其實就是繼承了。
HOST中的觸發器不能依賴模板中的觸發器。
編輯觸發器,選擇選項卡「dependencies」,點擊Add,選擇你須要依賴的觸發器,以下圖:
zabbix觸發器依賴(3)
而後點擊保存,能夠看到觸發器多了一個depend on
zabbix觸發器依賴(4)
借用官方文檔的示例,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觸發器怎麼建立和配置,方法很簡單,請你們往下讀,有什麼問題請留言。
建立觸發器步驟:
點擊Configuration(配置) → Hosts(主機)
點擊hosts(主機)相關行的trigger
點擊右上角的建立觸發器(create trigger),你也能夠修改列表中的觸發器
在表單中輸入相應的信息
以下爲觸發器
zabbix觸發器配置
參數介紹
參數 | 描述 |
---|---|
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 | 當前觸發器是否啓用 |
上圖你們能夠看到有個Dependencies,他是作什麼的? 翻譯爲依賴,具體的用法咱們後面章節來說
severity一般用來定義當前item的一個狀態的嚴重性。咱們能夠根據不一樣的嚴重性來定義不一樣的事件,例如報警,zabbix自帶以下嚴重性定義。
SEVERITY | DEFINITION | 顏色 |
---|---|---|
Not classified | 未知. | 灰色 |
Information | 通常信息. | 淺綠 |
Warning | 警告 | ××× |
Average | 通常問題. | 橙色 |
High | 嚴重問題. | 紅色 |
Disaster | 災難,會帶來損失的那種. | 深紅 |
可視化顯示,不一樣級別顯示不一樣顏色,例如通常嚴重性爲綠色
聲音報警,不一樣的級別不一樣聲音.
使用用戶自定義媒體報警,例如嚴重問題發短信,其餘問題發送郵件。
根據嚴重性來定義是否報警
能夠自定義觸發器嚴重性以及顏色,請參考:customise trigger severity names and colours.
觸發器嚴重性介紹
觸發器嚴重性命名以及顏色定義均可以在zabbix web後臺定義,點擊Administration(管理) → General (常規)→ Trigger severities(觸發器嚴重性)。這邊定義好的顏色在每一個不一樣主題/風格里面都是同樣的。
全部系統默認的觸發器名字在各國的語言包中都有翻譯,可是你自定義的其餘語言包不會給你翻譯,由於在語言包裏面沒有這一個項目。那麼怎麼保證各國語言包裏面都能相應的翻譯自定義的嚴重性呢?
咱們知道zabbix默認定義了6個觸發器嚴重性,分別爲:Not classified、Information、Warning、Average、High、Disaster,有些人以爲High很差理解或者以爲描述不滿意,想改爲Important,請看以下操做:
點擊Administration(管理) → General (常規)→ Trigger severities(觸發器嚴重性),將High改成important,固然這裏你也能夠自定義你的顏色,咱們這邊就再也不敖述了,修改完以後點擊保存。
zabbix修改嚴重性名稱
# /data/site/monitor.ttlsa.com/locale/en_US/LC_MESSAGES/frontend.po msgid "Important"msgstr "very Import"
須要執行locale目錄下的make_mo.sh文件,若是出現./make_mo.sh: line 4: msgfmt: command not found,那麼請你先安裝msgfmt
# yum install gettext
而後執行make_mo.sh
# ./make_mo.sh
效果
隨意選擇一個Host的觸發器列表,看左邊信息,請看以下圖<
severities修改並翻譯
在 自定義觸發器名稱以前應該顯示High的,這邊被咱們修改爲了Very Import。zabbix是一個多語言監控系統,若是你想切換到中文環 境,那麼你須要修改zh_CN下的frontend.po,而後make_mo.sh建立frontend.mo。不然將只會顯示Important,如 下:
severities未翻譯
這邊直接顯示觸發器的MSGID,由於你沒翻譯。
6個觸發器級別,名稱隨你修改,可是大多數狀況下咱們都不須要修改,默認的挺好的,不是嗎?非要自定義,我不攔你。
zabbix觸發器方法prev用於獲取item前一個返回值,與方法last(#2)是一樣的意思
zabbix獲取前一個返回值
以下是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
獲取當前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與上一節的abschange多了時間概念。上一節僅僅是取先後兩個值對比,avg有以下取值方式:
最後N個值
最近XX時間,例如最近1h
以上1和2還要結合time_thift時間偏移參數,例如1h
zabbix-function-avg
以下是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,能平均的除了數字還有誰?
有以下做用:
獲取一個時間週期內最大值
獲取幾個返回值中的最大值
以上方法,時間往前推移1分鐘,1小時,1天等等
文字以下
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
功能和上一節將的max整好相反,咱們將結合max、min來一個更有意思的實例。
,有以下做用:
獲取一個時間週期內最小值
獲取幾個返回值中的最小值
以上方法,時間往前推移1分鐘,1小時,1天等等
文字以下
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)
監控實戰中,每一個同窗對觸發器告警條件要求各不相同,so,zabbix提供了幾十個方法提供使用。部分人對如下功能也不甚瞭解。接下來,我會一一講解下圖function與zabbix提供function的對應關係,以及他們的功能。
zabbix-function
以下是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