添加自定義監控項目python
- 需求:監控某臺web的80端口鏈接數,並出圖
- 兩步:1)zabbix監控中心建立監控項目;2)針對該監控項目以圖形展示
- 對於第一步,須要到客戶端定義腳本
- vim /usr/local/sbin/estab.sh //內容以下
#!/bin/bash
##獲取80端口併發鏈接數
netstat -ant |grep ':80 ' |grep -c ESTABLISHED
- chmod 755 /usr/local/sbin/estab.sh
- 客戶端上編輯配置文件 vim /etc/zabbix/zabbix_agentd.conf//增長
UnsafeUserParameters=1 //表示使用自定義腳本
UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh
//自定義監控項的key爲my.estab.count,後面的[*]裏面寫腳本的參數,若是沒有參數則能夠省略,腳本爲/usr/local/sbin/estab.sh
- 重啓zabbix-agent服務 systemctl restart zabbix-agent
- 首先到服務端驗證,執行命令
- zabbix_get -s 192.168.180.135 -p 10050 -k 'my.estab.count‘
- 而後在zabbix監控中心(瀏覽器)配置增長監控項目
- 鍵值寫my.estab.count
- 添加該項目後,到「監測中」 「最新數據」查看剛添加的項目是否有數據出現
- 有了數據就能夠添加圖形了
- 「配置」「主機」 「圖形」 「建立圖形」
添加自定義監控項目配置
- zabbix的監控項目是在模板裏面體現,可是有時候就會有些個性化的需求:某一個業務的數據,好比:運營人員想知道網站會員註冊量,會員活躍度;實際上,這些數據,均可以經過數據庫裏面的表的數字來體現,可是zabbix模板是不可能提供那麼詳細的監控項目;遇到這種狀況,就須要經過編程工具,寫成腳本,把數字展示出來,而後經過zabbix監控項目,造成圖表,就能夠實現分析天天的數據是多少;
- 需求
- 解決方法:
- 1)zabbix監控中心建立監控項目;
- 2)針對該監控項目以圖形展示;
- 首先須要在客戶端(B機器)定義腳本
[root@yong-02 ~]# vim /usr/local/sbin/estab.sh
#!/bin/bash
##獲取80端口併發鏈接數
netstat -ant |grep ':80 ' |grep -c ESTABLISHED
- 更改一個可以讓zabbix用戶執行的權限 chmod 755 /usr/local/sbin/estab.sh
B機器
[root@yong-02 ~]# chmod 755 /usr/local/sbin/estab.sh
[root@yong-02 ~]# ll /usr/local/sbin/estab.sh
-rwxr-xr-x 1 root root 91 7月 10 22:43 /usr/local/sbin/estab.sh
B機器
[root@yong-02 ~]# vim /etc/zabbix/zabbix_agentd.conf
搜索 /UnsafeUserParameters
將# UnsafeUserParameters=0
改成UnsafeUserParameters=1
#目的是使用自定義腳本
搜索 /UserParameter
將# UserParameter=
改成UserParameter=my.estab.count[*],/usr/local/sbin/estab.sh
#表示自定義監控項的key爲my.estab.count,後面的[*]裏面寫腳本的參數,若是沒有參數則能夠省略,若是有參數寫入到 [ ] 裏面,用逗號分隔,腳本爲/usr/local/sbin/estab.sh
- my.estab.count 這個是zabbix監控項裏的 鍵值
- 客戶端(B機器),重啓 zabbix-agent 服務
B機器
[root@yong-02 ~]# systemctl restart zabbix-agent.service
- 檢查自定義的腳本是否被識別
- 到服務端(A機器)驗證,執行命令,server沒法獲取數據
- zabbix_get -s 192.168.180.135 -p 10050 -k 'my.estab.count'
- -s 指定客戶端的IP地址
- -p 指定端口,不加-p,默認就是10050端口
- -k 表示 鍵值
A機器
[root@yong-01 ~]# zabbix_get -s 192.168.180.135 -p 10050 -k 'my.estab.count'
0
- 如果以前在客戶端(B機器)寫的腳本權限不設置成 755 ,這裏的server獲取數據時,就會提示 權限不夠
- 在獲取數據的時候,必定要保證數據的一般,防火牆和selinux都須要去設置,不然就會有可能沒法獲取數據
- 在zabbix監控中心(瀏覽器)配置增長監控項目,在 配置 ——> 主機 ——>建立監控項
- 名稱 寫爲:併發連接數
- 類型 :選擇zabbix客戶端
- 鍵值 寫:my.estab.count——>鍵值可自定義,是不固定的
- 單位 :保持默認
- 歷史數據保留時長(單位天):默認保持90天
- 應用集:能夠不選擇,由於沒有定義應用集
- 在添加該項目後,還須要添加圖形,配置——>主機——>圖形——>建立圖形
- 名稱爲建立併發連接數——>而後添加監控項 併發連接數——>點擊添加
- 在圖形中,查看新建立的圖形,而後選擇預覽
- 如果網站訪問量很大,那麼每隔30秒就能夠看到一個數字,時間長了,就可查看到網站訪問量的趨勢
- 作一個觸發器,選擇觸發器——>建立觸發器
- 當併發大於200,作警告級別
總結:
- 在服務端上獲取數值(經過腳本實現),給予服務端訪問腳本的權限,在zabbix監控中心添加對應的監控項目(輸入鍵值),便可
配置郵件告警
- 使用163或者QQ郵箱發告警郵件
- 首先登陸你的163郵箱,設置開啓POP三、IMAP、SMTP服務
- 開啓並記錄受權碼
- 而後到監控中心設置郵件告警
- 「管理」,「報警媒介類型」,「建立媒體類型」
- {ALERT.SENDTO} ,{ALERT.SUBJECT},{ALERT.MESSAGE}
- 建立報警腳本mail.py
- vim /usr/lib/zabbix/alertscripts/mail.py//內容參考
- chmod 755 /usr/lib/zabbix/alertscripts/mail.py
- 建立一個接受告警郵件的用戶,「管理」,「用戶」,「建立用戶」,「報警媒介」,類型選擇「baojing」,注意用戶的權限,若是沒有須要到用戶組去設置權限
- 設置動做,「配置」,「動做」,「建立動做」,名稱寫「sendmail」(自定義),「操做」頁面,內容以下
HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE} {EVENT.TIME}
LEVEL:{TRIGGER.SEVERITY}
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}
- 「新的觸發條件」,A維護狀態 非在 維護,B觸發器示警度>=未分類
- 「操做」,選擇發送的用戶爲剛建立的用戶,僅送到選擇「baojing」
- 切換到「恢復操做」,把信息改爲以下
HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE} {EVENT.TIME}
LEVEL:{TRIGGER.SEVERITY}
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}
- 點擊「新的」,「操做」,選擇發送的用戶爲剛建立的用戶,僅送到選擇「baojing」
- 測試告警
配置郵件告警
- 首先須要一個郵箱,使用郵箱發郵件(163郵箱)
- 訪問163郵箱,在第三方平臺上調用163郵箱發郵件,須要設置開啓POP三、IMAP、SMTP服務
- 設置——POP3/IMAP/SMTP
- 第一次開啓POP3/IMAP/SMTP服務會有短信驗證
- 在驗證完以後還須要設置客戶端受權密碼(須要牢記),接下來發郵件的密碼就是受權密碼
- 在寫腳本以前 進入zabbix的web界面——> 管理——> 報警媒介類型——>建立媒體類型
- 在報警媒介類型裏面的自帶的 Email 使用不方便,因此本身寫python發郵件的腳本
- 名稱:指的是報警媒介類型的名稱,自定義,這裏叫作報警
- 類型:腳本
- 腳本名稱:自定義,這裏叫作mail.py
- 在py腳本參數下,三個參數都分佈在py的腳本里
- {ALERT.SENDTO} 表示收件人
- {ALERT.SUBJECT} 表示郵件主題
- {ALERT.MESSAGE} 表示郵件內容
- 這時會看到成功添加「報警"報警媒介類型
- 要實現報警,首先py腳本能發出郵件
- 在服務端(A機器)建立報警腳本mail.py,查看報警腳本所在位置
A機器
[root@yong-01 ~]# vim /etc/zabbix/zabbix_server.conf
搜索 /alert
AlertScriptsPath=/usr/lib/zabbix/alertscripts
#報警腳本所在路徑
- 建立報警腳本mail.py,在/usr/lib/zabbix/alertscripts/目錄下是空的, 來建立,腳本內容參考
A機器
[root@yong-01 ~]# cd /usr/lib/zabbix/alertscripts/
[root@yong-01 alertscripts]# vim mail.py
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
import os,sys
reload(sys)
sys.setdefaultencoding('utf8')
import getopt
import smtplib
from email.MIMEText import MIMEText
from email.MIMEMultipart import MIMEMultipart
from subprocess import *
def sendqqmail(username,password,mailfrom,mailto,subject,content):
gserver = 'smtp.163.com'
##定義發郵件類型
gport = 25
try:
msg = MIMEText(unicode(content).encode('utf-8'))
msg['from'] = mailfrom
msg['to'] = mailto
msg['Reply-To'] = mailfrom
msg['Subject'] = subject
smtp = smtplib.SMTP(gserver, gport)
smtp.set_debuglevel(0)
smtp.ehlo()
smtp.login(username,password)
smtp.sendmail(mailfrom, mailto, msg.as_string())
smtp.close()
except Exception,err:
print "Send mail failed. Error: %s" % err
def main():
to=sys.argv[1]
subject=sys.argv[2]
content=sys.argv[3]
##定義QQ郵箱的帳號和密碼,你須要修改爲你本身的帳號和密碼(請不要把真實的用戶名和密碼放到網上公開,不然你會死的很慘)
sendqqmail('163郵箱','密碼','163郵箱',to,subject,content)
if __name__ == "__main__":
main()
#####腳本使用說明######
#1. 首先定義好腳本中的郵箱帳號和密碼
#2. 腳本執行命令爲:python mail.py 目標郵箱 "郵件主題" "郵件內容"
- 更改mail.py腳本的權限(很重要!!!),不然就會沒法告警
- chmod 755 /usr/lib/zabbix/alertscripts/mail.py
[root@yong-01 alertscripts]# chmod 755 mail.py
[root@yong-01 alertscripts]# ll mail.py
-rwxr-xr-x 1 root root 1390 7月 10 23:33 mail.py
[root@yong-01 alertscripts]# python mail.py yyli2008@163.com "adfsf" "ceshi"
- 沒有任何提示就表示發郵件成功
- 這時打開163郵箱,會看到郵件
- 如果在郵件裏面寫中文,到郵箱裏面會顯示亂碼,這是由於在zabbix使用的是utf-8的字符集,而在郵箱裏使用的是GBK字符集,因此會亂碼
[root@yong-01 alertscripts]# python mail.py yyli2008@163.com "測試郵件" "測試郵件"
- 建立一個接受告警郵件的用戶(用戶是用來接收郵件的),在建立用戶的前提是建立一個用戶組,用戶組可使用已經存在的, 因此這裏直接建立用戶,管理-->用戶-->建立用戶
- 再給剛剛的用戶設置郵箱,管理-->用戶-->報警媒介-->添加
- 還要 注意用戶的權限,若是沒有權限,郵件是無法發的,要暫時到用戶組裏 (管理-->用戶羣組)
- 設置動做,咱們配置了觸發器,那麼觸發後應該去作什麼,配置-->動做-->建立動做
- 動做
- 名稱:中英文均可以,這裏叫 發郵件
- 條件:維護狀態 非在 維護,就表示 維護狀態機器不進行發郵件
- 新的觸發條件,當觸發器示警度(也就是信息,警告,通常嚴重...)大於等於未分類(未分類 表示 全部狀態,都會發信息)
- 配置-->動做-->操做
- 默認信息:直接刪除原有的(比較亂),粘貼下面的內容
- 維護期間暫停操做:選擇打勾(若不打對勾也能夠,由於在動做的條件裏定義了)
默認信息定義當發生報警時,zabbix會向你的郵箱發送什麼內容
HOST:{HOST.NAME} {HOST.IP} (定義主機名)
TIME:{EVENT.DATE} {EVENT.TIME} (定義事件發生時間)
LEVEL:{TRIGGER.SEVERITY} (定義示警度)
NAME:{TRIGGER.NAME} (定義哪個觸發器發出的報警)
messages:{ITEM.NAME}:{ITEM.VALUE} (發出告警會出現什麼狀態碼)
ID:{EVENT.ID} (發生事件的id)
- 配置-->動做-->恢復操做
- 默認信息:直接刪除原有的(比較亂),粘貼下面的內容(粘貼內容和操做裏面複製進去的信息是相同的)
HOST:{HOST.NAME} {HOST.IP}
TIME:{EVENT.DATE} {EVENT.TIME}
LEVEL:{TRIGGER.SEVERITY}
NAME:{TRIGGER.NAME}
messages:{ITEM.NAME}:{ITEM.VALUE}
ID:{EVENT.ID}
測試告警
- 建立觸發器,來實現告警,配置-->主機-->yong-02主機-->建立觸發器
- 名稱:系統負載
- 嚴重性:警告
- 表達式: 以下
- 而後回到監控中心,主頁——>最近20個問題
- 若是提示爲啓用中,證實發現問題,正在啓用告警,顯示問完成,就證實已經發送郵件告警;如圖,咱們的實驗是成功的
- 這就表示測試郵件告警成功
- 這時想要解決這個問題,只要將觸發器 系統負載條件數值調整 >1 便可,再來查看監控中心,就會發現問題消失了,而且會給郵箱發送 OK 的郵件
不發郵件的問題處理
- 由於虛擬機,可能存在一些bug,第一次配置的時候,常常會出現zabbix發現問題,作了郵件告警,可是郵箱卻沒有收到郵件的問題;
- 從新恢復快照之後再作一次,就又能正常發送郵件,接收郵件了
配置郵件告警總結
- 到 163郵箱或 QQ郵箱 開啓SMTP服務,並記錄受權碼,沒有開啓,腳本里面就沒法去寫密碼
- 設置郵件告警
- 編輯郵件告警腳本,腳本地址
- /usr/lib/zabbix/alertscripts目錄下
- 路徑不能錯誤,必須在這個路徑下,添加一個腳本
- 建立好以後,記得給腳本755權限,不然zabbix用戶是沒法調用這個腳本的
- 配置用戶
- 配置用戶以前,把用戶羣組的權限改一下,讓組有一個讀寫權限
- 用戶加到指定的羣組裏
- 報警媒介,添加本身的郵箱地址,本身給本身發,這個成功率會比較高
- 配置動做
- 操做修改默認信息(發送郵件的格式),操做須要添加一個「新的」給誰發郵件;恢復操做一樣
- 測試一下告警是否能成功發送郵件
- 人爲建立一個觸發器,設置一個系統最低運行都會觸發報警的觸發器
- 也能夠在客戶端上斷開鏈接(中止客戶端的zabbix服務)
- 更改主動和被動
- PS: 客戶端主動模式和被動模式,在監控項裏,選擇一個監控項打開,選擇類型是客戶端主動,客戶端;客戶端主動即爲主動模式,客戶端爲被動模式
- 觸發器不能用中文命名,否則郵件顯示亂碼