You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用Zabbix API如何过滤JSON输出并格式化uptime结果

Zabbix API提取指定监控项方案

核心问题处理逻辑

1. 指定监控项过滤

优先在API请求层面直接过滤,无需拉取全量监控项后本地筛选,性能更高。修改host.get接口的selectItems参数,传入过滤规则指定只返回key_为system.uptime的监控项即可。如果需要本地兼容多监控项筛选,也可以遍历返回的items列表,通过item['key_'] == 目标key的条件匹配。

2. 格式化处理

  • 秒级时间转换:通过整除、取模运算拆分天、小时、分钟单位,拼接为易读格式
  • 排版按照要求逐行输出主机名、监控项和对应值即可,额外加分隔线区分不同主机提升可读性

修改后可直接运行的完整代码

#!/usr/bin/python
import requests
import json

ZABBIX_API_URL = "http://localhost/zabbix/api_jsonrpc.php"
UNAME = "Admin"
PWORD = "zabbix"
TARGET_ITEM_KEY = "system.uptime"

# 秒转易读时间格式
def sec_to_readable(seconds):
    seconds = int(seconds)
    day = seconds // 86400
    hour = (seconds % 86400) // 3600
    minute = (seconds % 3600) // 60
    sec = seconds % 60
    res = []
    if day > 0:
        res.append(f"{day}天")
    if hour > 0:
        res.append(f"{hour}小时")
    if minute > 0:
        res.append(f"{minute}分钟")
    if sec > 0 or len(res) == 0:
        res.append(f"{sec}秒")
    return "".join(res)

# 登录
r = requests.post(ZABBIX_API_URL,
                  json={
                      "jsonrpc": "2.0",
                      "method": "user.login",
                      "params": {
                          "user": UNAME,
                          "password": PWORD},
                      "id": 1
                  })
AUTHTOKEN = r.json()["result"]

# 查询主机+指定监控项,API层直接过滤
r = requests.post(ZABBIX_API_URL,
                  json={
                            "jsonrpc": "2.0",
                            "method": "host.get",
                            "params": {
                                "output": ["name"],
                                "selectItems": {
                                    "output": ["name", "lastvalue", "key_"],
                                    "filter": {"key_": TARGET_ITEM_KEY}
                                }
                                },
                            "id": 2,
                            "auth": AUTHTOKEN
                        })
host_list = r.json()["result"]

# 按要求格式输出
for host in host_list:
    hostname = host["name"]
    print(hostname)
    # 遍历匹配到的监控项(过滤后最多1条)
    for item in host["items"]:
        if item["key_"] == TARGET_ITEM_KEY:
            readable_val = sec_to_readable(item["lastvalue"])
            print(f"{item['name']}({item['key_']}): {readable_val}")
    print("-"*30)

# 登出
print("\nLogout user")
r = requests.post(ZABBIX_API_URL,
                  json={
                      "jsonrpc": "2.0",
                      "method": "user.logout",
                      "params": {},
                      "id": 2,
                      "auth": AUTHTOKEN
                  })

输出示例

Zabbix server
System uptime(system.uptime): 2小时7分钟15秒
------------------------------
Web01
System uptime(system.uptime): 12天3小时24分钟
------------------------------

Logout user

如果需要提取其他监控项,直接修改代码里的TARGET_ITEM_KEY变量值即可。

内容的提问来源于stack exchange,提问作者seguence

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 06:46:04