基于Zabbix API文档二次开发与java接口封装
(继续贴一篇之前工作期间写的经验案例)
一、 案例背景
我负责开发过一个平台的监控报警模块,基于zabbix实现,需要对zabbix进行二次开发。
Zabbix官方提供了Rest API的文档,并推荐了第三方库,但这些库都是zabbix老版本(2.2,2.4/3.0)的库,多年未更新过,且变量/方法命名都不符合java的驼峰式规范。
所以开发中基于3.4的文档,自己封装了一套库。结合二次开发中对zabbix业务逻辑的理解与实践,梳理总结出该篇接口开发文档。
二、 基础知识
二次开发前,zabbix的业务术语和基本的业务逻辑需要了解清楚。
包括 模板、应用、监控项、触发器、事件、异常、动作等。
参考官方手册:
https://www.zabbix.com/documentation/3.4/zh/manual/definitions
重点说明下problem 与 event:
触发器被触发时,会生成一个 problem event 记录, 当问题恢复正常时,会生成一个recovery event记录,两个event的时间差,即为事件持续时间。所有的event都存在于同一张表。对应接口25)报警时间查询
problem存在于一张单独的表,每一条记录对应了两个事件,即problem event 和 recovery event。对应接口24)报警数据查询。
这张表zabbix后台会定期清理,problem事件恢复30分钟后,会被从表中删除。
所以如果要查当前的报警事件,去problem里查;如果要查事件的历史记录,到event里查,并且要对problem event 与 recovery event 进行匹配计算,一个开始对应一个结束,才算一条历史报警记录。
三、 接口封装与使用详解(代码见第五节的链接)
1) 登陆
zabbix登陆token的保留时间非常长,一次登陆后,基本可数周内不用重新登陆
/**
* @return 登陆zabbix后台true/false
*/
Boolean
login();
2)
在线状态
/**
* 判断zabbix是否已 在线(可用,并已登陆),没有的话 尝试登陆
* @return 在线/重连成功,返回1;自系统启动首次登陆成功返回2; 不在线,且重连失败,返回0
*/
Integer OnLine();
3) 请求zabbix后台,并返回结果
作为最基础的访问zabbix后台的接口,其他接口都是基于它实现的。
/**
* 封装了 RestTemplate 请求 与 zabbix 自动重连功能
* @param zabbixMethod 请求方法
* @param zabbixParams 请求参数
* @return result Object
*/
ZabbixResponse requestZabbixForObject(String zabbixMethod, Object zabbixParams);
4) 模板-xml导入
对于用户来说,让他们配置一个相当复杂的“模板-应用集-监控项-触发器”是很有难度的,这些应该是开发人员做的事,用户只管会用就可以。所以我们把这些配置梳理好后,以xml文件的形式发给用户,用户只需上传模板,即可完成整个复杂的创建过程。
/**
* 导入xml模板
* @param sourceXml
* @return
*/
Boolean importConfiguration(Document sourceXml);
5) 模板-Id 查询
/**
* 根据模板host名称(全英文的那个名字 在zabbix后台唯一标识模板) 查询 模板在zabbix后台的id
* @param tempLateHostName
* @return
*/
String getTemplateIdByHostName(String tempLateHostName);
6) 主机群组(host group)-Id查询
- 主机的逻辑组;它包含主机和模板。创建主机/模板时,必须指定其所属的主机群组,所以需要事先创建(导入模板xml时即会创建)。一个主机组里的主机和模板之间并没有任何直接的关联。通常在给不同用户组的主机分配权限时候使用主机组。
/**
* 根据group名称,查询group在zabbix后台的id
* @param groupName
* @return
*/
String getGroupIdByName(String groupName);
7) 主机-创建
/**
* 创建主机
* @param hostIps 主机ip列表
* @param groupId 所属分组id(zabbix)
* @return 按hostIps 的顺序 返回 对应的hostId
*/
List<String> createHost(List<String> hostIps,String groupId);
8) 主机-查询全部
返回的Map以ip地址为key,hostId为value, 方便对返回值快速的搜索查询
/**
* 查询全部主机
* @return key 主机host(Ip), value 主机hostId
*/
Map<String,String> getHostAll();
9) 模板-关联主机(批量)
关联成功后,会生成实际的监控项和触发器
/**
* 批量将机器hostIds(zabbix后台的hostId)(列表) 与 模板关联
* @param templateId
* @param hostIds
* @return
*/
Boolean templateMassAdd(String templateId,List<String> hostIds);
10) 模板-取消关联主机(批量)
/**
* 主机(批量) 取消 模板链接 并清理-(会删掉主机监控项)
* @param hostIds 需要取消模板关联的主机id列表
* @param templateId 需要取消关联的 模板id
* @return
*/
Boolean hostMassRemoveTemplate(List<String> hostIds,String templateId);
11) 模板-查询关联的所有主机
这个接口其实更为通用,可以在params 中指定查询条件,查询返回所有符合条件的主机,此处要查询模板关联的机器,只需在params中指定templateids 即可,参数格式 参考官方文档:
https://www.zabbix.com/documentation/3.4/manual/api/reference/host/get
示例
(先声明List<String> templateIds)
zabbixService.getHosts(new HashMap(){{
put("templateids",templateIds);
}});
/**
* 查询 模板关联的所有机器
* @param params
默认参数:
{
"output": ["hostid","host"]
}
* @return
*/
List<ZabbixHost> getHosts(Map params);
12) 模板-删除(批量)
/**
* 批量删除模板,会清理掉模板当前所关联主机的所有监控项(已与模板解除关联的主机,其监控项不会被清理)
* @param templateIds
* @return
*/
Boolean templateMassDelete(List<String> templateIds);
13) 主机-删除(批量)
/**
* 批量删除主机
* @param hostIds 主机列表
* @return
*/
Boolean hostDelete(List<String> hostIds);
14) 监控项-查询1
关联查询应用,触发器,主机
/**
* 查询主机关联的所有的监控项
* @param params {@link <a href = "https://www.zabbix.com/documentation/3.4/manual/api/reference/item/get">item.get</a>}
选填参数:
{
"hostids":["10205"],
"itemids":["27692","27707"],
"triggerids":["12345"]
}
默认参数:
{
"output":["itemid","name","key_","delay","history","status","flags","units","lastvalue","value_type"],
"selectApplications": ["applicationid","name","hostid","templateids"],
"selectTriggers":["triggerid","templateid","description","expression","comments","status","priority","value"],
"selectHosts":["hostid","host"]
}
* @return Item列表 或 空Array
*/
List<ZabbixItem> getItems(Map params);
15) 监控项-查询2
关联查询应用,主机;
/**
* 查询监控项数据,和监控项关联的host,无用的字段不查
* @param params
默认参数
{
"output":["itemid","name","lastclock","lastvalue","lastvalue","prevvalue","status","units"],
"selectApplications": ["applicationid","name","hostid","templateids"],
"selectHosts":["hostid","host"]
}
* @return Item列表key-zabbixItemId 或 空Map
*/
Map<String,ZabbixItem> getItemData(Map params);
16) 应用-查询-根据id
每个application都有个parentId和hostid, 根据parentId 向上回溯查询application,当其parentId为null时,对应的hostId才指向Template.
/**
* 根据application Id 查询 application 详情
* @param Id
* @return application 或 null
*/
ZabbixApplication getApplicationById(String Id);
17) 应用-查询-根据id(批量)
/**
* 批量查询,根据application Ids 查询 applications 详情
* @param ids
* @return key 为applicationId
*/
Map<String,ZabbixApplication> getApplicationsByIds(List<String> ids);
18) 应用-查询-根据模板id
/**
* 批量查询,根据application Ids 查询 applications 详情
* @param ids
* @return key 为applicationId
*/
Map<String,ZabbixApplication> getApplicationsByIds(List<String> ids);
19) 触发器-查询
/**
* 获取所有的触发器
* doc:
* @see <a href = "https://www.zabbix.com/documentation/3.4/manual/api/reference/trigger/get">trigger.get</a>
* @param params
* 默认参数:
{
"output":["triggerid","description","priority","value","expression","status","comments"],
"selectItems":["itemid","lastvalue","units"],
"selectHosts":["host","hostid"]
}
* @return map key = {@link ZabbixTrigger#triggerId} , value = {@link ZabbixTrigger}; 或空Map
*/
Map<String,ZabbixTrigger> getTriggers(Map params);
20) 监控项-修改
/**
* 根据itemId 修改 item
* @param items 字段itemId 必填,只支持修改delay,history,status
* @return
*/
Boolean itemsUpdate(List<ZabbixItem> items);
21) 触发器-修改
/**
* 根据triggerId 修改 trigger
* @param triggers 字段triggerId 必填,只支持修改 status,comments,expression,
* 注意:通过模板关联生成的trigger 只能修改status,comments,其他是改不了的,会失败
* @return true/false
*/
Boolean triggersUpdate(List<ZabbixTrigger> triggers);
22) 应用-监控项-组织结构查询-根据主机id
/**
* 根据hostIds 查询关联的application-Item 组织(组织结点 主要包含Id 和 name)
* @param hostIds
* @return
*/
List<ZabbixApplication> getApplicationAndItemOrgByHostId(List<String> hostIds);
23) 最新监控数据-查询
若要查询模板关联的监控项,先查模板关联的机器,然后调用该接口进行查询。
/**
* 查询 监控数据,以主机ID 和 applicationName 作为过滤条件
* 会过滤掉 已被禁用的监控项数据
* @param hostIds
* @param appNames 为空 时,查询全部数据
* @return application-item
*/
List<ZabbixApplication> getLatestItemData(List<String> hostIds,List<String> appNames);
24) 报警数据-查询
/**
* 查询报警数据 --来自触发器
* @param params 查询参数
* 默认参数:
{
"output": "extend",
"sortfield": ["eventid"],
"sortorder": "DESC",
"recent":"true",
"selectAcknowledges": "extend"
}
* @see <a href="https://www.zabbix.com/documentation/3.4/manual/api/reference/problem/get">problem.get</a>
* ctrl + 单击 查看url链接
* @return {@link ZabbixProblem}
*/
List<ZabbixProblem> getProblems(Map params);
25) 报警事件查询
/**
* 查询报警事件 --来自触发器
* @param params
* 默认参数:
{ "output": "extend",
"sortfield": ["clock", "eventid"],
"sortorder": "DESC",
"select_acknowledges":"extend",
"selectRelatedObject":["triggerid","description","priority","value"],
"selectHosts":["hostid","host"]
}
* @see <a href="https://www.zabbix.com/documentation/3.4/manual/api/reference/event/get">event.get</a>
* @return {@link ZabbixProblem}
*/
List<ZabbixProblem> getEvents(Map params);
26) 关闭触发器
忽略并关闭报警事件
/**
* 关闭触发器
* @param events 需关闭的event 列表
* 默认参数:
{
"message": "忽略",
"action": 1
}
* @return
*/
Boolean
acknowledgeEvents(List<String>
events);
27) 历史数据-查询
查询指定监控项的历史数据
参数history 表示返回值类型,摘录一段官方文档解释:
History object types to return.
Possible values:
0 - numeric float;
1 - character;
2 - log;
3 - numeric unsigned;
4 - text.
Default: 3.
就是说实际的数据类型 和参数 history的类型 必须一致,否则会导致查不到数据。
所以查之前,需要先查询确定监控项的数据类型valueType.
/**
* 查监控项的历史数据
* @param params itemids string/array 监控项id 必填 "history":3,
必填-不填或者类型不对将查不到数据
* @see <a
href="https://www.zabbix.com/documentation/3.4/manual/api/reference/history/get">history.get</a>
必填参数:
{
"itemids": ["27702"]
}
默认参数:
{
"sortfield":"clock",
"sortorder":"DESC"
}
* @return
*/
List<ZabbixHistory>
getHistory(Map
params);
28) 图表-查询配置
如果要查图表数据,需要先查图表配置,然后对图表配置中的监控项id, 通过getHistory接口查询监控项的历史数据。
/**
* 查询图表配置信息
* @param params
默认参数:
params.put("output",new ArrayList(){{
add("graphid");
add("name");
add("graphtype");
}}); params.put("selectGraphItems",new ArrayList(){{
add("gitemid");
add("itemid");
add("color");
}}); params.put("selectItems",new ArrayList(){{
add("itemid");
add("name");
}});
* @return
*/
List<GraphConfig> getGraphConfig(Map params);
29) 图表-创建
/**
* 创建监控图表
* @param graphConfig
* @return
*/
GraphConfig createGraph(GraphConfig graphConfig) throws Exception;
30) 图表-修改
/**
* 更新监控图表
* @param graphConfig
* @return
*/
GraphConfig updateGraph(GraphConfig graphConfig) throws Exception;
31) 图表-删除
/**
* 删除图表
* @param params 图表id
* @return
* @throws Exception
*/
Boolean deleteGraph(List params) throws Exception;
四、 监控数据单位转换
从zabbix 后台 查询到的监控数据,都是最小单位,如时间的单位是 秒s,存储的单位是B,流量的单位是B/s.
所以需要自适应进行转换,转成KB/s 或者 MB/s等。
1)转成最合适,无溢出的单位
/**
* @param value 原始数据
* @param units 原始单位
* @return 转成最合适 无溢出的单位
*/
public static UnitsFormatResult transformValueByUnits(String value,String units)
2) 转成指定单位的数据
绘制图表时,每个数据需要单位一致,才有可比性,才能进行正确的绘制,因此会用到此方法。
/**
*
* @param value 原始数据
* @param units 原始单元
* @param targetUnits 目标单位
* @return
*/
public static UnitsFormatResult transformValueToTargetUnits(String value,String units,String targetUnits)
五、 请下载附件源码
https://files.cnblogs.com/files/wangzhen-fly/zabbix3.4api%E5%B0%81%E8%A3%85-src.zip
基于Zabbix API文档二次开发与java接口封装的更多相关文章
- 以api文档为中心--前后端分开发离新思维
api文档编写好像很简单,其实不是.一个良好的api文档,需要就有以下内容:接口详细描述,接口参数详细描述,接口返回结果详细描述,容易理解的范例.这些内容其实是不少的,编写过程中还非常单调乏味.再加上 ...
- Core Web API上使用Swagger提供API文档
在ASP.NET Core Web API上使用Swagger提供API文档 我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的AP ...
- Spring Boot 集成Swagger2生成RESTful API文档
Swagger2可以在写代码的同时生成对应的RESTful API文档,方便开发人员参考,另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API. 使用Spring Boot可 ...
- Core Java 学习笔记——1.术语/环境配置/Eclipse汉化字体快捷键/API文档
今天起开始学习Java,学习用书为Core Java.之前有过C的经验.准备把自己学习这一本书时的各种想法,不易理解的,重要的都记录下来.希望以后回顾起来能温故知新吧.也希望自己能够坚持把自己学习这本 ...
- eclipse 中使用中文JAVA api文档
http://hi.baidu.com/danghj/item/7625a1be20946e43ba0e1202在eclipse中使用中文JAVA api文档Sun 官方的中文版 Java API 文 ...
- 【HighCharts系列教程】二、Highcharts结构及API文档
一.你必须知道的 1.首先,HighCharts是基于Jquery框架开发的,所以需要在页面引入Jquery,具体代码是: <script type="text/javascript& ...
- springboot~mockMvc和asciidoctor生成基于TDD的API文档
API文档是前端与后端快速开发,减少沟通成本的必要条件,有一份完善的文档是很必要的,由通过测试来生成文档的好处就是:测试数据有了,测试返回结果有了,而且可以对这些字段进行说明,很清晰,在springb ...
- 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (上篇)
前言 为什么在开发中,接口文档越来越成为前后端开发人员沟通的枢纽呢? 随着业务的发张,项目越来越多,而对于支撑整个项目架构体系而言,我们对系统业务的水平拆分,垂直分层,让业务系统更加清晰,从而产生一系 ...
- 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)
前言 回顾上一篇文章<使用Swagger做Api文档 >,文中介绍了在.net core 3.1中,利用Swagger轻量级框架,如何引入程序包,配置服务,注册中间件,一步一步的实现,最终 ...
随机推荐
- BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组
BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的 ...
- 「HAOI2015」「LuoguP3178」树上操作(树链剖分
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- 【HDU 1754】 I Hate It
[题目链接] 点击打开链接 [算法] 树状数组的最值查询 详见这篇文章 : https://blog.csdn.net/u010598215/article/details/48206959 [代码] ...
- Educational Codeforces Round 24 CF 818 A-G 补题
6月快要结束了 期末也过去大半了 马上就是大三狗了 取消了小学期后20周的学期真心长, 看着各种北方的学校都放假嗨皮了,我们这个在北回归线的学校,还在忍受酷暑. 过年的时候下定决心要拿块ACM的牌子, ...
- 微信小程序在线支付功能使用总结
最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...
- rsync(二):inotify+rsync详细说明和sersync
以下是rsync系列篇: inotify+rsync 如果要实现定时同步数据,可以在客户端将rsync加入定时任务,但是定时任务的同步时间粒度并不能达到实时同步的要求.在Linux kernel 2. ...
- .NETFramework:Regex
ylbtech-.NETFramework:Regex 1.返回顶部 1. #region 程序集 System, Version=4.0.0.0, Culture=neutral, PublicKe ...
- 什么是位、字节、字、KB、MB?
1. 位(bit)是计算机里最小的数据单位,每一位的状态只能是0或者1 2. 字节(Byte) 1Byte = 8 bit 它是存储空间的基本计量单位,1byte可以存储一个英文字 ...
- ORACLE知识点整理之一
1. 安装客户端 去官方网站下载 此处略 2. 客户端登陆身份 Oracle有三种身份登录方式:Normal.sysdba.sysoper. normal身份:普通用户身份,默认选项(默认可以不写), ...
- hdoj5667 BestCoder Round #80 【费马小定理(膜拜)+矩阵快速幂+快速幂】
#include<cstdio> #include<string> #include<iostream> #include<vector> #inclu ...