(继续贴一篇之前工作期间写的经验案例)

一、           案例背景

我负责开发过一个平台的监控报警模块,基于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接口封装的更多相关文章

  1. 以api文档为中心--前后端分开发离新思维

    api文档编写好像很简单,其实不是.一个良好的api文档,需要就有以下内容:接口详细描述,接口参数详细描述,接口返回结果详细描述,容易理解的范例.这些内容其实是不少的,编写过程中还非常单调乏味.再加上 ...

  2. Core Web API上使用Swagger提供API文档

    在ASP.NET Core Web API上使用Swagger提供API文档   我在开发自己的博客系统(http://daxnet.me)时,给自己的RESTful服务增加了基于Swagger的AP ...

  3. Spring Boot 集成Swagger2生成RESTful API文档

    Swagger2可以在写代码的同时生成对应的RESTful API文档,方便开发人员参考,另外Swagger2也提供了强大的页面测试功能来调试每个RESTful API. 使用Spring Boot可 ...

  4. Core Java 学习笔记——1.术语/环境配置/Eclipse汉化字体快捷键/API文档

    今天起开始学习Java,学习用书为Core Java.之前有过C的经验.准备把自己学习这一本书时的各种想法,不易理解的,重要的都记录下来.希望以后回顾起来能温故知新吧.也希望自己能够坚持把自己学习这本 ...

  5. eclipse 中使用中文JAVA api文档

    http://hi.baidu.com/danghj/item/7625a1be20946e43ba0e1202在eclipse中使用中文JAVA api文档Sun 官方的中文版 Java API 文 ...

  6. 【HighCharts系列教程】二、Highcharts结构及API文档

    一.你必须知道的 1.首先,HighCharts是基于Jquery框架开发的,所以需要在页面引入Jquery,具体代码是: <script type="text/javascript& ...

  7. springboot~mockMvc和asciidoctor生成基于TDD的API文档

    API文档是前端与后端快速开发,减少沟通成本的必要条件,有一份完善的文档是很必要的,由通过测试来生成文档的好处就是:测试数据有了,测试返回结果有了,而且可以对这些字段进行说明,很清晰,在springb ...

  8. 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (上篇)

    前言 为什么在开发中,接口文档越来越成为前后端开发人员沟通的枢纽呢? 随着业务的发张,项目越来越多,而对于支撑整个项目架构体系而言,我们对系统业务的水平拆分,垂直分层,让业务系统更加清晰,从而产生一系 ...

  9. 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)

    前言 回顾上一篇文章<使用Swagger做Api文档 >,文中介绍了在.net core 3.1中,利用Swagger轻量级框架,如何引入程序包,配置服务,注册中间件,一步一步的实现,最终 ...

随机推荐

  1. BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组

    BZOJ_2251_[2010Beijing Wc]外星联络_后缀数组 Description 小 P 在看过电影<超时空接触>(Contact)之后被深深的打动,决心致力于寻 找外星人的 ...

  2. 「HAOI2015」「LuoguP3178」树上操作(树链剖分

    题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...

  3. 【HDU 1754】 I Hate It

    [题目链接] 点击打开链接 [算法] 树状数组的最值查询 详见这篇文章 : https://blog.csdn.net/u010598215/article/details/48206959 [代码] ...

  4. Educational Codeforces Round 24 CF 818 A-G 补题

    6月快要结束了 期末也过去大半了 马上就是大三狗了 取消了小学期后20周的学期真心长, 看着各种北方的学校都放假嗨皮了,我们这个在北回归线的学校,还在忍受酷暑. 过年的时候下定决心要拿块ACM的牌子, ...

  5. 微信小程序在线支付功能使用总结

    最近需要在微信小程序中用到在线支付功能,于是看了一下官方的文档,发现要在小程序里实现微信支付还是很方便的,如果你以前开发过服务号下的微信支付,那么你会发现其实小程序里的微信支付和服务号里的开发过程如出 ...

  6. rsync(二):inotify+rsync详细说明和sersync

    以下是rsync系列篇: inotify+rsync 如果要实现定时同步数据,可以在客户端将rsync加入定时任务,但是定时任务的同步时间粒度并不能达到实时同步的要求.在Linux kernel 2. ...

  7. .NETFramework:Regex

    ylbtech-.NETFramework:Regex 1.返回顶部 1. #region 程序集 System, Version=4.0.0.0, Culture=neutral, PublicKe ...

  8. 什么是位、字节、字、KB、MB?

    1. 位(bit)是计算机里最小的数据单位,每一位的状态只能是0或者1 2. 字节(Byte)      1Byte = 8 bit      它是存储空间的基本计量单位,1byte可以存储一个英文字 ...

  9. ORACLE知识点整理之一

    1. 安装客户端 去官方网站下载 此处略 2. 客户端登陆身份 Oracle有三种身份登录方式:Normal.sysdba.sysoper. normal身份:普通用户身份,默认选项(默认可以不写), ...

  10. hdoj5667 BestCoder Round #80 【费马小定理(膜拜)+矩阵快速幂+快速幂】

    #include<cstdio> #include<string> #include<iostream> #include<vector> #inclu ...