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

一、           案例背景

我负责开发过一个平台的监控报警模块,基于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. darwin Stream Server源码分析

    摘要 ​所谓的流式媒体简单的讲就是指人们通过网络实时的收看多媒体信息:如音频流.视频流等.与流式媒体对应的传统工作方式是下载+播放模式,即用户首先下载多媒体文件,然后再在本地播放,这种方法的一个主要缺 ...

  2. 【旧文章搬运】Windows句柄表分配算法分析(三)

    原文发表于百度空间,2009-03-30========================================================================== 三.当需要 ...

  3. auto_ptr智能指针

    C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理. 使用std::auto_ptr,要#include <memory>.

  4. 3、HTML的body内标签1

    一.特殊符号的表示   #代指空格 < #代指,< > #代指,> ...... #这玩意有很多,记也记不完,用的时候查一下即可: 二.p和br标签 <p>< ...

  5. 我的Android笔记(十)—— ProgressDialog的简单应用,等待提示 (转载)

    转自:http://blog.csdn.net/barryhappy/article/details/7376231 在应用中经常会用到一些费时的操作,需要用户进行等待,比如加载网页内容…… 这时候就 ...

  6. 注册CSDN账号的尴尬

    因为新浪博客这里代码显示不大好用,打算把关于编程和应用开发的东西改到那里去写,可是点击注册....   竟然要输入手机号,无法跳过.... 要知道,楼主现在可是在国外,压根没有可用于注册的手机号啊.. ...

  7. 793. Preimage Size of Factorial Zeroes Function

    Let f(x) be the number of zeroes at the end of x!. (Recall that x! = 1 * 2 * 3 * ... * x, and by con ...

  8. Unity局部高效实时阴影的思考和实现

    http://game.ceeger.com/forum/read.php?tid=23305&fid=2 无意间看到一篇文章,说是Unity5 demo中为了实现角色的良好阴影,单独给角色设 ...

  9. Java 在线反编译

    使用jd-gui反编译java提示 // INTERNAL ERROR // 的类,用在线反编译直接反编译.class http://www.showmycode.com/

  10. 鸟哥私房菜基础篇:Linux 档案与目录管理习题

    猫宁!!! 参考链接:http://linux.vbird.org/linux_basic/0220filemanager.php 鸟哥是为中国信息技术发展做出巨大贡献的人. 1-什么是绝对路径与相对 ...