基於Zabbix平臺的java開發總結(API簡介)
前提:本人蔘與到一個關於呼叫zabbix API實現監控主機資源的專案。故將zabbixAPI的使用簡單總結一下。有什麼不對的地方還
請指正。
一、zabbix相關網站
Zabbix是企業級軟體,專為實時監控從數以萬計的伺服器,虛擬機器和網路裝置收集的數百萬個指標而設計。
二、專案中SDK的引入
<dependency> <groupId>io.github.hengyunabc</groupId> <artifactId>zabbix-api</artifactId> <version>0.0.2</version> </dependency>
三、 API介面說明(此次只是說明本專案中用到的介面,介面使用大同小異)
由於使用zabbixAPI必須進行使用者登入驗證,所以在呼叫介面之前,必須先部署一個zabbix後臺,拿到一個使用者資訊(包括使用者名稱和密碼)。
DefaultZabbixApi zabbixApi = new DefaultZabbixApi("http://zabbix伺服器的主機IP/zabbix/api_jsonrpc.php"); // init方法中建立CloseableHttpClient客戶端 zabbixApi.init(); //進行許可權驗證 boolean loginResult = zabbixApi.login("Admin", "zabbix"); if (!loginResult) { System.out.println("login fail"); }
程式碼說明:
一般 API 呼叫規則都是:字首 url+引數;
由於 zabbixapi 已經封裝好了傳遞引數的方法。所以我們只需要呼叫 login 方法即可,如下所示
zabbixApi.login("username", "password");
login 方法原始碼解析:
public boolean login(String user, String password) { this.auth = null; Request request = RequestBuilder.newBuilder(). paramEntry("user", user). paramEntry("password", password). method("user.login").build(); JSONObject response = call(request); String auth = response.getString("result"); if(auth != null && !auth.isEmpty()) { this.auth = auth; return true; } else { return false; } }
username和password 傳入後,會呼叫 user.login 方法,來獲取 一個 auth .存放到本地 屬性 auth。
private CloseableHttpClient httpClient;
private URI uri;
private volatile String auth;
使用者驗證痛過之後,便可以用上述建立的 zabbixApi 進行方法的呼叫。
【*-*1】ZabbixAPI支援的引數型別:
【*-*2】通用引數簡要說明
output引數:當傳遞的是 extend 時,返回所有欄位,當我們只需要返回特定欄位的時候,output的值只需傳遞一個 屬性名稱陣列即可。下面示例中會有程式碼例項。
filter 引數: 以下有示例程式碼。
示例1、獲取所有主機組(hostgroup)
Request request = RequestBuilder.newBuilder().method("hostgroup.get").
paramEntry("output", "extend").build();
method("hostgroup.get")中是 呼叫的方法名,paramEntry("output", "extend")傳遞的是藉口需要的引數,可同時設定多個paramEntry("paramName", "paramValue")。接下來的示例會有具體的程式碼。
示例2、獲取所有主機(host)
Request request2 = RequestBuilder.newBuilder().method("host.get").
paramEntry("output", "extend").build();
示例3、獲取報警資訊(alert)
Request request3 = RequestBuilder.newBuilder().method("alert.get").
paramEntry("output","extend").
paramEntry("time_from",DateUtil.getTimeMs(6)/1000).//從某個時間點開始
paramEntry("time_till",DateUtil.getTimeMs(5)/1000).//截止某個時間點
paramEntry("hostids", new String[]{"10084","10109"}). build();
api截圖說明,
從截圖中可以看出 hostids 引數可傳遞的值的型別 為 String,例如 “10084”;
也可以是 array ,所以示例中引數值傳遞的是一個string型別的陣列 new String[]{"10084","10109"}。以下示例中同理
示例4、獲取觸發器資訊(trigger)
//獲取所有觸發器資訊
Request request123 = RequestBuilder.newBuilder().method("trigger.get").
paramEntry("output","extend").build();
//獲取 監控項id為 24028、24015 的觸發器資訊
Request request456 = RequestBuilder.newBuilder().method("trigger.get").
paramEntry("output","extend").
paramEntry("itemids", new String[]{"24028","24015"}). build();
示例5、獲取監控項資訊(item)
通過 Key 查詢 Items
從key中具有“system”一詞的ID為“10112”的主機檢索所有監控項
JSONObject json = new JSONObject();
json.put("key_", new String[]{"system"});
Request request55 = RequestBuilder.newBuilder().method("item.get").
paramEntry("output", new String[]{"hostid","key_","itemid","lastvalue","prevvalue"})
.paramEntry("hostids", new String[]{"10112"})
.paramEntry("filter",json).build();
===========================================================================
完整示例
public class za {
public static void main(String[] args) {
DefaultZabbixApi zabbixApi = new DefaultZabbixApi("http://zabbix伺服器IP/zabbix/api_jsonrpc.php");
zabbixApi.init();
boolean loginResult = zabbixApi.login("登入使用者名稱", "密碼");
if (!loginResult) {
System.out.println("login fail");
}
//查詢所有主機
Request request = RequestBuilder.newBuilder().method("hostgroup.get").
paramEntry("output", "extend").build();
//執行請求
JSONObject resJson = zabbixApi.call(request);
//處理結果
String error = String.valueOf(resJson.get("error"));
if (!StringUtils.isEmpty(error) && error != "null") {
System.out.println("呼叫zabbix接口出錯");
}else{
JSONArray jsonArray = resJson.getJSONArray("result");
String resultStr = jsonArray.toJSONString();
System.out.println("結果:::::"+resultStr);
}
}
}