1. 程式人生 > >基於Zabbix平臺的java開發總結(API簡介)

基於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);
		}
	}
}