侧边栏壁纸
博主头像
qu@blog 博主等级

行动起来,活在当下

  • 累计撰写 10 篇文章
  • 累计创建 4 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

zabbix自定义字段

Administrator
2025-08-25 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

添加自定义字段

在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(更新)”按钮保存关联关系。


0

评论区