3 觸發器
概述
觸發器是“評估”由項目采集的數據並表示當前系統狀況的邏輯表達式。
當監控項用於采集系統的數據時,始終遵循這些數據是非常不切合實際的,因為這些數據始終在等待一個令人擔憂或者值得關注的狀態。然而這個“評估”數據的工作可以留給觸發器表達式。
觸發器表達式允許定義一個什么狀況的數據是“可接受”的閾值。因此,如果接收的數據超過了可接受的狀態,則觸發器會被觸發 - 或將狀態更改為PROBLEM.
一個觸發器可以擁有下面幾種狀態:
每當Zabbix server接收到作為表達式一部分的新值時,都會重新計算觸發器狀態(表達式)。
如果在表達式中使用基於時間的函數(nodata(), date(), dayofmonth(), dayofweek(), time(), now()),觸發器就會由Zabbix timer進程每30秒重新計算一次。如果在表達式中同時使用基於時間和非基於時間的函數,當接收到一個新值和每隔30秒都會重新計算觸發器的狀態。
你可以構建不同復雜程度的觸發器表達式
1 配置一個觸發器
概述
配置一個觸發器,請執行以下操作:
點擊Zabbix上方菜單欄的Configuration → Hosts
在Host那一行點擊Triggers
在右上角點擊Create Trigger(或者在觸發器名稱上編輯一個現有的觸發器)
在打開的頁面輸入觸發器的參數
配置
Trigger標簽頁包含了所有必需的觸發器屬性。
Dependencies標簽頁包含觸發器的所有dependencies。
點擊Add來添加一個新的依賴關系。
你也可以打開一個現有的觸發器,點擊Clone按鈕,以一個不同的名稱保存為新的觸發器。
2 觸發器表達式
概述
觸發器中使用的表達式是非常靈活的。你可以使用他們去創建關於監控統計的復雜邏輯測試。
一個簡單有效的表達式看起來像:
{
12 函數
觸發器函數允許引用收集的值,當前時間和其他因素。
可以使用的被支持函數的完整列表。
13 函數參數
大多數數字型的函數接受秒數來作為參數。
你可以使用前綴#來指定參數具有不同的含義:
函數last當以#作為前綴使用時,值具有不同的含義,它會讓她會選擇第N個的上一個值,所以給定值3、7、2、6、5(按照時間順序,第一個值3為最新值),last(#2) 將返回值為7 ,last(#5) 將返回值為5。
avg, count, last, min and max 函數支持額外的第二個參數time_shift(時間偏移量)。這個參數允許從過去一段時間內引用數據。例如,avg(1h,1d)將會返回一天前1小時的平均值。
你可以在觸發器表達式中使用支持的單位符號,例如“5m”(分鍾)可以被“300”秒代替,“1d”(天)可以被“86400”秒代替。“1k”代表“1024”bytes。
14 運算符
觸發器支持的運算符(在執行中優先級遞減)
not, and and or 運算符區分大小寫,而且必須為小寫。它們也必須被空格或括號包圍。
所有運算符中,除了unary - and not,都有從左到右的關聯性。Unary - and not All operators, except unary - and not, have left-to-right associativity. Unary - and not are non-associative (meaning -(-1) and not (not 1) should be used instead of --1 and not not 1).
計算結果:
<, <=, >, >=, =, <> 如果指定的關系為真(ture),則運算符將會在觸發器表達式中產生“1”;如果指定的關系為假(false),則返回“0”。如果一個運算對象為“Unknown”,那么結果為Unknown;
and 對於已知的運算對象,如果兩個運算對象的比較不等於“0”,則運算符將會在觸發器表達式中產生“1”,否則,它產生“0”;對於未知的運算對象,如果兩個運算對象的比較等於“0”,則會產生“0”,否則,則會產生“Unknown”;
or 對於已知的運算對象,如果其中任意一個運算對象的比較不等於“0”,則運算符會在觸發器表達式中產生“1”,否則,它產生“0”;對於未知的運算對象進行“or”運算,則只有當一個運算對象的比較不等於“0”,才會產生“1”,否則,它會產生“Unknown”;
如果運算單位的值不等於“0”,那么邏輯否定運算符not對於已知運算對象的結果為“0”;
The result of the logical negation operator not for a known operand is '0' if the value of its operand compares unequal to '0'; '1' if the value of its operand compares equal to '0'. For unknown operand not yields 'Unknown'.
15 觸發器示例
示例 1
觸發器名稱:Processor load is too high on www.zabbix.com。觸發器表達式如下:
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5
“www.zabbix.com:system.cpu.load[all,avg1]” 給出了被監控對象參數的簡短名稱。它指定了服務器是“www.zabbix.com”,監控項的鍵值是“system.cpu.load[all,avg1]”。通過使用函數“last()”獲取最近一次獲取的值。最后,“>5”表示來自主機www.zabbix.com的最后一次獲取的負載值大於5時觸發器就會進入PROBLEM狀態。
示例 2
觸發器名稱:www.zabbix.com is overloaded。觸發器表達式如下:
{www.zabbix.com:system.cpu.load[all,avg1].last()}>5 or {www.zabbix.com:system.cpu.load[all,avg1].min(10m)}>2
當負載大於5或者最近10分鍾內負載大於2,表達式為“TURE”,就會使觸發器進入PROBLEM狀態。
示例 3
觸發器名稱:/etc/passwd has been changed。觸發器表達式如下:
使用了函數“diff“:
{www.zabbix.com:vfs.file.cksum[/etc/passwd].diff()}=1
當文件/etc/passwd檢查的checksum值與最近的值不同時,表達式為“TURE”,就會使觸發器進入PROBLEM狀態。 同樣的表達式還可以用於監控重要的文件,比如文件/etc/passwd、/etc/inetd.conf、/kernel等等。
示例 4
觸發器名稱:Someone is downloading a large file from the Internet。觸發器表達式如下:
使用函數“min”:
{www.zabbix.com:net.if.in[eth0,bytes].min(5m)}>100K
當網絡適配器“eth0”在5分鍾內接收的字節大於100KB,表達式為“TURE”,就會使觸發器進入PROBLEM狀態。
示例 5
觸發器名稱:Both nodes of clustered SMTP server are down。觸發器表達式如下:
注意:在同一個表達式中使用了兩個不同的主機
{smtp1.zabbix.com:net.tcp.service[smtp].last()}=0 and {smtp2.zabbix.com:net.tcp.service[smtp].last()}=0
當SMTP服務器“smtp1.zabbix.com”和“smtp2.zabbix.com”都停止,表達式為“TURE”,就會使觸發器進入PROBLEM狀態。
示例 6
觸發器名稱:Zabbix agent needs to be upgraded。觸發器表達式如下:
使用函數“str()”:
{zabbix.zabbix.com:agent.version.str("beta8")}=1
如果Zabbix agent有beta8版本(大概為1.0beta8),表達式為“TURE”,就會使觸發器進入PROBLEM狀態。
示例 7
觸發器名稱:Server is unreachable。觸發器表達式如下:
{zabbix.zabbix.com:icmpping.count(30m,0)}>5
當主機“zabbix.zabbix.com”在30分鍾內超過5次不可達,表達式為“TURE”,就會使觸發器進入PROBLEM狀態。
示例 8
觸發器名稱:No heartbeats within last 3 minutes。觸發器表達式如下:
使用函數“nodata()”:
{zabbix.zabbix.com:tick.nodata(3m)}=1
'tick'必須為'Zabbix trapper'類型。為了使這個觸發器工作,監控項'tick'必須要定義,這個主機應使用zabbix_sender定期發送此參數的數據,如果在180秒內還未收到zabbix_sender發送的數據,那么觸發器的狀態就會變成PROBLEM。
示例9
CPU activity at night time 觸發器的名稱為:CPU activity at night time
使用了函數time():
{zabbix:system.cpu.load[all,avg1].min(5m)}>2 and {zabbix:system.cpu.load[all,avg1].time()}>000000 and {zabbix:system.cpu.load[all,avg1].time()}<060000
只有在凌晨0點到6點整,最后5分鍾內cpu load大於2,觸發器的狀態才會變更為PROBLEM。
示例 10
觸發器名稱: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秒以上,就會使觸發的狀態變更為PROBLEM。
示例 11
觸發器名稱為:Comparing average load today with average load of the same time yesterday (using a second time_shift parameter).
{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. 如果最后一小時的平均cpu load超過前一天的同一小時兩倍,就會使觸發器的狀態變更為PROBLEM。
示例 12
使用了另一個監控項來獲得觸發器的閾值:
{Template PfSense:hrStorageFree[{#SNMPVALUE}].last()}<{Template PfSense:hrStorageSize[{#SNMPVALUE}].last()}*0.1
如果hrStorageFree低於10%,就會使觸發器的狀態變更為PROBLEM。
示例 13
使用 evaluation result 來獲取觸發器的數量超過閾值。
({server1:system.cpu.load[all,avg1].last()}>5) + ({server2:system.cpu.load[all,avg1].last()}>5) + ({server3:system.cpu.load[all,avg1].last()}>5)>=2
如果表達式中的兩個觸發器表達式的結果大於5,就會使觸發器的狀態變更為PROBLEM。
16 滯后(Hysteresis)
Sometimes we need an interval between an OK and Problem states, rather than a simple threshold. For example, we would like to define a trigger which becomes Problem when server room temperature goes above 20C and we want it to stay in that state until the temperature drops below 15C. 有時候我們需要一個觸發器狀態OK和PROBLEM之間的間隔,而不是簡單的閾值。例如,我們想定義一個觸發器,當機房的室溫超過20攝氏度時,我們希望它保持這個狀態,直至溫度低於15攝氏度,觸發器的狀態才會變更為OK。
In order to do this, we first define the trigger expression for the problem event. Then select 'Recovery expression' for OK event generation and enter another expression for the OK event. 為了做到這一點,我們首先定義一個PROBLEM事件的觸發器表達式,然后為OK event generation選擇'Recovery expression',並為OK事件輸入不同的表達式。
示例 1
觸發器名稱:Temperature in server room is too high.
Problem expression:
{server:temp.last()}>20
Recovery expression:
{server:temp.last()}<=15
示例 2
觸發器名稱:Free disk space is too low.
Problem expression: 在最近5分鍾內文件系統/的空閑空間小於10GB。
{server:vfs.fs.size[/,free].max(5m)}<10G
Recovery expression: 在最近10分鍾內文件系統/的空閑空間大於40GB。
{server:vfs.fs.size[/,free].min(10m)}>40G
17 具有不受支持的監控項和未知值的表達式
Versions before Zabbix 3.2 are very strict about unsupported items in a trigger expression. Any unsupported item in the expression immediately renders trigger value to Unknown. Zabbix3.2之前的版本對關於觸發器表達式中的不受支持的監控項非常嚴格。表達式中任何不受支持的監控項都將觸發器值立即顯示為Unknown。
Since Zabbix 3.2 there is a more flexible approach to unsupported items by admitting unknown values into expression evaluation: 從Zabbix3.2開始對於不受支持的監控項,通過將它們引入到表達式評估中,產生了一種更加靈活的表達方式:
For some functions their values are not affected by whether an item is supported or unsupported. Such functions are now evaluated even if they refer to unsupported items. See the list in functions and unsupported items.
對於一些函數,它們的值不受監控項是否支持與不支持的影響,即使她們引用了不支持的監控項,也會對這些函數進行評估。關於這些函數,請參閱functions and unsupported items。
Logical expressions with OR and AND can be evaluated to known values in two cases regardless of unknown operands:
具有OR和AND的邏輯表達式可以在兩種情況下評估為已知值,不用管未知的運算對象:
“1 or Unsuported_item1.some_function() or Unsuported_item2.some_function() or …” can be evaluated to '1' (True),
“1 or Unsuported_item1.some_function() or Unsuported_item2.some_function() or …“可以被評估為'1' (True),
“0 and Unsuported_item1.some_function() and Unsuported_item2.some_function() and …” can be evaluated to '0' (False).
Zabbix tries to evaluate logical expressions taking unsupported items as Unknown values. In the two cases mentioned above a known value will be produced; in other cases trigger value will be Unknown.
“0 and Unsuported_item1.some_function() and Unsuported_item2.some_function() and …“可以被評估為'0' (False).\Zabbix嘗試評估將將不受支持的監控項作為Unknown值的邏輯表達式。在上述兩種情況下,將產生一個Known值;在其他情況下,觸發器將產生Unknown值。
If a function evaluation for supported item results in error, the function value is Unknown and it takes part in further expression evaluation.
如果對受支持的監控項的一個函數評估結果為錯誤,那么這個函數的值為Unknown ,並且它將參與進一步的表達式評估。
Note that unknown values may “disappear” only in logical expressions as described above. In arithmetic expressions unknown values always lead to result Unknown (except division by 0). 備注:未知值只會在上述邏輯表達式中“消失”。在算數表達式中未知值總會導致結果為Unknown(除以0除外)。
If a trigger expression with several unsupported items evaluates to Unknown the error message in the frontend refers to the last unsupported item evaluated. 如果具有多個不受支持的監控項的觸發器表達式評估為Unknown,那么在前端中的錯誤消息值的是最后一個不受支持的項目。
3 觸發器依賴
有時候,一台主機的可用性取決於另一台主機。例如,如果一台路由設備宕機,則路由設備后端的服務器全部會變得無法訪問。如果這兩者都設置了觸發器,你可能會收到關於這兩者宕機的報警,而事實上只有路由設備是真正存在故障的。
這就是主機之間某些依賴關系可能有用的地方,依賴關系設置的通知可能會被抑制,而只發送根本問題的通知。
雖然Zabbix不支持主機之間的直接依賴關系,但是它們可以定義另外一種更加靈活的方式——觸發器依賴關系。一個觸發器可能有多個依賴於它的觸發器。
幾個依賴關系的示例
例如, 主機的前面有Router1,Router2的前面有Router1。
Zabbix - Router1 - Router2 - Host
如果Router1宕掉,那么很明細那Host和Router2就不可達了,但我們並不想收到關於Host、Router1和Router2宕掉的這三個通知。
於是我們定義了如下兩個依賴關系:
'Host is down' trigger depends on 'Router2 is down' trigger
'Router2 is down' trigger depends on 'Router1 is down' trigger
在改變“Host is down”觸發器的狀態之前,Zabbix將會檢查相應觸發器的依賴關系,如果找到,並且一個觸發器處於“Problem”狀態,則觸發器狀態將不會發生改變,因此不會執行actions動作,也不會發出相應的通知。
Zabbix遞歸執行此檢查,如果Router1或Router2是不可達的狀態,那么Host觸發器則不會更新。
4 觸發器嚴重性
觸發器嚴重性定義了觸發器的重要程度,Zabbix支持以下觸發器的嚴重程度:
嚴重程度的用途為:
觸發器的可視化表現,不同的顏色代表不同的嚴重程度。
全局報警音頻。不同的音頻代表不同的嚴重程度。
用戶媒介,不同的用戶媒介(通知渠道)代表不同的嚴重程度。例如,SMS表示高嚴重性,email表示其他嚴重性。
根據觸發嚴重程度的情況來限定不同的actions動作。
5 自定義觸發器的嚴重性
可以在Administration → General → Trigger severities選項中配置於嚴重性相關GUI元素的觸發器嚴重性的名稱和顏色。 配置的顏色可以在所有的GUI主題中共享。 === 翻譯自定義觸發器嚴重性的名稱 ===
msgid “Important” msgstr “
and save file. * 創建.mo文件為<frontend_dir>/locale/README的描述 這里的msgid應該對應新的自定義嚴重性名稱,並且msgstr應該是特定語言的翻譯。例如,如果是zh_CN環境,那么應該修改zh_CN下的frontengd.po文件。 應該在修改每個嚴重性名稱后執行此過程。
6 單位符號
概述
在Zabbix,不得不使用一些較大的數字,例如“86400”秒代表一天,這些數字既然不便又容易出錯。所以可以使用一些適當的單位符號(或后綴)來簡化Zabbix觸發器和監控項的鍵值。
上例中,你可以輸入“1d”來代替“85400”即可。后綴為乘法函數。
觸發器表達式
觸發器expression常量和函數參數支持時間和內存大小的后綴
你可以使用如下時間單位后綴:
s - 秒 (通常情況下,不帶任何時間單位后綴就表示s)
m - 分鍾
h - 小時
d - 天
w - 周
時間單位后綴也受zabbix[queue,
對於內存大小你可以使用如下單位后綴:
K - kilobyte
M - megabyte
G - gigabyte
T - terabyte
可以使用的其他單位后綴
單位符號也用在前端數據的可讀表述。
在Zabbix Server和前端都支持這些符號:
K - kilo
M - mega
G - giga
T - tera
當前端展示的item值為B、Bps時,那么使用base 2(1K=1024)。反之使用base 10(1K=1000) 另外前端也支持如下符號展示:
P - peta
E - exa
Z - zetta
Y - yotta
使用案例
通過使用一些適當的后綴,你可以編寫易懂和易維護的觸發器表達式,例如下面這些表達式:
{host:zabbix[proxy,zabbix_proxy,lastaccess]}>120
{host:system.uptime[].last()}<86400
{host:system.cpu.load.avg(600)}<10
{host:vm.memory.size[available].last()}<20971520
可以被修改為:
{host:zabbix[proxy,zabbix_proxy,lastaccess]}>2m
{host:system.uptime.last()}<1d
{host:system.cpu.load.avg(10m)}<10
{host:vm.memory.size[available].last()}<20M
7 批量更新
概述
使用批量更新,可以一次更改一些觸發器的某些屬性,從而節省了打開每個觸發器進行單獨編輯的需要。
使用批量更新
進行批量更新某些觸發器,請執行以下操作:
在觸發器列表中選中要更新觸發器的復選框;
點擊下面批量更新Mass update的按鈕;
標記要更新的屬性的復選框;
標記要更新屬性的新值,點擊下面的更新Update按鈕。