Zabbix5監控項設置觸發器,並實現釘釘告警
Zabbix告警觸發流程是:
監控項——觸發器——告警操作(郵件,短信,微信,釘釘,執行命令)
監控項一般負責收集數據,觸發器用於爲監控項所收集的數據定義闕值在監控項數據超出合理範圍時發送告警信息。
一個監控項可以關聯多個觸發器,爲一個監控項定義不同闕值的觸發器,可以實現不同級別的報警功能。每一個觸發器只能關聯一個監控項。
觸發器由一個表達式構成,定義了監控項所採集數據的闕值,採集的數據超出了觸發器闕值,觸發器狀態變成"PROBLEM",修復問題採集的數據正常後,觸發器狀態恢復成OK
Zabbix觸發器表達式
觸發器表達式形式如下:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
可以理解爲:
{主機:key.函數(parameter)}+表達式運算符+常數
示例:
{Zabbix server:vfs.file.cksum[/etc/passwd].diff()}>0
其中Zabbix server是主機,vfs.file.cksum[/etc/passwd]是key,diff()是函數(參數),>是表達式運算符
運算符
觸發器支持的運算符,按照優先級由高到低列出
優先級 | 運算符 | 定義 |
---|---|---|
1 | not | 非 |
2 | * | 乘 |
/ | 相除 | |
3 | + | 相加 |
- | 相減 | |
4 | < | 小於 |
<= | 小於等於 | |
> | 大於 | |
>= | 大於等於 | |
5 | = | 相等 |
<> | 不等於 | |
6 | and | 與 |
7 | or | 或 |
其中,not,and,or運算符區分大小寫,必須爲小寫
示例如下:
not{Zabbix server:net.tcp.listen[3306].last()}>0
3306端口偵聽值小於等於0,則觸發報警,數據庫服務掛了
觸發器函數
1)abschange
支持類型:float、int、str、text、log
作用:返回最近獲得的值與之前獲得值差的絕對值,對於字符串類型:0表示相等,1表示不同
2)avg()函數
{Zabbix server:zabbix[process,alert manager,avg,busy].avg(10m)}>75
參數:秒或#num,#num表示最近num次的值
支持類型:float、int
作用:返回一段時間的平均值
示例:avg(5):最後5秒的平均值
avg(#5):表示最近5次得到值的平均值
avg(3600,86400):表示一天前的一個小時的平均值,僅有一個參數,表示指定時間的平均值,從現在開始算起。有第二個參數,表示飄逸,從第二個參數前開始算時間。
3)max()函數
{Zabbix server:zabbix[rcache,buffer,pused].max(10m)}>75
參數:秒或#num
支持值類型:float、int
作用:返回指定時間間隔的最大值
4)min()函數
{Zabbix server:system.cpu.util.min(5m)}>{$CPU.UTIL.CRIT}
參數:秒或#num
支持值類型:float、int
作用:返回指定時間間隔的最小值
5)nodata()
{Template OS Linux:agent.ping.nodata(5m)}=1
參數:秒
作用:nodata()函數監控Zabbix agent數據收集,如果指定時間以內Zabbix agent沒有收到最新的監控數據,就會觸發告警
6)change()
{Template OS Linux:system.uptime.change(0)}<0
支持類型:float、int、str、text、log
作用:返回最近獲得值與之前獲得值的差值,對於字符串0表示相等,1表示不同
7)count()
參數:秒或#num
支持類型:float、int、str、text、log
作用:返回指定時間間隔內數值的統計
示例:
count(600,12,“gt”,86400)24小時之前的10分鐘內值大於12的個數,
其中eq:相等,ne:不相等,gt:大於
ge:大於等於,lt:小於,le:小於等於
like:內容匹配
8)date
作用:返回當前的時間,格式YYYYMMDD
9)dayofmonth
作用:返回當前是本月的第幾天
10)dayofweek
作用:返回當前是本週的第幾天
11)delta
作用:返回時間間隔以內的最大值與最小值
12)diff()函數
{Zabbix server:vfs.file.cksum[/etc/passwd].diff()}>0
支持值類型:float,int,str,text,log
作用:diff()函數主要是用來對比監控項前後兩個值是否發生了變化,如果發生變化就會觸發告警,返回值爲1表示最近的值與之前的值不同,0爲其他情況
13)fuzzytime
參數:秒
支持值類型:float、int
作用:返回值爲1表示監控項值的時間戳比ZabbixServer時間多N秒,0爲其他,常使用system.localtime來檢查本地時間是否與Zabbixserver時間相同
{MySQL_DB:system.localtime.fuzzytime(10)}=0
主機MySQL_DB當前服務器時間如果與zabbix server之間的時間相差10秒以上,表達式返回true,觸發器狀態改變爲“problem”
14)last()
{Zabbix server:net.tcp.port[127.0.0.1,10050].last()}<>1
參數:秒或#num
支持值類型:float、int、str、text、log
last(0,86400)返回前一天的最近的值
創建監控項
net.tcp.listen[port],監控Zabbix server客戶端10050端口,一直在監聽返回值是1,否則返回值是0,當返回值不等於1通過觸發器產生報警。
創建觸發器
主機Zabbix server模板中創建觸發器,當採集到的數據值不等於1時觸發告警
往釘釘羣推送報警
1)設置報警媒介類型,腳本名稱爲zabbix_monitor_test.py
2)信息模板的類型選擇:問題模板
主題:
Problem: {EVENT.NAME}
消息:
Problem started at {EVENT.TIME} on {EVENT.DATE}
Problem name: {EVENT.NAME}
Host: {HOST.NAME}
Severity: {EVENT.SEVERITY}
Operational data: {EVENT.OPDATA}
Original problem ID: {EVENT.ID}
{TRIGGER.URL}
3)設置報警媒介類型的選項
4) 部署python腳本
監控腳本應該存放到/usr/lib/zabbix/alertscripts目錄下
cat /etc/zabbix/zabbix_server.conf
#查看監控腳本位置
AlertScriptsPath=/usr/lib/zabbix/alertscripts
設置zabbix_agent允許以root用戶運行,確保可以執行python腳本
vim /etc/zabbix/zabbix_agentd.conf
AllowRoot=1
設置後重啓zabbix_agent,查看zabbix-agent的狀態
systemctl restart zabbix-agent
systemctl status zabbix-agent
zabbix_monitor_test.py實現獲取監控信息,並往釘釘羣推送告警信息
腳本放到/usr/lib/zabbix/alertscripts/目錄下:
#!/usr/local/bin/python3
import time # 時間模塊
import os, sys
import requests
import json
api_url = 'https://oapi.dingtalk.com/robot/send?access_token=25fad8baeaa9b07c16ab71e8c023398fb5ee1fe4b1f346af292899dff0ea8b36'
headers = {'Content-Type': 'application/json;charset=utf-8'}
# 往釘釘羣推送消息
def msg(text):
json_text = {
"msgtype": "markdown",
"markdown": {
"title": "編組狀態通知",
"text": text
}
}
print(requests.post(api_url, json.dumps(json_text), headers=headers).content)
if __name__ == '__main__':
text = sys.argv[1]
msg(text)
爲用戶設置報警媒介類型
這裏是爲管理員用戶設置釘釘告警
報警媒介選擇釘釘報警
要賦予用戶有讀寫權限
創建動作
動作可以有多種事件源,主機、主機羣組、應用集、模板、觸發器等
這裏選擇觸發器,選擇Zabbix server: 監控端口這個觸發器事件,然後選擇添加動作。
1)添加動作
監控項遇到問題,就會觸發動作,往釘釘羣中推送報警信息
如下圖所示選擇動作對應的觸發器:監聽10050端口失敗觸發報警
2)設置操作
主題:故障{TRIGGER.STATUS},服務器:{HOSTNAME},發生:{TRIGGER.NAME}故障!
消息:
{
告警主機:{HOST.NAME}
告警地址:{HOST.IP}
告警項目:{ITEM.NAME}
告警時間:{EVENT.DATE}{EVENT.TIME}
告警等級:{TRIGGER.SEVERITY}
告警信息:{TRIGGER.NAME}
告警項目:{TRIGGER.KEY1}
問題詳情:{ITEM.VALUE}
}
3)設置恢復操作
操作類型:選擇通知所有參與者
主題:恢復{TRIGGER.STATUS},服務器:{HOSTNAME1}:{TRIGGER.NAME}已恢復
消息:{
告警主機:{HOSTNAME1}
告警時間:{EVENT.DATE}{EVENT.TIME}
故障持續時間:{EVENT.AGE}
恢復時間:{EVENT.RECOVERY.TIME}
告警等級:{TRIGGER.SEVERITY}
}
動作設置完如下圖所示:
成功設置了動作,動作名稱爲:釘釘推送告警
觸發監控項告警,測試往釘釘羣推送消息的功能
爲了觸發告警,設置監聽返回值爲1時就觸發告警
{Zabbix server:net.tcp.port[127.0.0.1,10050].last()}=1
如下圖所示:成功觸發觸發器告警,往釘釘羣推送告警信息
釘釘羣收到的告警信息如下所示:
修復問題,觸發動作恢復操作,會往釘釘羣裏推送問題已解決信息,如下圖所示:
#測試直接通過修改觸發器監控項的值修復問題
{Zabbix server:net.tcp.port[127.0.0.1,10050].last()}=1