nginx-rtmp開啟stats
# nginx(--add-module=nginx-rtmp-module-master) nginx.conf: server { listen 81; location /stat { rtmp_stat all; } }
http://127.0.0.1:81/stat
stat狀態值詳解
codec: 編碼
bits/s: 碼流
size: 分辨率
fps: 每秒傳輸幀數
freq: 音頻頻率
chan: 聲道數
定義zabbix監控item key
vim etc/zabbix_agentd.conf.d/userparameter_live.conf
UserParameter=live.stream[*],/usr/local/zabbix-agent/scripts/stream.py $1
stream.py # 判斷In bits/s值(視音頻合計碼流)。0則rtmp斷流,非0則正常
#!/usr/bin/python # -*- coding: utf-8 -*- # author pdd ''' curl的直播流狀態值寫入本地CACHE文件 后續具體的直播頻道流值從該文件獲取 CACHE文件根據ctime一分鍾更新一次 ''' import os import re import sys import time import urllib2 class Live(object): def __init__(self,url,CACHETTL,CACHE,STREAM): self.url = url self.CACHETTL = CACHETTL self.CACHE = CACHE self.STREAM = STREAM def generate_cache(self): TIMENOW = int(time.time()) if os.path.isfile(self.CACHE) and os.path.getsize(self.CACHE) > 0: TIMECACHE = int(os.path.getctime(self.CACHE)) else: TIMECACHE = 0 if (TIMENOW - TIMECACHE) > self.CACHETTL: try: r = urllib2.urlopen(self.url,timeout=1) with open(self.CACHE,'w') as f: f.write(r.read()) except urllib2.URLError, e: print 0 # 給zabbix觸發直播流down報警的值 exit(1) # 退出程序 不讓從CACHE文件獲取值 def get_status(self): self.generate_cache() with open(self.CACHE,'r') as f: r = f.read() name = re.findall(r'<name>(.*_sd)</name>',r) flow = re.findall(r'<bw_in>(.*)</bw_in>',r)[1:] stream = dict(zip(name,flow)) print(stream[self.STREAM]) if __name__ == "__main__": url = "http://127.0.0.1:81/stat" # 直播頻道流狀態值url CACHETTL = 60 # 本地CACHE文件更新時間間隔 CACHE = "/tmp/nginx-rtmp-status.cache" # 本地CACHE文件絕對路徑 STREAM = sys.argv[1] # 某個具體直播頻道 status = Live(url,CACHETTL,CACHE,STREAM) status.get_status()
重啟zabbix_agentd客戶端使監控key生效
客戶端測試
服務器端 # 頁面監控主機添加對應的application items
zabbix后台 Configuration->Hosts->被監控的數據庫主機name->Applications Items
創建Graphs(視音頻碼流)
zabbix后台 Configuration->Hosts->被監控的主機name->Graphs
查看graph(視頻碼流)
zabbix后台 Monitoring->Graphs->對應的graph