zabbix 觸發器表達式詳解

概述:觸發器中的表達式使用很靈活,咱們能夠建立一個複雜的邏輯測試監控,觸發器表達式形式以下: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 | 邏輯或

觸發器示例網絡

示例---觸發器名稱:Processor load is too high on www.zabbix.com

{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 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,根本依賴不了,有以下報錯。

    Linux

    zabbix觸發器依賴(1)

  • 一個模板的觸發器能夠依賴另一個模板的觸發器,例如模板A觸發器依賴模板B觸發器。一個HOST要連接A模板,那麼它同時要連接A模板(由於模 板A中的觸發器依賴了模板B中的觸發器),可是HOST能夠單獨連接模板B(B是被依賴)。在一個host單獨連接template A,結果出現以下錯誤,因此別忘記了一塊兒把template B也連接到HOST中。

    Linux

    zabbix觸發器依賴(2)

  • 模板中的觸發器能夠依賴HOST中的觸發器。若是某個HOST連接這類模板,那麼HOST建立的相應的觸發器也一樣會依賴那個HOST的觸發器。 舉個官方的例子,某個模板中的一些觸發器依賴了route/主機的觸發器,凡事連接(理解爲套用)了這個模板的機器都會依賴這些router/主機。說了 那麼多,其實就是繼承了。

  • HOST中的觸發器不能依賴模板中的觸發器。

配置

編輯觸發器,選擇選項卡「dependencies」,點擊Add,選擇你須要依賴的觸發器,以下圖:

Linux

zabbix觸發器依賴(3)

而後點擊保存,能夠看到觸發器多了一個depend on

Linux

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建立觸發器trigger

1. 建立觸發器

瞭解了什麼觸發器,接下來看下zabbix觸發器怎麼建立和配置,方法很簡單,請你們往下讀,有什麼問題請留言。

建立觸發器步驟:

  • 點擊Configuration(配置) → Hosts(主機)

  • 點擊hosts(主機)相關行的trigger

  • 點擊右上角的建立觸發器(create trigger),你也能夠修改列表中的觸發器

在表單中輸入相應的信息

2. 配置觸發器

以下爲觸發器

Linux

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 當前觸發器是否啓用

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,固然這裏你也能夠自定義你的顏色,咱們這邊就再也不敖述了,修改完以後點擊保存。

Linux

zabbix修改嚴重性名稱

添加內容到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的觸發器列表,看左邊信息,請看以下圖<

Linux

severities修改並翻譯

在 自定義觸發器名稱以前應該顯示High的,這邊被咱們修改爲了Very Import。zabbix是一個多語言監控系統,若是你想切換到中文環 境,那麼你須要修改zh_CN下的frontend.po,而後make_mo.sh建立frontend.mo。不然將只會顯示Important,如 下:

Linux

severities未翻譯

這邊直接顯示觸發器的MSGID,由於你沒翻譯。

最後

6個觸發器級別,名稱隨你修改,可是大多數狀況下咱們都不須要修改,默認的挺好的,不是嗎?非要自定義,我不攔你。


 

      zabbix獲取上一個值prev zabbix觸發器函數

zabbix觸發器方法prev用於獲取item前一個返回值,與方法last(#2)是一樣的意思

zabbix觸發器方法prev - web界面

zabbix

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


 

     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有以下取值方式:

  1. 最後N個值

  2. 最近XX時間,例如最近1h

  3. 以上1和2還要結合time_thift時間偏移參數,例如1h

function

zabbix-function-avg

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. 獲取一個時間週期內最大值

  2. 獲取幾個返回值中的最大值

  3. 以上方法,時間往前推移1分鐘,1小時,1天等等

zabbix觸發器函數max - 對應web

windows zabbix agentd安裝

文字以下

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. 獲取一個時間週期內最小值

  2. 獲取幾個返回值中的最小值

  3. 以上方法,時間往前推移1分鐘,1小時,1天等等

zabbix觸發器函數min - 對應web

min

文字以下

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的對應關係,以及他們的功能。

abschange

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
相關文章
相關標籤/搜索