使用了zabbix进行监控后,往往因为项目的需求,需要对zabbix的数据,进行二次共享和开发。如何从zabbix获取数据是本次实践要解决的问题。
zabbix的数据共享有两个途径
1) 通过数据库查询,获取数据。 前提是对zabbbix数据库模型要有深入了解,并且在大量监控的时候,不能因为查询影响zabbix生身的运行
2) 通过zabbix的api,进行数据的获取,这种方式相对比较可靠
一、目标
通过java api实现zabbix的数据获取。
二、环境
在本机的虚拟机144上,安装了zabbix的服务端,分别在144,155上部署了监控agent。 都是centos系统
在本机使用eclipse进行数据的获取。 jdk 为 1.7
三、api的获取
http://zabbix.org/wiki/Docs/api/libraries 这网站列出了api的情况,如下图
点开这个后,可以看到java的api有三种
第一和第三都是连接zabbix server的api,第一个是最简单的api,需要自己构造json格式的参数。 第二个sender 是开发想server 输送数据的api。第三个才是这次实践关心的api,这个api里面,进一步做了封装,也提供了一些测试代码。本次实践就是在这个基础上进行实践的。
依赖的库如下
下面贴一下代码,代码里面做了比较详细的描述。
package com.zabbix4j.apitest;
import com.zabbix4j.ZabbixApi;
import com.zabbix4j.ZabbixApiException;
import com.zabbix4j.ZabbixApiParamter;
import com.zabbix4j.host.*;
import com.zabbix4j.hostinteface.HostInterfaceObject;
import com.zabbix4j.item.ItemObject;
import com.zabbix4j.usermacro.Macro;
import java.util.ArrayList;
import java.util.List;
public class Zabbix4jSampleGetHost extends ZabbixApiTestDummyMethodBase {
public Zabbix4jSampleGetHost(ZabbixApi zabbixApi) {
super(zabbixApi);
}
// 这里配置zabbix的url,帐号和密码
public static final String ZBX_URL = "http://192.168.136.144/zabbix/api_jsonrpc.php";
public static final String USERNAME = "admin";
public static final String PASSWORD = "zabbix";
// 调用api的host get方法的封装
public HostGetResponse getHost() throws ZabbixApiException {
Integer targetHostId = 10105;
HostGetRequest request = new HostGetRequest();
HostGetRequest.Params params = request.getParams();
ArrayList<Integer> hostIds = new ArrayList<Integer>();
hostIds.add(targetHostId);
// params.setHostids(hostIds);
// 这里可以设指定的id值,也可以不设值。设值的话,取指定的内容,不设的话,获取全部的host
params.setHostids(null);
params.setSelectDiscoveryRule(ZabbixApiParamter.QUERY.extend.name());
params.setSelectGroups(ZabbixApiParamter.QUERY.extend.name());
params.setSelectItems(ZabbixApiParamter.QUERY.extend.name());
params.setSelectApplications(ZabbixApiParamter.QUERY.extend.name());
params.setSelectDiscoveries(ZabbixApiParamter.QUERY.extend.name());
params.setSelectGraphs(ZabbixApiParamter.QUERY.extend.name());
params.setSelectHostDiscovery(ZabbixApiParamter.QUERY.extend.name());
params.setSelectHttpTests(ZabbixApiParamter.QUERY.extend.name());
params.setSelectInterfaces(ZabbixApiParamter.QUERY.extend.name());
params.setSelectInventory(ZabbixApiParamter.QUERY.extend.name());
params.setSelectMacros(ZabbixApiParamter.QUERY.extend.name());
params.setSelectParentTemplates(ZabbixApiParamter.QUERY.extend.name());
params.setSelectScreens(ZabbixApiParamter.QUERY.extend.name());
params.setSelectTriggers(ZabbixApiParamter.QUERY.extend.name());
System.out.println("parames setting complete...");
HostGetResponse response = zabbixApi.host().get(request);
return response;
}
public static void main(String[] args) {
try {
// login to Zabbix
System.out.println("beging...");
ZabbixApi zabbixApi = new ZabbixApi(ZBX_URL);
zabbixApi.login(USERNAME, PASSWORD);
System.out.println("create new get host instance...");
Zabbix4jSampleGetHost myGetHost = new Zabbix4jSampleGetHost(
zabbixApi);
System.out.println("Get host beging...");
HostGetResponse response = myGetHost.getHost();
System.out.println("Get host end...let's print result");
// 对response进行处理
for (int i = 0; i < response.getResult().size(); i++) {
//response 返回的信息非常大,可以赋值给HostObject,也可以其他对象
HostObject myHostObject = response.getResult().get(i);
//response 返回的信息非常大,可以赋值给ItemObject,也可以其他对象
List<ItemObject> myItemObjectList = response.getResult().get(i)
.getItems();
//打印host信息
if (null == myHostObject)
System.out.println("Get host null, program will exit");
else {
System.out.println("++++++Print Result " + i
+ " HostObject+++++++++++");
System.out.println(myHostObject.getHost());
System.out.println(myHostObject.getName());
System.out.println(myHostObject.getAvailable());
System.out.println(myHostObject.getHostid());
System.out.println(myHostObject.getStatus());
}
//打印这个host下的item信息
for (int j = 0; j < myItemObjectList.size(); j++) {
if (j == 0)
System.out.println("++++++Print ItemObject List "
+ "+++++++++++");
ItemObject tmpItemObject = myItemObjectList.get(j);
System.out.println("Itemid:" + tmpItemObject.getItemid());
System.out.println("Templateid:"
+ tmpItemObject.getTemplateid());
System.out.println("Hostid:" + tmpItemObject.getHostid());
System.out.println("Name:" + tmpItemObject.getName());
System.out.println("Key:" + tmpItemObject.getKey_());
System.out.println("Lastvalue:"
+ tmpItemObject.getLastvalue());
System.out.println("Lastclock:"
+ tmpItemObject.getLastclock());
System.out
.println("------------------------------------------");
}
System.out
.println("*****************%%%%%%%%%%%%%%************");
}
} catch (ZabbixApiException e) {
e.printStackTrace();
}
}
}
最后贴一下执行的结果