zabbix觸發器詳解


             zabbix觸發器表達式詳解

概述:觸發器中的表達式使用很靈活,我們可以創建一個復雜的邏輯測試監控,觸發器表達式形式如下:

{<server>:<key>.<function>(<parameter>)}<operator><constant>

{主機:key.函數(參數)}<表達式>常數,具體的例子,請接着往下走,很簡單

Functions函數:觸發器functions可以引用檢索到的值,當前時間或者其他元素。觸發器表達式支持的function完整列表請點擊官網地址 supported functions

Function參數----大多數數值functions可以使用秒來作為參數。你可以使用前綴“#”來表示它有不同的含義

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小時內的平均數據。

[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

觸發器說明:

www.zabbix.com:host名稱

system.cpu.load[all,avg1]:item值,一分內cpu平均負載值

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

來源:http://www.ttlsa.com/zabbix/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM