添加自定义字段

在agent配置文件添加用户自定义字段。

配置语法:

UserParameter=<key>,<command>

还可以写比较复杂的表达式:

UserParameter=mysql.ping,mysqladmin -uroot ping | grep -c alive
# 如果Mysql服务器是活动状态,agent将返回“1”,否则会返回“0”。

应用

UserParameter=discovery_live.stream, /usr/bin/python /root/zabbix/etc/scripts/discovery_stream.py UserParameter=live.stream[*],/usr/bin/python /root/zabbix/etc/scripts/stream.py $1

此处定义了两个字段,discovery_live.stream 和 live.stream[*]。

其中discovery_live.stream是自动发现的key,执行discovery_stream.py 脚本返回的json格式的对象。

discovery_stream.py脚本获取的是频道名称字段返回一组json对象。

# discovery_stream.py

#!/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()

json对象:

{
"data":[
{
"{#NAME}": "cdrmldcctv11_1_720P"
},
{
"{#NAME}": "cdrmldcctv14_1_480P"
},
{
"{#NAME}": "cdrmldcctv4_1_720P"
},
{
"{#NAME}": "cdrmldcctv7_1_480P"
},
{
"{#NAME}": "cdrmldcctv14_1_360P"
},
{
"{#NAME}": "cdrmldcctv7_1_360P"
}
]
}

stream.py脚本是查询对应频道码率信息:

# -*- coding: utf-8 -*-
#!/usr/bin/env python
# 导入所需库
import os
import re
import sys
import time
import urllib2


# 定义一个名为Live的类,用于处理直播流状态监控
class Live(object):

# 初始化方法,设置URL、缓存更新周期、缓存文件路径和需要关注的直播频道名称
def __init__(self, url, CACHETTL, CACHE, STREAM):
self.url = url # 直播流状态值的URL
self.CACHETTL = CACHETTL # 本地缓存文件更新时间间隔(秒)
self.CACHE = CACHE # 本地缓存文件绝对路径
self.STREAM = STREAM # 需要获取状态的具体直播频道名

# 生成或更新缓存的方法
def generate_cache(self):
# 获取当前时间戳
TIMENOW = int(time.time())

# 检查缓存文件是否存在且大小大于0
if os.path.isfile(self.CACHE) and os.path.getsize(self.CACHE) > 0:
TIMECACHE = int(os.path.getctime(self.CACHE)) # 获取缓存文件的创建时间戳
else:
TIMECACHE = 0 # 如果缓存文件不存在或为空,则将时间戳设为0

# 判断是否需要从服务器更新数据(即缓存是否过期)
if (TIMENOW - TIMECACHE) > self.CACHETTL:
try:
# 使用urllib2向指定URL发送请求并获取响应内容
r = urllib2.urlopen(self.url, timeout=1)

# 将获取到的数据写入缓存文件
with open(self.CACHE, 'w') as f:
f.write(r.read())
except urllib2.URLError as e:
# 若请求失败,输出0以便触发Zabbix报警,并退出程序
print(0)
exit(1)

# 获取直播频道流状态的方法
def get_status(self):
# 先调用generate_cache()确保数据是最新的
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
url = "http://127.0.0.1:8221/stat"

# 设置本地缓存文件更新时间间隔为60秒
CACHETTL = 5

# 设置本地缓存文件的绝对路径
CACHE = "/tmp/nginx-rtmp-status.cache"

# 从命令行参数中获取需要查询的直播频道名称
STREAM = sys.argv[1]

# 创建一个Live对象实例
status = Live(url, CACHETTL, CACHE, STREAM)

# 调用get_status()方法获取并打印指定直播频道的流状态
status.get_status()

重启客户端验证在master上使用zabbix-get 测试是否这个key有效。

UserParameter=discovery_live.stream, /usr/bin/python /root/zabbix/etc/scripts/discovery_stream.py

/usr/local/zabbix/bin/zabbix_get -s 192.168.100.13 -p 10052 -k discovery_live.stream

-s : 客户端host

-p : 指定端口

-k : 指定验证的key

验证live.stream[*]是否有效:

UserParameter=live.stream[*],/usr/bin/python /root/zabbix/etc/scripts/stream.py $1

zabbix_get -s 10.50.32.27 -p 10052 -k live.stream[udrmldcctv16_1_1080P]
# 3118312

注意事项

客户端的配置文件路径不能是root路径,zabbix-agent可以安装在/data /tmp /usr 等或者自建目录中,避免server端获取数据权限问题失败。

创建模板和应用集

创建模板

  • 在左侧导航栏中,选择“Templates(模板)”。
  • 点击“Create template(创建模板)”按钮。
  • 在“Name(名称)”字段中输入模板的名称,例如“Universal Server Monitoring(通用服务器监控)”。
  • 配置其他需要的字段,如“Description(描述)”等。
  • 点击“Create template(创建模板)”按钮保存模板。

创建模板应用集

  • 在左侧导航栏中,选择“Templates(模板)”。
  • 找到并点击刚刚创建的模板。
  • 在模板页面的左侧导航栏中,选择“Applications(应用集)”。
  • 点击“Create application(创建应用集)”按钮。
  • 在“Name(名称)”字段中输入应用集的名称,例如“Web Server Monitoring(Web服务器监控)”。
  • 配置其他需要的字段,如“Description(描述)”等。
  • 点击“Create application(创建应用集)”按钮保存应用集。

添加监控项

  • 在应用集页面中,点击“Items(监控项)”选项卡。
  • 点击“Create item(创建监控项)”按钮。
  • 在“Name(名称)”字段中输入监控项的名称,例如“CPU Usage(CPU使用率)”。
  • 在“Type of information(信息类型)”字段中选择适当的类型,如“Zabbix agent”。
  • 在“Key(键)”字段中输入监控项的键名,如“system.cpu.usage[all]”。
  • 配置其他需要的字段,如“Description(描述)”、“Update interval(更新间隔)”等。
  • 点击“Create item(创建监控项)”按钮保存监控项。

关联主机

  • 在左侧导航栏中,选择“Hosts(主机)”。
  • 找到需要关联到模板的主机。
  • 点击主机名称进入主机详情页面。
  • 在左侧导航栏中,选择“Templates(模板)”。
  • 点击“Add template(添加模板)”按钮。
  • 在弹出窗口中选择之前创建的模板,然后点击“Select(选择)”按钮。
  • 点击“Update(更新)”按钮保存关联关系。