问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Zabbix API:高效数据导出技巧

创作时间:
作者:
@小白创作中心

Zabbix API:高效数据导出技巧

引用
CSDN
10
来源
1.
https://blog.csdn.net/weixin_43631631/article/details/145004162
2.
https://blog.csdn.net/Xylon_/article/details/114539337
3.
https://blog.csdn.net/hxiang613/article/details/141721949
4.
https://blog.csdn.net/gitblog_00620/article/details/141912671
5.
https://blog.csdn.net/weixin_52270081/article/details/142249577
6.
https://blog.csdn.net/qq_55723966/article/details/121955609
7.
https://juejin.cn/post/7429272916918534144
8.
https://www.cnblogs.com/navysummer/p/8778499.html
9.
https://www.cnblogs.com/pengai/articles/9021691.html
10.
https://www.zabbix.com/documentation/6.4/zh/manual/installation/requirements/best_practices

在IT运维领域,Zabbix是一个非常受欢迎的开源监控工具。它能够监控网络和应用程序的健康状态,支持多种协议,包括SNMP、IPMI、JMX、Telnet等,能够监控服务器、交换机、路由器、虚拟机等多种设备和服务。而Zabbix API则为用户提供了强大的数据访问和管理能力,使得自动化配置、数据提取和报告生成等功能得以实现。

01

基础入门

认证与会话

在使用Zabbix API之前,首先需要通过user.login方法进行身份验证,获取一个会话(session)ID。认证后,API会返回一个认证token,后续所有的请求都需要携带这个token。

请求示例:

{
  "jsonrpc": "2.0",
  "method": "user.login",
  "params": {
    "user": "Admin",
    "password": "zabbix"
  },
  "id": 1
}

响应示例:

{
  "jsonrpc": "2.0",
  "result": "f8c7fd915ca219070c8a70d51a7e9b83",
  "id": 1
}

请求格式

API请求通常包括以下几个部分:

  • jsonrpc: 表示JSON-RPC协议的版本,通常为"2.0"
  • method: 要调用的API方法
  • params: 请求的参数,格式根据方法不同而变化
  • auth: 认证token,通常是从user.login方法中获得
  • id: 请求的唯一标识符,可以是任何整数

注:请求除了必须是POST方法之外,HTTP Header Content-Type必须为:application/jsonrequest,application/json-rpc,application/json其中之一。

示例:

{
  "jsonrpc": "2.0",
  "result": [
    {
      "hostid": "10105",
      "name": "Zabbix server",
      "status": "0"
    },
    {
      "hostid": "10106",
      "name": "Zabbix agent",
      "status": "0"
    }
  ],
  "id": 1
}
02

核心功能

获取主机信息

通过host.get方法可以获取主机信息。以下是一个Python示例:

import requests
import json

zabbix_url = 'http://192.168.88.128/z/api_jsonrpc.php'
username = 'Admin'
password = 'zabbix'

def get_auth_token():
    headers = {'Content-Type': 'application/json'}
    data = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "username": username,
            "password": password
        },
        "id": 1
    }
    response = requests.post(zabbix_url, headers=headers, data=json.dumps(data))
    return response.json().get('result')

def get_hosts(auth_token):
    headers = {'Content-Type': 'application/json'}
    data = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["host"],
            "selectInterfaces": ["ip"]
        },
        "auth": auth_token,
        "id": 1
    }
    response = requests.post(zabbix_url, headers=headers, data=json.dumps(data))
    return response.json().get('result')

def main():
    auth_token = get_auth_token()
    hosts = get_hosts(auth_token)
    for host in hosts:
        host_name = host['host']
        ip_address = host['interfaces'][0]['ip']
        print(f"{host_name}, {ip_address}")

if __name__ == "__main__":
    main()

获取监控项信息

通过item.get方法可以获取监控项信息。以下是一个示例:

{
  "jsonrpc": "2.0",
  "method": "item.get",
  "params": {
    "output": ["itemid", "key_"],
    "hostids": "10084"
  },
  "auth": "2e8e14156969827cb98f08fa95769adb",
  "id": 1
}

返回结果:

{
  "jsonrpc": "2.0",
  "result": [
    {
      "itemid": "23327",
      "key_": "agent.hostname"
    },
    {
      "itemid": "28963",
      "key_": "system.cpu.util"
    },
    {
      "itemid": "23316",
      "key_": "vm.memory.size[available]"
    },
    {
      "itemid": "28635",
      "key_": "vfs.fs.size[/,used]"
    }
  ]
}

获取历史数据

通过history.get方法可以获取监控项的历史数据。以下是一个示例:

{
  "jsonrpc": "2.0",
  "method": "history.get",
  "params": {
    "output": "extend",
    "history": 3,
    "itemids": "23316",
    "sortfield": "clock",
    "sortorder": "DESC",
    "limit": 10
  },
  "auth": "2e8e14156969827cb98f08fa95769adb",
  "id": 1
}

返回结果:

{
  "jsonrpc": "2.0",
  "result": [
    {
      "itemid": "23316",
      "clock": "1615195836",
      "value": "3097325568",
      "ns": "155573301"
    }
  ]
}
03

高级技巧

使用graphid和itemid

在某些场景下,可能需要获取特定图形或监控项的数据。这时就需要使用graphid和itemid。

例如,要获取某个主机的CPU利用率监控项的值,可以先通过item.get方法获取itemid,然后再使用history.get方法获取历史数据。

import requests
import json

zabbix_url = 'http://192.168.88.128/z/api_jsonrpc.php'
username = 'Admin'
password = 'zabbix'

def get_auth_token():
    headers = {'Content-Type': 'application/json'}
    data = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "username": username,
            "password": password
        },
        "id": 1
    }
    response = requests.post(zabbix_url, headers=headers, data=json.dumps(data))
    return response.json().get('result')

def get_item_id(auth_token, host_id, key):
    headers = {'Content-Type': 'application/json'}
    data = {
        "jsonrpc": "2.0",
        "method": "item.get",
        "params": {
            "output": ["itemid"],
            "hostids": host_id,
            "search": {
                "key_": key
            }
        },
        "auth": auth_token,
        "id": 1
    }
    response = requests.post(zabbix_url, headers=headers, data=json.dumps(data))
    return response.json().get('result')[0]['itemid']

def get_history_data(auth_token, item_id, limit=10):
    headers = {'Content-Type': 'application/json'}
    data = {
        "jsonrpc": "2.0",
        "method": "history.get",
        "params": {
            "output": "extend",
            "history": 0,
            "itemids": item_id,
            "sortfield": "clock",
            "sortorder": "DESC",
            "limit": limit
        },
        "auth": auth_token,
        "id": 1
    }
    response = requests.post(zabbix_url, headers=headers, data=json.dumps(data))
    return response.json().get('result')

def main():
    auth_token = get_auth_token()
    host_id = '10084'
    key = 'system.cpu.util'
    item_id = get_item_id(auth_token, host_id, key)
    history_data = get_history_data(auth_token, item_id)
    for data in history_data:
        print(data)

if __name__ == "__main__":
    main()

实时导出功能

Zabbix提供了实时导出功能,允许用户将触发器事件、监控项采集值和趋势数据实时导出。这些数据以换行符分隔的JSON格式导出,确保了数据的及时性和机器可读性。

要启用实时导出,需要修改Zabbix的配置文件,通常位于/etc/zabbix/zabbix_server.conf。配置项包括:

  • ExportDir:设置实时导出数据的目录。
  • ExportFileSize:设置每个导出文件的最大字节数。
  • ExportType:通过逗号分隔的列表,控制导出实体的类型,如事件(events)、历史(history)、趋势(trends)。

与Zabbix API相比,实时导出功能具有以下优势:

  • 实时性:数据实时写入文件,几乎无延迟
  • 资源消耗:由Zabbix服务器直接写入文件,对服务器资源消耗较低
  • 数据完整性:所有数据实时导出,完整性高
  • 操作复杂度:配置简单,一旦设置,无需额外操作
  • 数据格式:数据以换行符分隔的JSON格式导出,易于机器读取和处理
  • 数据安全性:数据直接写入本地文件,无需开放网络接口
  • 数据导出量:可以配置导出文件的大小,适合大量数据导出
  • 维护成本:维护成本低,配置后无需太多关注
  • 扩展性:可以轻松地将导出的数据集成到ELK、Kafka等日志和数据处理系统中

配置步骤如下:

  1. 修改Zabbix配置文件:
ExportDir=/data/zbx/datakit
ExportFileSize=32M
ExportType=events,history,trends
  1. 创建导出目录并设置权限:
mkdir -p /data/zbx/datakit
chown zabbix:zabbix -R /data/zbx/datakit
chmod u+rw -R /data/zbx/datakit/
  1. 重启Zabbix服务:
systemctl restart zabbix-server
04

最佳实践

  1. 错误处理:在实际应用中,需要添加适当的错误处理机制,以应对网络问题、API调用失败等情况。

  2. 性能优化:对于大规模的Zabbix部署,频繁的API调用可能会对服务器造成较大压力。在这种情况下,可以考虑使用Zabbix的实时导出功能,或者优化API调用的频率和方式。

  3. 安全性:在生产环境中,需要确保API调用的安全性。这包括使用HTTPS、限制API访问的IP范围、定期更换认证凭据等。

  4. 数据完整性:在处理大量数据时,需要确保数据的完整性和一致性。这可能需要额外的逻辑来处理分页、数据遗漏等问题。

  5. 日志记录:为了便于排查问题和审计,建议在代码中添加详细的日志记录。

通过掌握这些技巧和最佳实践,你可以更高效地使用Zabbix API,实现自动化监控和数据分析,从而提高IT运维效率。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号