通过python 调用 zabbix api 获取 主机的CPU 使用率
时间: 2025-08-22 11:01:11 浏览: 3
<think>我们使用zabbix API获取主机CPU使用率。首先需要安装zabbix-api库(如果未安装,使用pip install zabbix-api)。然后按照以下步骤:
1. 导入ZabbixAPI类并创建连接。
2. 认证(使用用户名和密码)。
3. 获取主机ID(通过主机名)。
4. 获取CPU使用率的监控项ID(监控项键值一般为`system.cpu.util[,idle]`,但实际使用率可能是100%减去空闲率,或者直接使用`system.cpu.util[,used]`等。这里我们通常获取的是非空闲的CPU使用率,即`system.cpu.util[,used]`或`system.cpu.util`(总使用率)?注意:具体键值可能因配置而异,常见的是`system.cpu.util[,idle]`,然后计算使用率=100-idle)。
不过,在Zabbix中,我们也可以直接获取用户态、内核态等。但通常我们关心的是总使用率。这里我们以获取`system.cpu.util`(总使用率)为例,但注意:这个键值可能不直接存在,我们可能需要获取各个状态然后相加。实际上,更常见的做法是获取`system.cpu.util[,idle]`,然后计算使用率=100-idle,或者直接获取`system.cpu.util[,used]`(如果模板中有)。
在Zabbix的官方模板中,通常提供了CPU使用率的监控项。例如,在“Template OS Linux”中,有一个监控项键值为`system.cpu.util`,并且可以设置不同的参数(如mode)。我们通常使用`system.cpu.util[,avg1]`来获取最近1分钟的平均使用率,或者`system.cpu.util`(默认是总使用率,但具体要看模板)。
但是,为了准确,我们可能需要先查看主机上监控项的键值。这里我们假设我们要获取的是总的CPU使用率(即所有状态的总和减去空闲)的监控项,键值为`system.cpu.util[,used]`(但注意,这个键值可能不存在,更常见的是`system.cpu.util`,然后通过参数指定类型)。
实际上,我们通常这样获取:
- 获取idle的监控项:`system.cpu.util[,idle]`
- 然后计算:使用率 = 100 - idle值
或者,如果我们能直接获取到`system.cpu.util[,user]`+`system.cpu.util[,system]`+`system.cpu.util[,nice]`+...等,然后相加得到使用率。但这样比较麻烦。
在Zabbix中,通常有一个监控项直接提供总的使用率(非空闲)。所以,我们这里假设我们使用键值`system.cpu.util`(不带参数,表示总使用率)?但根据官方文档,不带参数是不允许的。实际上,我们需要指定一个模式(mode),比如`all`,或者使用`avg1`等。但更常见的是,我们使用`system.cpu.util[,all,avg1]`?这并不准确。
经过查阅,通常我们使用`system.cpu.util[,,avg1]`来获取最近1分钟的平均总使用率(所有核心的平均值)。但注意,这个键值返回的是总使用率(包括用户态、系统态、nice、irq等,即非空闲的时间占比)。所以,我们直接使用这个键值即可。
但是,在Zabbix的模板中,通常会有多个监控项,我们需要确定我们想要的监控项。这里我们假设使用键值`system.cpu.util[,avg1]`(表示最近1分钟的平均总使用率,注意:这个键值实际上返回的是所有CPU状态的总和?不,它需要指定模式。实际上,如果我们不指定模式,默认是`all`?但文档中说明必须指定模式。所以,我们可能需要使用`system.cpu.util[all,avg1]`)。
根据Zabbix官方文档:https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/zabbix_agent
键值:system.cpu.util[<cpu>,<type>,<mode>]
其中,type可以是:user, system, idle, nice, iowait, irq, softirq, steal, guest, guest_nice
或者使用all(表示所有类型之和,实际上非空闲时间就是100-idle,而all模式返回的是所有非空闲时间?注意:all模式返回的是所有状态的总和(包括idle)?不对,各个状态之和为100%,所以all模式返回的是100%,这没有意义。所以,我们通常需要的是非空闲时间,即100-idle。
因此,我们有两种方式:
1. 获取idle的值,然后计算100-idle。
2. 直接获取一个已经计算好的使用率(如果模板中有这样的监控项)。
在标准模板“Template OS Linux”中,有一个监控项叫做“CPU utilization”(名称),其键值为`system.cpu.util[,idle]`,然后应用集成为100减去该值。但如果我们直接通过API获取历史数据,我们可能需要自己计算。
所以,为了简单,我们直接获取idle的监控项,然后计算使用率。步骤:
a. 获取键值为`system.cpu.util[,idle]`的监控项(注意,可能还需要指定时间间隔和平均时间,比如avg1,但键值中不包含avg1,而是通过监控项配置中的参数设置。监控项键值中我们通常指定模式,比如`system.cpu.util[,idle,avg1]`表示最近1分钟的平均空闲率)。但实际在模板中,我们可能看到的是`system.cpu.util[,idle]`,然后它返回的是当前的空闲率(瞬时值?),但通常我们使用平均值。
因此,我们这里选择获取最近1分钟的平均空闲率:`system.cpu.util[,idle,avg1]`,然后使用率=100-该值。
但是,我们也可以获取其他时间粒度的。这里我们以avg1为例。
5. 获取该监控项的历史数据(指定时间范围,比如最近1小时)。
注意:由于API调用需要权限,确保用户有访问主机的权限。
下面是示例代码:
步骤:
1. 连接Zabbix服务器。
2. 认证。
3. 通过主机名获取主机ID。
4. 通过主机ID和监控项键值获取监控项ID(这里我们获取`system.cpu.util[,idle,avg1]`的监控项ID)。
5. 通过监控项ID获取历史数据(这里获取最近1小时的数据,每10分钟一个点?具体根据需求,我们可以指定时间范围,并选择输出格式)。
6. 计算每个数据点的CPU使用率(100 - 空闲率)。
注意:Zabbix API返回的历史数据中的值是字符串,需要转换为浮点数。
另外,我们也可以直接获取已经计算好的使用率(如果存在这样的监控项),但为了通用性,我们按照上述步骤。
但是,请注意:不同的Zabbix模板可能配置不同的监控项键值。因此,我们需要根据实际情况调整键值。
如果无法获取到`system.cpu.util[,idle,avg1]`,可以尝试其他键值,比如`system.cpu.util[,idle]`(不带avg1,则可能是当前瞬时值)或者查看模板中配置的键值。
下面我们写代码:</think>### 使用 Python 调用 Zabbix API 获取主机 CPU 使用率
以下是完整的示例代码,通过 Python 调用 Zabbix API 获取主机 CPU 使用率:
```python
import requests
import json
from datetime import datetime, timedelta
# Zabbix 服务器配置
ZABBIX_URL = "http://your_zabbix_server/api_jsonrpc.php"
ZABBIX_USER = "Admin"
ZABBIX_PASSWORD = "zabbix"
# 认证令牌获取函数
def get_auth_token():
headers = {"Content-Type": "application/json-rpc"}
payload = {
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": ZABBIX_USER,
"password": ZABBIX_PASSWORD
},
"id": 1
}
response = requests.post(ZABBIX_URL, data=json.dumps(payload), headers=headers)
return response.json()["result"]
# 获取主机 ID
def get_host_id(auth_token, host_name):
headers = {"Content-Type": "application/json-rpc"}
payload = {
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": ["hostid"],
"filter": {"host": [host_name]}
},
"auth": auth_token,
"id": 2
}
response = requests.post(ZABBIX_URL, data=json.dumps(payload), headers=headers)
return response.json()["result"][0]["hostid"]
# 获取 CPU 使用率监控项 ID
def get_cpu_item_id(auth_token, host_id):
headers = {"Content-Type": "application/json-rpc"}
payload = {
"jsonrpc": "2.0",
"method": "item.get",
"params": {
"output": ["itemid"],
"hostids": host_id,
"search": {"key_": "system.cpu.util[,idle]"},
"searchByAny": True
},
"auth": auth_token,
"id": 3
}
response = requests.post(ZABBIX_URL, data=json.dumps(payload), headers=headers)
return response.json()["result"][0]["itemid"]
# 获取 CPU 使用率历史数据
def get_cpu_usage(auth_token, item_id, time_range=3600):
end_time = datetime.now().timestamp()
start_time = (datetime.now() - timedelta(seconds=time_range)).timestamp()
headers = {"Content-Type": "application/json-rpc"}
payload = {
"jsonrpc": "2.0",
"method": "history.get",
"params": {
"output": "extend",
"itemids": item_id,
"history": 0, # 浮点数类型
"sortfield": "clock",
"sortorder": "ASC",
"time_from": int(start_time),
"time_till": int(end_time)
},
"auth": auth_token,
"id": 4
}
response = requests.post(ZABBIX_URL, data=json.dumps(payload), headers=headers)
return response.json()["result"]
# 主函数
def main():
# 获取认证令牌
auth_token = get_auth_token()
# 指定目标主机名
host_name = "Your_Host_Name"
# 获取主机 ID
host_id = get_host_id(auth_token, host_name)
# 获取 CPU 监控项 ID
cpu_item_id = get_cpu_item_id(auth_token, host_id)
# 获取 CPU 使用率数据 (默认最近1小时)
cpu_data = get_cpu_usage(auth_token, cpu_item_id)
# 处理并显示结果 (空闲率 → 使用率)
print(f"CPU 使用率数据 ({host_name}):")
for record in cpu_data:
timestamp = datetime.fromtimestamp(int(record['clock']))
usage = 100 - float(record['value']) # 计算实际使用率
print(f"{timestamp}: {usage:.2f}%")
if __name__ == "__main__":
main()
```
### 关键说明
1. **配置修改**:
- 替换 `your_zabbix_server` 为实际 Zabbix 服务器地址
- 替换 `Admin` 和 `zabbix` 为实际 API 用户凭据
- 替换 `Your_Host_Name` 为目标主机名
2. **核心原理**:
- 获取空闲 CPU 百分比 (`system.cpu.util[,idle]`)
- 计算 CPU 使用率:$ \text{使用率} = 100 - \text{空闲率} $
- 默认获取最近 1 小时数据(可通过修改 `time_range` 调整)
3. **监控项说明**:
- `system.cpu.util[,idle]`:CPU 空闲百分比
- 其他可用监控项:
- `system.cpu.util[,user]`:用户空间占用
- `system.cpu.util[,system]`:内核空间占用
- `system.cpu.util[,iowait]`:I/O 等待占用
4. **数据类型**:
- `history` 参数设置为 `0` 表示浮点数类型
- 时间戳使用 UNIX 时间格式(秒级精度)
### 常见问题解决
1. **认证失败**:
- 检查 API 用户权限(需启用 API 访问)
- 确认用户组具有访问主机的权限
2. **无数据返回**:
- 确认主机名拼写完全匹配
- 检查 Zabbix agent 是否正常运行
- 验证监控项是否存在(通过 Zabbix 前端确认)
3. **性能优化**:
- 对于大量数据请求,增加 `limit` 参数限制返回条目数
- 使用聚合函数减少数据量(如 `avg`/`max` 等)
4. **时间范围调整**:
- 修改 `time_range` 参数(秒为单位)
- 自定义精确时间范围:
```python
start_time = datetime(2023, 1, 1).timestamp()
end_time = datetime(2023, 1, 2).timestamp()
```
[^1]: Zabbix 官方 API 文档:https://www.zabbix.com/documentation/current/en/manual/api
阅读全文
相关推荐



















