1. 程式人生 > >Zabbix-觸發器詳解

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()

),觸發器就會由 Zabbix timer 程序每 30 秒重新計算一次。如果在表示式中同時使用基於時間和非基於時間的函式,當接收到一
個新值和每隔 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。

運算子:觸發器支援的運算子(在執行中優先順序遞減

在這裡插入圖片描述

notand 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