JavaでZabbixサーバーからヒストリをとってくる

JavaでZabbixサーバーにあるアイテムのヒストリをとって表示するコードを書いてみた。
今回は1番わかりやすいlocal time(時刻)のヒストリを取り出すことにした。

##用意するもの
https://github.com/hengyunabc/zabbix-api
デバッグ用のアイテム

##はじめにすること
APIに接続してバージョンを表示する。

```java:Main.java
		DefaultZabbixApi ZabbixAPI = new DefaultZabbixApi("http://[ホストのIP]/zabbix/api_jsonrpc.php");
		ZabbixAPI.init();//初期化
		System.out.println(ZabbixAPI.apiVersion());//バージョン表示
```
次にログインをする。

```java:Main.java
	    boolean login = ZabbixAPI.login("name", "password");
		System.err.println("login:" + login);
```
ログインに成功すれば login:true が表示される。ここからZabbix APIの機能が使える。


##ソースコード
ヒストリをとってくる前に、アイテムのIDをitem.getで取ってくる。

```java:Main.java
        //リクエスト
		JSONObject filter = new JSONObject();
		filter.put("key_", new String[]{"system.localtime"});//アイテムキー
		filter.put("name", new String[]{"myitem"});//アイテム名
		Request getRequest = RequestBuilder.newBuilder().method("item.get").paramEntry("filter", filter).build();
       //レスポンス
		JSONObject getResponse = ZabbixAPI.call(getRequest);
		String itemid = getResponse.getJSONArray("result").getJSONObject(0).getString("itemid");
		String name = getResponse.getJSONArray("result").getJSONObject(0).getString("name");
```

正しいデータが取得できているか確認するためにアイテムの名前もレスポンスの中に入れている。

次にヒストリを取得する。

```java:Main.java
		Date date = new Date();
		Timestamp now = new Timestamp(date.getTime()/1000L);//time_tillではUnixのTimestampで指定する
       //iteids:itemidの指定 history:データの型を指定 sortfield:ソートの基準を指定 sortoder:昇順か降順 time_till:指定した時刻までのデータを表示
		getRequest = RequestBuilder.newBuilder().method("history.get")
				.paramEntry("itemids", itemid).paramEntry("history", 3)
				.paramEntry("sortfield", "clock").paramEntry("sortorder", "DESC")
				.paramEntry("time_till", now).build();
		getResponse = ZabbixAPI.call(getRequest);
		for(int i = 0;i < getResponse.getJSONArray("result").size();i++) {
			String history = getResponse.getJSONArray("result").getJSONObject(i).getString("value");//Int型で取ってもいい
			System.out.println(new Timestamp(Integer.parseInt(history) * 1000L));//UnixのTimestampをjavaのTimestampに変換
		}
```

コード全体

```java:Main.java
public class Main {
	public void start() {
		DefaultZabbixApi ZabbixAPI = new DefaultZabbixApi("http://[ホストのIP]/zabbix/api_jsonrpc.php");
		ZabbixAPI.init();
		System.out.println(ZabbixAPI.apiVersion());
		
		boolean login = ZabbixAPI.login("name", "password");
		System.err.println("login:" + login);

		JSONObject filter = new JSONObject();
		filter.put("key_", new String[]{"system.localtime"});
		filter.put("name", new String[]{"myitem"});
		Request getRequest = RequestBuilder.newBuilder().method("item.get").paramEntry("filter", filter).build();
		JSONObject getResponse = ZabbixAPI.call(getRequest);
		String itemid = getResponse.getJSONArray("result").getJSONObject(0).getString("itemid");
		String name = getResponse.getJSONArray("result").getJSONObject(0).getString("name");
		
		Date date = new Date();
		Timestamp now = new Timestamp(date.getTime()/1000L);//time_tillではUnixのTimestampで指定する
		getRequest = RequestBuilder.newBuilder().method("history.get")
				.paramEntry("itemids", itemid).paramEntry("history", 3)
				.paramEntry("sortfield", "clock").paramEntry("sortorder", "DESC")
				.paramEntry("time_till", now).build();
		getResponse = ZabbixAPI.call(getRequest);
		for(int i = 0;i < getResponse.getJSONArray("result").size();i++) {
			String history = getResponse.getJSONArray("result").getJSONObject(i).getString("value");
			long time = getResponse.getJSONArray("result").getJSONObject(i).getLong("clock");
			System.out.println(new Timestamp(Integer.parseInt(history) * 1000L));//UnixのTimestampをjavaのTimestampに変換
		}
	}
	public static void main(String[] args) {
		Main m = new Main();
		m.start();
	}
}
```

はじめにGo言語で書いてAPIの使い方と仕組みを理解してからJavaで書いてみたが、JSONのプロトコルが決まっているのでコード自体もそれほど長くなくて済んだ。こちらもhttpclientでJSONを投げるところから書いてみようと思う。

https://www.zabbix.com/documentation/2.2/manual/api
こちらにAPIの機能一覧が載ってるので、他の機能が使いたいという方は参照して下さい。