zabbix api例子 java_java调用zabbix api获取数据

zabbix 是很强大的监控运维工具,但是无奈界面实在是又丑又不人性化,所以上面的大神决定要包装一下zabbix api获取数据自己画界面(其实还一种方法就是直接访问zabbix 的mysql数据库,但是这种逻辑要自己写了),但是就是苦了我们下面搬砖的码农了。

zabbix api利用json-rpc协议发送一些json数据来获取数据,格式如下

Request

{

"jsonrpc":"2.0"

"method":"user.login",  //zabbix api里面提供的方法

"params":{              //方法里面传递的参数

"user":"admin",

"password":"zabbix"

},

"id":1

}

Response

{

"jsonrpc":"2.0",

"result":"0424bd59b807674191e7d77572075f33", //这就是我们需要的滑板鞋了

"id":1

}

看到这里,我们要用java(其他语言也一样)调用zabbix api就很简单了,只需要构建请求发送json字符创就行了,直接贴代码

public String HttpRequest(String params) {

try {

//提供zabbix api的url

String strURL = "http://172.19.0.127/zabbix/frontends/php/api_jsonrpc.php";

URL url = new URL(strURL);

HttpURLConnection connection = (HttpURLConnection) url

.openConnection();

connection.setDoOutput(true);

connection.setDoInput(true);

connection.setUseCaches(false);

connection.setInstanceFollowRedirects(true);

connection.setRequestMethod("POST");

connection.setRequestProperty("Accept", "application/json");

connection.setRequestProperty("Content-Type", "application/json");

connection.connect();

OutputStreamWriter out = new OutputStreamWriter(

connection.getOutputStream(), "UTF-8");

out.append(params);

out.flush();

out.close();

int length = (int) connection.getContentLength();

InputStream is = connection.getInputStream();

if (length != -1) {

byte[] data = new byte[length];

byte[] temp = new byte[512];

int readLen = 0;

int destPos = 0;

while ((readLen = is.read(temp)) > 0) {

System.arraycopy(temp, 0, data, destPos, readLen);

destPos += readLen;

}

String result = new String(data, "UTF-8");

is.close();

return result;

}

} catch (IOException e) {

e.printStackTrace();

}

return "{\"error\":\"failed to connect server\"}";

}

//调用zabbix api必须要经过认证

public String Auth() {

if (auth == null) {

String user = "admin";

String password = "zabbix";

String params = "{\"jsonrpc\":\"2.0\",\"method\":\"user.login\",\"params\":{\"user\":"

+ "\""

+ user

+ "\""

+ ",\"password\":"

+ "\""

+ password

+ "\"" + "},\"auth\":null,\"id\":0}";

auth = new JSONObject(HttpRequest(params)).getString("result");

}

return auth;

}

//构建要发送的json字符创,省的每次都写这么一大堆

public String buildParams(String method, String params) {

String result = "{\"jsonrpc\":\"2.0\",\"method\":\"" + method

+ "\",\"params\":{" + params +"},\"auth\":\"" + Auth()

+ "\",\"id\":0}";

return result;

}

到这,调用zabbix api基本就结束了,剩下就是拼凑参数了,给个例子

//获取item的值

public String getItemValue(String itemId, int limit) {

String params = base.buildParams("history.get",

"\"sortfield\":\"clock\",\"sortorder\":\"DESC\",\"itemids\":\""

+ itemId + "\",\"limit\":" + limit);

return HttpRequest(params);

}

zabbix api详细文档:https://www.zabbix.com/documentation/2.4/manual/api/reference

大家注意自己使用的zabbix版本,不同版本参数很可能不一样(坑爹!)

—————————————————就是想使用分割线试试—————————————————

注意:

如果要创建zabbix 中的caculate 项目,请现在zabbix 中建立caculate要依赖的项目,不然汇报找不到XXX项目的,真是太不智能了:)逃

如果创建的是caculate项目,请务必加上很多转义符号   \    ,如

String key="\"last(\\\"vm.memory.size[used]\\\",0)/last(\\\"vm.memory.size[total]\\\",0)\"";

因为zabbix api接收的是字符串所以。。。。。。。我们发送过去的时候除了头尾的双引号,其他的都是要你转义一下的

还有就是,zabbix好像不支持max(last(xx))这种双重计算(一点都不强大!!)


版权声明:本文为weixin_39520979原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。