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))这种双重计算(一点都不强大!!)

你可能感兴趣的:(api,zabbix,zabbix)