Zabbix-觸發器詳解
最近一直在學習zabbix,感覺zabbix中 監控項 和 觸發器 的配置非常重要,無論是我們監控日誌還是自定義監控一些內容,預設自帶的往往不夠用,還需要自定義地去配置監控項和觸發器。
轉載自: https://www.zabbix.com/documentation/3.4/zh/manual/config/triggers
概述
觸發器是“評估”由專案採集的資料並表示當前系統狀況的邏輯表示式。
當監控項用於採集系統的資料時,始終遵循這些資料是非常不切合實際的,因為這些資料始終在等待一個令人擔憂或者值得關注的狀態。然而這個“評估”資料的工作可以留給觸發器表示式。
觸發器表示式允許定義一個什麼狀況的資料是“可接受”的閾值。因此,如果接收的資料超過了可接受的狀態,則觸發器會被觸發 - 或將狀態更改為 PROBLEM 。
一個觸發器可以擁有下面幾種狀態:
值 | 描述 |
---|---|
OK | 這是一個正常的觸發器狀態,在舊版本的 Zabbix 中稱為 FALSE。 |
PROBLEM | 通常意味著觸發了某些事情。例如,處理器的負載較高。在舊版本的 Zabbix 中稱為 TRUE。 |
每當 Zabbix server 接收到作為表示式一部分的新值時,都會重新計算觸發器狀態(表示式)。
如果在表示式中使用基於時間的函式(nodata(), date(), dayofmonth(), dayofweek(), time(), now()
個新值和每隔 30 秒都會重新計算觸發器的狀態。
你可以構建不同複雜程度的觸發器表示式。
觸發器表示式
觸發器中使用的表示式是非常靈活的。你可以使用他們去建立關於監控統計的複雜邏輯測試。
配置一個觸發器,請執行以下操作:
-
點選 Zabbix 上方選單欄的 Configuration → Hosts
-
在 Host 那一行點選 Triggers
-
在右上角點選 Create Trigger(或者在觸發器名稱上編輯一個現有的觸發器)
-
在開啟的頁面輸入觸發器的引數
一個簡單有效的表示式看起來像:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
即
{主機:key.函式(引數)}<表示式>常數
函式:觸發器函式允許引用收集的值,當前時間和其他因素。
函式引數:
大多數數字型的函式接受秒數來作為引數。
你可以使用字首 # 來指定引數具有不同的含義:
函式內容 | 含義 |
---|---|
sum(600) | 600 秒內所有值的總和 |
sum(#5) | 最後 5 個值的總和 |
函式 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 小時的平均值。
觸發器需要使用 history 歷史資料來計算。如果歷史資料不可用(特別是關於 time_shift 時間偏移量),則無法使用趨勢資訊,因此必須至少保持觸發器函式所預期這段時間的歷史資訊。
你可以在觸發器表示式中使用支援的單位符號,例如“5m”(分鐘)可被“300”秒代替,“1d”(天)可被“86400”秒代替,“1k”代表“1024”bytes。
運算子:觸發器支援的運算子(在執行中優先順序遞減)
not,and and or 運算子區分大小寫,而且必須為小寫。它們也必須被空格或括號包圍。所有運算子中,除了 unary - and not,都有從左到右的關聯性。
觸發器示例
- 示例 1
觸發器名稱:Processor load is too high on www.zabbix.com
。觸發器表示式如下:
{www.zabbix.com:system.cpu.load[all,avg1].last()}
“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
。觸發器表示式如下:
使用了函式 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
如果最後一小時的平均 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 狀態。
滯後(Hysteresis)
有時候我們需要一個觸發器狀態 OK 和 PROBLEM 之間的間隔,而不是簡單的閾值。例如,我們想定義一個觸發器,當機房的室溫超過 20 攝氏度時,我們希望它保持這個狀態,直至溫度低於 15 攝氏度,觸發器的狀態才會變更為 OK。
為了做到這一點,我們首先定義一個 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