探索Zabbix API(三):导出主机组资源使用率

9300ccb42fe5d3739713b80424b091e0.gif

新钛云服已累计为您分享779篇技术干货

4c2b3e65ad50b4677128ecad9e2dd880.gif

探索Zabbix API:企业监控管理工具

探索Zabbix API(二):导出主机组及主机信息

今天我们来讲一下探索zabbixAPI的最后一章,结合前两章的内容,导出指定主机组的资源使用情况。

01

使用场景

788bc52aa7ba854e5c128c84a4065656.png

通过该脚本,系统管理员和运维团队可以定期分析系统中特定主机组的性能数据,包括主机的基本信息和 CPU 使用率。这有助于识别系统中的性能瓶颈、监测系统资源的使用情况,并及时采取措施进行优化。

db490d433cff754b1975f086702b1350.png

‍‍‍

02

导出数据的方法介绍

240259338bba5125c52567360da4ba88.png

1.时间函数,用途取监控时间范围

x = (datetime.datetime.now() - datetime.timedelta(hours=12)).strftime("%Y-%m-%d %H:%M:%S")
y = (datetime.datetime.now()).strftime("%Y-%m-%d %H:%M:%S")
z = (time.strftime('%Y-%m-%d %H-%M-%S'))
def timestamp(x, y):
    p = time.strptime(x, "%Y-%m-%d %H:%M:%S")
    starttime = str(int(time.mktime(p)))
    q = time.strptime(y, "%Y-%m-%d %H:%M:%S")
    endtime = str(int(time.mktime(q)))
    return starttime, endtime

函数解析:

x: 表示当前时间减去 12 小时的时间,以字符串形式表示。这一时间字符串的格式为 "%Y-%m-%d %H:%M:%S",即年-月-日 时:分:秒。

y: 表示当前时间,以字符串形式表示,同样使用 "%Y-%m-%d %H:%M:%S" 格式。

z: 使用 time.strftime 函数获取当前时间的字符串表示,格式为 "%Y-%m-%d %H-%M-%S",即年-月-日 时-分-秒。

timestamp函数首先使用 time.strptime 函数将时间字符串转换为结构化的时间元组。然后,通过 time.mktime 函数将时间元组转换为时间戳,并使用 str 函数将时间戳转换为字符串。

2.获取指定监控项的ID

Cpu_load="system.cpu.util[]"
def get_cpu_utilization(host_id, auth):
    data = {
        "jsonrpc": "2.0",
        "method": "item.get",
        "params": {
            "output": "extend",
            "hostids": host_id,
            "search": {
                "key_": Cpu_load  
            },
            "sortfield": "name"
        },
        "auth": auth,
        "id": 1
    }


    response = requests.post(url=ApiUrl, headers=header, json=data)
    result = json.loads(response.content)
    items = result["result"]

函数解析:

函数首先获取与主机关联的监控项,然后从中找到 CPU 使用率相关的监控项。

Cpu_load:表示要获取的主机监控项的key值(可以在对应主机的监控项中查看,这里选的是CPU使用率)

get_cpu_utilization(host_id, auth): 这个函数用于获取指定主机的 CPU 使用率。它首先通过 Zabbix API 中的 item.get 方法获取主机的监控项列表,然后从中找到与 CPU 使用率相关的监控项,并获取其历史数据。最终,返回一个包含 CPU 使用率历史数据的列表。

host_id: 主机的ID,表示要获取 CPU 使用率的主机。

auth: 认证令牌,用于通过 Zabbix API 进行身份验证。

3.获取历史数据函数

def get_item_history(item_id, auth):
    data = {
        "jsonrpc": "2.0",
        "method": "history.get",
        "params": {
            "output": "extend",
            "itemids": item_id,
            "history": 0,  # 0代表数值型数据
            "sortfield": "clock",
            "sortorder": "DESC",
            "limit": 1
        },
        "auth": auth,
        "id": 1
    }


    response = requests.post(url=ApiUrl, headers=header, json=data)
    result = json.loads(response.content)
    history_data = result["result"]
    return history_data

函数解析:

函数通过 Zabbix API 发送请求,拿到历史数据,然后将其返回供后续使用。

get_item_history(item_id, auth): 这个函数用于获取指定监控项(item)的历史数据。它构建了一个 JSON-RPC 请求,其中包括监控项的 item_id,并通过 Zabbix API 中的 history.get 方法获取历史数据。该函数返回一个包含历史数据的列表。

item_id: 监控项的ID,表示要获取历史数据的监控项。

4.获取主机信息喝资源使用率并导入以主机组名命名的CSV文件中

def export_host_info(token, start, end, group_names, group_name_num2):
    filename = f'{group_name_num2}.csv'


    with open(filename, 'w', newline='', encoding='utf-8-sig') as f:
        writer = csv.DictWriter(f, fieldnames=["Group", "Hostname", "IP", "CPU使用率"])
        writer.writeheader()


        for group in group_names:
            if group['name'] == group_name_num2:
                group_id = group['groupid']
                group_name = group['name']
                hosts = get_hosts_in_group(group_id, token)


                for host in hosts:
                    hostname = host['name']
                    ip = host['interfaces'][0]['ip']
                    cpu_utilization = get_cpu_utilization(host['hostid'], token)


                    cpu_value = cpu_utilization[0]['value'] if cpu_utilization else "N/A"


                    writer.writerow({"Group": group_name, "Hostname": hostname, "IP": ip, "CPU使用率": cpu_value})

函数解析:

filename: 通过使用用户选择的主机组名(group_name_num2)作为文件名的一部分创建 CSV 文件的名称。打开 CSV 文件,并使用 csv.DictWriter 对象创建一个 CSV 写入器,定义了列名为 ["Group", "Hostname", "IP", "CPU使用率"]。

写入 CSV 文件的表头行。遍历主机组信息,找到用户选择的主机(group_name_num2)。获取该主机组内的所有主机信息,遍历每个主机。对于每个主机,获取主机名(hostname)、IP地址(ip)和对应的 CPU 使用率(cpu_value)。

将这些信息写入主机组命名的 CSV 文件。

5.打印所有主机组名,根据用户输入模糊匹配列表输出,供用户参考输入。根据用户的输入获取准确的主机组名

def get_zabbix_data():
    token = get_token()
    start, end = timestamp(x, y)


    # Get and display the list of host groups
    host_group_list = []
    group_names = get_group_name(token)
    for index, group in enumerate(group_names, start=1):
        host_group_list.append(f"{index}.{group['name']}")
    print(host_group_list)


    # User input and selection
    group_name = input("请输入zabbix主机组名称: ")
    result = fuzzy_match_list(group_name, host_group_list)
    print(result)


    group_name_num = input("请输入要查询的主机组序号: ")


    # Get user-selected host group information
    group_name_num1 = host_group_list[int(group_name_num) - 1]
    group_name_num2 = group_name_num1.split(".")[1]
    print(group_name_num2)


    return token, start, end, group_names, group_name_num2
    
#调用 get_zabbix_data 函数获取认证令牌、时间范围、主机组列表和用户选择的主机组名。
token, start, end, group_names, group_name_num2 = get_zabbix_data()
#调用 export_host_info 函数,将获取的信息写入 CSV 文件。
export_host_info(token, start, end, group_names, group_name_num2)

函数解析:

调用 get_token 获取 Zabbix API 的认证令牌 token。

  1. 调用 timestamp(x, y) 获取时间范围的起始时间戳 start 和结束时间戳 end。

  1. 获取并输出主机组列表,用户输入所需的主机组名称。

  1. 使用 fuzzy_match_list 函数对用户输入的主机组名称进行模糊匹配,输出匹配结果。

用户输入要查询的主机组序号,计算用户想要的主机组的序号(group_name_num1),然后裁剪掉序号前面的部分得到用户选择的主机组名(group_name_num2)。

最后使用两段代码完成调用。

token, start, end, group_names, group_name_num2 = get_zabbix_data()

export_host_info(token, start, end, group_names, group_name_num2)

d731accb3172b8b9b8a249ad5f7b6986.png

‍‍‍

03

结论

0ea21ddd361f0eda0ccd98d3f83f1260.png

文章描写了 Zabbix API 的脚本通过与用户交互,动态获取 Zabbix 中主机组的信息,对用户选择的特定主机组,获取该主机组内主机的基本信息以及 CPU 使用率,并将这些信息导出到 CSV 文件中。通过 Zabbix 的认证令牌,以及时间范围的设置,使得用户可以根据自己的需求灵活地查询和导出监控数据。从而更好地了解和管理系统的性能。

通过三篇文章,我们简单介绍了如何使用zabbixAPI从添加主机到导出资源信息的过程。在以后的工作中,可以通过这些方法,对脚本进行进一步的优化和扩展,例如添加异常处理、更详细的日志记录、支持更多的导出格式等功能。还能根据具体的使用场景,进一步定制化脚本,以满足更广泛的需求。

    推荐阅读   

6f1c78c91e516cd4d3fbb1239da407a8.png

34a89147d8b9c7129ba354703ad350fd.png

    推荐视频    

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值