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=discovery_live.stream,/usr/local/zabbix-agent/scripts/discovery_stream.py
UserParameter=live.stream[*],/usr/local/zabbix-agent/scripts/stream.py $1
stream.py # 判断In bits/s值(视音频合计码流)。0则rtmp断流,非0则正常
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
'''
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>(.*)</name>',r)[1:]
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通过自动发现规则,根据脚本自动动态的定义监控的key,再根据key获取值
discovery_stream.py动态获取key
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import json
import re
def get_name():
with open("/tmp/nginx-rtmp-status.cache",'r') as f:
r = f.read()
name = re.findall(r'<name>(.*)</name>',r)[1:]
mlist=[]
for i in name:
pdict={}
pdict['{#NAME}'] = i
mlist.append(pdict)
result = {}
result['data'] = mlist
print(json.dumps(result,sort_keys=True,indent=2))
get_name()
重启zabbix_agentd客户端使监控key生效
客户端测试
zabbix页面添加自动发现规则
添加监控原型
注意:[]内需要大写,否则会报错
设置触发器
然后查看监控项,可以看到我们定义的动态的key已经生成,失效的key到期会自动删除