前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于ZabbixAPI快速生成多Keys监控图表

基于ZabbixAPI快速生成多Keys监控图表

作者头像
Zabbix
发布于 2021-12-28 09:22:06
发布于 2021-12-28 09:22:06
74600
代码可运行
举报
文章被收录于专栏:Zabbix中国官方Zabbix中国官方
运行总次数:0
代码可运行

随着公司的业务规模不断扩大,运维纳管机器的数量也在增加,引入自动化手段为捉襟见肘的工作减压,已成为重中之重。本文分享笔者在企业DevOps过程中,是如何有效结合ZabbixAPI来实现批量监控的案例。

1. 前置条件

1.1. 接口分析

假若当前有个新的监控要求:业主希望快速将一批主机的某个监控项关联到一张图上来(非grpfunc叠加),即以CPU、MEM、DISK等维度纵向对比这批主机的资源使用情况。很显然,当主机数超过一定量时手工创建会非常枯燥和繁琐,所幸Zabbix提供了API。我们通过分析Zabbix Docs中的graph.create图表接口,得知要提供的主机HostID、监控项键值ItemID,使用到的Zagbix Method主要有:User Host HostGroup Item Graph等5种方法。

如上图,描述本次批量创建图表的主要脚本逻辑,即先获取Zabbix的身份验证令牌,然后查询主机或主机群获得其HOSTID,接着以HOSTID依次获取指定监控键值ID加入列表池,最后一次性请求graph.create进行图表创建。

1.2. 环境约定

系统/工具

版本

Zabbix

5.0.1

CentOS

7.6.1810

Python

3.6.8

本自动化案例脚本在Zabbix5.0验证通过,理论上支持Zabbix5.4,主要版本内部具有向后兼容性。

2. 构建接口

2.1. 认证类(AUTH)

创建AUTH类并声明一个私有函数__init__,用来初始化Zabbix接口、Zabbix用户名,Zabbix密码。在条件允许的情况下,建议使用SuperAdmin超管用户,跑通之后再进行权限精细化管理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class AUTH(object):
    def  __init__(self):
        self.zabbix_api = set.Zabbix["api"]
        self.zabbix_user = set.Zabbix["user"]
        self.zabbix_pass = set.Zabbix["pass"]

创建rcpResult函数,作为桥接Zabbix API数据通道的桥梁。Zabbix API使用JSON-RPC 2.0协议,作为Web前端的一部分提供,支持HTTP POST协议。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def rpcResult(self, params):
    headers = {"Content-Type": "application/json-rpc"}
    rsp = requests.post(url=self.zabbix_api, headers=headers, data=json.dumps(params))
    try:
        return  rsp.json()["result"]
    except:
        set.logger.error(rsp.json()["error"])
        exit(1)

创建getToken函数,在进入ZabbixAPI神秘世界之前,需申请一张身份验证令牌。官方提供了一个叫user.login的method调用方法,其userpassword参数为Web端账密信息,而id作为请求的标识符,其支持整形、浮点型、字符串3种数据类型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getToken(self):
    params = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {
            "user": self.zabbix_user,
            "password": self.zabbix_pass,
        },
        "id": "Chasii"
    }
    return self.rpcResult(params)

通过调用AUTH类的Get_Token函数AUTH().Get_Token(),得到接口返回的result,就是我们通往神秘世界的一把钥匙。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "jsonrpc": "2.0",
    "result": "22e6f614a89ccc1c1226429c4b7b08a0",
    "id": "Chasii"
}

值得注意的是,通过user.login方法申请到的身份验证令牌其永久生效,不会被系统释放。频繁调度会产生大量opensession记录,从而占用系统资源。这里给出了三种解决方案:

  • 1、在Web端将对应用户的Auto-logout选项勾上并设置时间使其自动失效。
  • 2、将身份校验令牌缓存成文本或存入中间件,可重复调用,
  • 3、使用user.logout方法,即用即销,安全绿色。

如下destroyToken函数,提供了官网注销Token的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def destroyToken(self, token):
    params = {
        "jsonrpc": "2.0",
        "method": "user.logout",
        "params": [],
        "auth": token,
        "id": "Chasii"
    }
    return self.rpcResult(params)

2.2. 主机类(HOST)

创建HOST类并声明__init__私有函数,通过入参zbx_token获取ZabbixAPI身份令牌,供本类函数调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HOST(object):
    def  __init__(self, zbx_token):
        self.zbx_token = zbx_token

创建getGroupID函数,通过查询指定groupid群主ID,返回该组内所有主机ID及其主机名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getHostID(self, groupid):
    params = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["hostid","host"],
            "groupids": groupid
        },
        "auth": self.zbx_token,
        "id": "Chasii"
    }
    return AUTH().rpcResult(params)

2.3. 群组类(HOSTGROUP)

创建HOSTGROUP类并声明__init__私有函数,通过入参zbx_token获取ZabbixAPI身份令牌,供本类函数调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class HOSTGROUP(object):
    def  __init__(self, zbx_token):
        self.zbx_token = zbx_token

创建getGroupID函数,通过查询指定群组名hostgroup,返回群组ID。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getGroupID(self, hostgroup):
    params = {
        "jsonrpc": "2.0",
        "method": "hostgroup.get",
        "params": {
            "output": "groupid",
            "filter": {"name": [hostgroup]}
        },
        "auth": self.zbx_token,
        "id": "Chasii"
    }
    return AUTH().rpcResult(params)

2.4. 指标类(ITEM)

创建ITEM指标类并声明一个私有函数,通过入参zbx_token获取ZabbixAPI身份令牌,供本类函数调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ITEM(object):
    def  __init__(self, zbx_token):
        self.zbx_token = zbx_token

创建getItemID函数,通过查询指定主机名host和指标项key,返回监控项ID。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def getItemID(self, host, key):
    params = {
        "jsonrpc": "2.0",
        "method": "item.get",
        "params": {
            "output": "itemid",
            "host": host,
            "search": { "key_": key},
        },
        "auth": self.zbx_token,
        "id": "Chasii"
    }
    return AUTH().rpcResult(params)

2.5. 图表类(GRAPH)

Zabbixgraph.create接口参数说明:

必选参数

支持类型

示例

name

字符串

图表的名称、如Biz_Group001_CPU、Biz_Group001_MEM

width

整数型

图表的高度,如900像素,在config.py文件中指定

height

整数型

图表的高度,如200像素,在config.py文件中指定

gitems

列表型

图标的监控项列表,如[{"itemid":"22828","color":"00AA00"}]

创建一个GRAPH指标类并声明一个私有函数,通过入参zbx_token获取ZabbixAPI身份令牌,供本类函数调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class GRAPH(object):
    def  __init__(self, zbx_token):
        self.zbx_token = zbx_token

创建createGrapth函数,指定图表名gname,图表宽度gwidth,图表高度gheigth,图表监控项参数gitems

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def createGrapth(self, gname, gwidth, gheight, gitems):
    params = {
        "jsonrpc": "2.0",
        "method": "graph.create",
        "params": {
            "name": gname,"width": gwidth,"height": gheight,"gitems": gitems
        },
        "auth": self.zbx_token,
        "id": "Chasii"
    }
    return AUTH().rpcResult(params)

3. 调用接口

3.1. 项目介绍

通过上面对官方API的解读,我们已经知道如何使用它了。那么接下来的任务就是如何将这些配件、模块组装起来,让它running起来。为更方便讲解本案例,笔者已将上述相关API脚本上传至Github。读者可关注和克隆到本地使用,未来会支持更多功能。

项目代码Git地址:https://github.com/Chasii/ZabbixCli.git

项目框架说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ZabbixCli
├── app # Zabbix接口
│   └── api.py
├── conf # Zabbix配置
│   └── settings.py
├── docs # Zabbix说明
│   ├── Nginx-Established.png
│   └── Sequence-Diagram.png
├── logs # 程序日志
│   └── zbx.log
├── readme.md
└── zbxcli.py # 统一入口

3.2. 配置分离

通过配置分离,将易变的模块拎出来作为独立文件,增强项目稳定性和可塑性。config.py文件定义了日志输出格式、日志输出方式(文件、控制台),同时指定Zabbix账号及图表的默认像素,读者可根据自身情况及需求进行调整,下面摘取部分代码进行展示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# Log Set
...
log_fmt = '%(asctime)s  %(filename)s [line:%(lineno)d] %(levelname)s:%(message)s'
# Export Console
....
logger.addHandler(rf_handler)
# Export Logfile
...
logger.addHandler(f_handler)
# Env Set
Zabbix = {
    "api": "http://<your_ip>/api_jsonrpc.php",
    "user": "<your_name>",
    "pass": "<your_pass>",
...
}

3.3. 创建入口

创建ZBXCLI入口类并声明一个私有函数,调用AUTH类获得初始ZabbixAPI身份令牌,供本类函数调用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class  ZBXCLI(object):
    def  __init__(self):
        self.zbx_token = zbx.AUTH().getToken()

如下函数主要处理CLI传来参数,其中函数randomColor返回随机16进制颜色码、函数handleItem根据主机名和监控指标获取ItemID、函数handleHosthandleGroup负责处理HostID,函数createGraph请求接口创建图表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def  randomColor(self):
     return ("".join(random.choice("0123456789ABCDEF") for  i  in  range(6)))
def  handleItem(self, key, hosts):
     items = []
     for host in hosts:
         items.append(zbx.ITEM(self.zbx_token).getItemID(host, key)[0]["itemid"])
     return items
def  handleHost(self, hosts):
     items = self.handleItem(args.key, hosts)
     self.createGraph(items)
     ...
def  handleGroup(self, groups):
     for group  in  groups:
         result = zbx.HOSTGROUP(self.zbx_token).getGroupID(group)
     ...
def  createGraph(self, items):
     gitems = []
     ...

3.4. 调用示例

ZabbixCli参数说明

参数

说明

key

监控键值(Key),注意不是监控的指标名

name

图表名,需保持唯一性,支持中文

type

支持类型指定主机群组or主机,有特殊字符请加上双引号

nargs

主机群组/主机列表参数,多参数请使用空格分开,支持中文

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ python3 zbxcli.py -h
usage: zbxcli.py [-h] -key KEY -name NAME -type {hostgraph,groupgraph} -nargs
                 NARGS [NARGS ...]
=== Zabbix Cli ===
optional arguments:
  -h, --help            show this help message and exit
  -key KEY              Zabbix Item Key
  -type {hostgraph,groupgraph}
  -nargs NARGS [NARGS ...]
3.4.1. 主机模式

指定主机host1host2,关联操作系统CPU负载的键值system.cpu.load[all,avg5],并将图表命名为RELATE_GRAPH.CPU.LOAD.AVG5

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ python3 zbxcli.py -key "system.cpu.load[all,avg5]" \
-name "RELATE_GRAPH.CPU.LOAD.AVG5" \
-type hostgraph \
-nargs "host1" "host2"
2021-12-11 17:32:58,507 zbxcli.py [line:52] INFO{'graphids': ['57138']}

打开任意指定主机的Graph配置项,查找RELATE_GRAPH.CPU.LOAD.AVG5图表名字可以看到,我们创建的主机键值已经关联到一张图表上了,通过Preview可正常显示。

3.4.2. 群组模式

指定群组BizGroup001主机群组BizGroup002主机群组,关联所有主机的Nginx-Established链接数,键值为tcp_conn_established自定义Key,图表命名为RELATE_GRAPH.TCP_CONN_ESTABLISH

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ python3 zbxcli.py -key "tcp_conn_established" -name "RELATE_GRAPH.TCP_CONN_ESTABLISH" -type groupgraph -nargs "BizGroup001主机群组" "BizGroup002主机群组"
2021-12-11 17:45:36,212 zbxcli.py [line:42] INFO"BizGroup001主机群组" includes these hosts: host1,host2,...
2021-12-11 17:45:36,851 zbxcli.py [line:52] INFO{'graphids': ['57139']}
2021-12-11 17:45:36,212 zbxcli.py [line:42] INFO"BizGroup002主机群组" includes these hosts: host3,host4,...
2021-12-11 17:45:36,851 zbxcli.py [line:52] INFO{'graphids': ['57140']}

通过指定单台/多台群组,自动将指标值关联到一张表上。我们通过控制台日志可以看到,ZabbixCli分别在BizGroup001主机群组BizGroup002主机群组的主机里创建graphids为57139和57140的图表,通过快速访问https://<your_ip>/chart2.php?graphid=<your_graphids>得知它们展示的数据一样。

本文从监控需求分析入手,介绍了整个自动化思路、ZabbixAPI调用方法、图形接口构建与整合、统一Cli入口,相信对于Zabbix和Python入门的同学来说也能轻松理解。最后希望本案例能给各位朋友带来启发,如有疑问欢迎一起交流。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Zabbix开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
运维python进行(三) 用pytho
  zabbix是一款非常主流监控软件,以简单易用为人称道。zabbix拥有完善的api方便大家通过第三方调用,所以今天介绍一下如何利用python完成对zabbix api调用。
py3study
2020/01/09
6160
CVE-2024-42327:Zabbix认证后SQL注入漏洞
Zabbix 是一款开源的网络监控和报警系统,用于监视网络设备、服务器和应用程序的性能和可用性。
Timeline Sec
2025/01/22
1440
CVE-2024-42327:Zabbix认证后SQL注入漏洞
Go:Json转结构体
本文转载于(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/mBbf0DuUh1Af3vi2DBE7DA
不背锅运维
2022/10/18
5380
Go:Json转结构体
分布式监控系统Zabbix-批量添加聚合图形
之前部署了Zabbix(3.4.4版本)监控环境,由于主机比较多,分的主机组也比较多,添加聚合图形比较麻烦,故采用python脚本进行批量添加聚合图形。脚本下载地址:https://pan.baidu.com/s/1bpApIPp   (密码:wpts)脚本操作如下: [root@zabbix01 ~]# cd /opt/ [root@zabbix01 opt]# ls create_Disk_space_usage_screen.py create_screen.py ================
洗尽了浮华
2018/01/23
1.7K0
分布式监控系统Zabbix-批量添加聚合图形
zabbix发送报警信息带图片
zabbix 发送报警内容调用 zabbix 的 api 生成原始图数据,然后将图片上传到远方图床取出图片 URL 进行展示;
cuijianzhe
2022/06/14
6990
zabbix发送报警信息带图片
python利用zabbix API添加
首先说一下坑的地方就是python2和python3的模块改变问题,当然精通python的可以略过。这个在网上百度一下吧,第二个是导入xlsx文件的时候需要xlrd模块,而这个模块最好跟着我下面的方法走,那个python2 就可以用我下边的脚本了。
py3study
2020/01/06
6520
python利用zabbix API添加
python3 下 Zabbix监控调用graph.get并且下载监控图
这个代码是如何访问三个不同机房并将传入的zabbix中的监控机器的ip进行判断(因为后来需要登陆网站,不同的机房名称不一样) 可以输入两个参数 只输入IP 返回监控列表 需要准备的包: pre
98k
2018/04/11
2K0
python3 下 Zabbix监控调用graph.get并且下载监控图
python zabbix监控
config/mysql_config.json { "ip":"127.0.0.1", "port":3306, "username":"root", "password":"root", "database":"monitor", "charset":"utf8" } config/monitor.json { "3":["10.80.3.16","net.if","eth0","-1d","800","300"], "4":["10.80.3.16","system.cpu.u
葫芦
2019/04/17
2K0
zabbix二次开发之批量添加web监控
zabbix 添加web监控始终是大问题,不能自动发现只能手动添加 写了个py脚本 #!/usr/bin/env python # -*- coding: utf-8 -*- import json import urllib2 import sys class zabbixtools:     def __init__(self):         self.url = "Zabbixserver"         self.header = {"Content-Type": "application/j
用户1057912
2018/07/06
5750
python3--zabbixapi 的
python3 使用zabbix api的一些案例。。具体可以去zabbix官网找API借口,替换一下就可以。
py3study
2020/01/06
2900
Zabbix监控调用map.get并且下载图文件
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 17/8/28 上午9:09 # @Author : lee # @File : ZabbixMaps.py # @Software: PyCharm # 说明: 输入机器要查询的园区 知道序号后,第二次 园区+序号出图 阿里 m6 园区命令分别是(ali,m6,yq) import urllib.request import http.cookiejar import htt
98k
2018/04/12
1.1K0
用Python实现Zabbix-API
  做运维的朋友应该知道,公司IDC机房经常有上架、下架、报修和报废的服务器。如果服务器数量很多的时候很容易造成监控遗漏。        大的互联网公司把监控系统和CMDB(资产管理系统|配置管理数据库系统)集成在一起,当上架一台新机器的时候CMDB里面会记录相关的信息,Zabbix根据CMDB里面信息自动Link相关的模块,添加|删除监控。很多小的公司没有资产管理系统,但作为监控的负责人应该每天知道上架了哪些新的机器,确保能添加到Zabbix监控里面。       首先给大家说一下脚本思路: 1)通过Nmap工具扫描网段,扫描出已经使用的IP地址。 2)通过Nmap检测已经扫描IP的3389或者22端口是否开放,可以判断那些事windows机器,那些是Linux机器。 3)Linux下面通过ssh + hostname命令找出Linux主机名。 4)Windows下面通过nmblookup -A 命令找出Windows主机名。 5)用Python脚本读扫描结果文件,把主机名写到列表里面。 6)用Zabbix python API 调用已经监控的主机名,写到列表里面。 7)两个列表取交集,用for循环判断哪些主机名没有监控。 8)发邮件通知监控负责人。
py3study
2020/01/19
9850
用Python实现Zabbix-API
创建Zabbix screen的脚本
zabbix之所以能成为比较优秀的监控工具,个人觉得是因为两个特点:一个是数据的存放方式,方便做数据处理,容量规划,归档等,这个之前说过。另一个是其强大的api,利用其api可以方便的和其他的组件进行整合,比如cmdb可以通过zabbix api来实现监控的添加,更新和禁用等,zabbix的官方文档提供了比较详细的api列表。
星哥玩云
2022/06/30
3970
【Z投稿】Zabbix监控全国天气实况
Wanger,Zabbix运维工程师,熟悉Zabbix开源监控系统的架构,乐于分享Zabbix运维经验,个人公众号“运维开发故事”
Zabbix
2021/02/03
5030
利用ZABBIX进行服务器自动巡检并导出报表
乃取一葫芦置于地,以钱覆其口,徐以杓酌油沥之,自钱孔入,而钱不湿。因曰:”我亦无他,惟手熟尔。” 《卖油翁》 实现思路 主要是利用zabbix的api来对数据进行获取处理,实现思路如下: zabb
没有故事的陈师傅
2019/12/11
5.8K1
zabbix添加日志监控
通过读系统日志文件的监控,过滤掉日志信息中的异常关键词,如ERR,error,Failed,warning等信息,将这些带有异常关键词的异常日志信息过滤出来,然后输出到zabbix,通过zabbix告警机制实现触发告警;下面环境是filebeat作为采集端;输出到kafaka消息队列,最后由logsatsh拉取日志并过滤,输出到zabbix
章工运维
2023/05/19
7400
Zabbix3.0学习笔记
  在软件系统的高可靠性(也称为可用性,英文描述为HA,High Available)里有个衡量其可靠性的标准——X个9,这个X是代表数字3~5。X个9表示在软件系统1年时间的使用过程中,系统可以正常使用时间与总时间(1年)之比,我们通过下面的计算来感受下X个9在不同级别的可靠性差异。
yaohong
2019/08/21
8750
Zabbix3.0学习笔记
Zabbix API与PHP的配置
因为最近线上的Hadoop集群从mrv1升级到mrv2了,监控模板也跟着变动了。。
星哥玩云
2022/07/01
5410
Zabbix API与PHP的配置
python3 Zabbix监控-api的使用-python
1、 获得认证密钥 auth user and password data = json.dumps( { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "Admin", "password": "zabbix" }, "id": 0 }) 2、 获取zabbix所有的主机组 request json data = json.dumps( { "jsonrpc":"2.0", "method":"h
98k
2018/04/11
1.8K0
原创:用zabbix api批量添加web监控
代码如下,进攻大家参考,转载的话说明来源 前面5个变量自行补齐, #!/usr/local/python3.51/bin/python3 # Author:         Anxinhai@wondersgroup # Mail:           29338383@qq.com from pyzabbix import ZabbixAPI import sys from re import compile,IGNORECASE ZABBIX_SERVER = "" USER = "" PASSWORD
用户1057912
2018/07/06
1.6K0
相关推荐
运维python进行(三) 用pytho
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文