基於Zabbix API文檔二次開發與java接口封裝


(繼續貼一篇之前工作期間寫的經驗案例)

 

一、           案例背景

我負責開發過一個平台的監控報警模塊,基於zabbix實現,需要對zabbix進行二次開發。

Zabbix官方提供了Rest API的文檔,並推薦了第三方庫,但這些庫都是zabbix老版本(2.2,2.4/3.0)的庫,多年未更新過,且變量/方法命名都不符合java的駝峰式規范。

所以開發中基於3.4的文檔,自己封裝了一套庫。結合二次開發中對zabbix業務邏輯的理解與實踐,梳理總結出該篇接口開發文檔。

二、           基礎知識

二次開發前,zabbix的業務術語和基本的業務邏輯需要了解清楚。

包括 模板、應用、監控項、觸發器、事件、異常、動作等。

參考官方手冊:

https://www.zabbix.com/documentation/3.4/zh/manual/definitions

重點說明下problem event:

觸發器被觸發時,會生成一個 problem event 記錄, 當問題恢復正常時,會生成一個recovery event記錄,兩個event的時間差,即為事件持續時間。所有的event都存在於同一張表。對應接口25)報警時間查詢

 

problem存在於一張單獨的表,每一條記錄對應了兩個事件,即problem event 和 recovery event。對應接口24)報警數據查詢。

這張表zabbix后台會定期清理,problem事件恢復30分鍾后,會被從表中刪除。

 

所以如果要查當前的報警事件,去problem里查;如果要查事件的歷史記錄,到event里查,並且要對problem event 與 recovery event 進行匹配計算,一個開始對應一個結束,才算一條歷史報警記錄。

 

三、           接口封裝與使用詳解(代碼見第五節的鏈接)

1)        登陸

zabbix登陸token的保留時間非常長,一次登陸后,基本可數周內不用重新登陸

/**
 * @return
登陸zabbix后台true/false
 */
Boolean login();

 

2)        在線狀態

/**
 * 判斷
zabbix是否已 在線(可用,並已登陸),沒有的話 嘗試登陸
 
* @return 在線/重連成功,返回1;自系統啟動首次登陸成功返回2; 不在線,且重連失敗,返回0
 */
Integer OnLine();

 

3)        請求zabbix后台,並返回結果

作為最基礎的訪問zabbix后台的接口,其他接口都是基於它實現的。

/**
 * 封裝了
RestTemplate 請求 與 zabbix 自動重連功能
 
* @param zabbixMethod  請求方法
 
* @param zabbixParams  請求參數
 
* @return result Object
 */
ZabbixResponse requestZabbixForObject(String zabbixMethod, Object zabbixParams);

      

4)        模板-xml導入

對於用戶來說,讓他們配置一個相當復雜的“模板-應用集-監控項-觸發器”是很有難度的,這些應該是開發人員做的事,用戶只管會用就可以。所以我們把這些配置梳理好后,以xml文件的形式發給用戶,用戶只需上傳模板,即可完成整個復雜的創建過程。

/**
 * 導入
xml模板
 
* @param sourceXml
 
* @return
 
*/
Boolean  importConfiguration(Document sourceXml);

 

5)        模板-Id 查詢

/**
 * 根據模板
host名稱(全英文的那個名字 在zabbix后台唯一標識模板) 查詢 模板在zabbix后台的id
 * @param
tempLateHostName
 
* @return
 
*/
String getTemplateIdByHostName(String tempLateHostName);

 

6)        主機群組(host group)-Id查詢

- 主機的邏輯組;它包含主機和模板。創建主機/模板時,必須指定其所屬的主機群組,所以需要事先創建(導入模板xml時即會創建)。一個主機組里的主機和模板之間並沒有任何直接的關聯。通常在給不同用戶組的主機分配權限時候使用主機組。

/**
 * 根據
group名稱,查詢group在zabbix后台的id
 * @param
groupName
 
* @return
 
*/
String getGroupIdByName(String groupName);

 

7)        主機-創建

/**
 * 創建主機
 
* @param hostIps 主機ip列表
 
* @param groupId 所屬分組id(zabbix)
 * @return
hostIps 的順序 返回 對應的hostId
 */
List<String> createHost(List<String> hostIps,String groupId);

 

8)        主機-查詢全部

返回的Map以ip地址為key,hostId為value, 方便對返回值快速的搜索查詢

/**
 * 查詢全部主機
 
* @return key 主機host(Ip), value 主機hostId
 */
Map<String,String> getHostAll();

 

9)        模板-關聯主機(批量)

關聯成功后,會生成實際的監控項和觸發器

/**
 * 批量將機器
hostIds(zabbix后台的hostId)(列表) 與 模板關聯
 
* @param templateId
 
* @param hostIds
 
* @return
 
*/
Boolean templateMassAdd(String templateId,List<String> hostIds);

 

10)    模板-取消關聯主機(批量)

/**
 * 主機
(批量) 取消 模板鏈接 並清理-(會刪掉主機監控項)
 
* @param hostIds  需要取消模板關聯的主機id列表
 
* @param templateId 需要取消關聯的 模板id
 * @return
 
*/
Boolean hostMassRemoveTemplate(List<String> hostIds,String templateId);

 

11)    模板-查詢關聯的所有主機

這個接口其實更為通用,可以在params 中指定查詢條件,查詢返回所有符合條件的主機,此處要查詢模板關聯的機器,只需在params中指定templateids 即可,參數格式 參考官方文檔:

https://www.zabbix.com/documentation/3.4/manual/api/reference/host/get

示例

(先聲明List<String> templateIds)

zabbixService.getHosts(new HashMap(){{

    put("templateids",templateIds);

}});

/**
 * 查詢 模板關聯的所有機器
 
* @param params
 默認參數
:
{
"output": ["hostid","host"]
}
 * @return
 
*/
List<ZabbixHost> getHosts(Map params);
 

 

12)    模板-刪除(批量)

/**
 * 批量刪除模板,會清理掉模板當前所關聯主機的所有監控項(已與模板解除關聯的主機,其監控項不會被清理
)
 * @param
templateIds
 
* @return
 
*/
Boolean templateMassDelete(List<String> templateIds);

 

13)    主機-刪除(批量)

/**
 * 批量刪除主機
 
* @param hostIds 主機列表
 
* @return
 
*/
Boolean hostDelete(List<String> hostIds);

 

14)    監控項-查詢1

關聯查詢應用,觸發器,主機

/**
 * 查詢主機關聯的所有的監控項
 
* @param params {@link <a href = "https://www.zabbix.com/documentation/3.4/manual/api/reference/item/get">item.get</a>}
選填參數:
{
   "hostids":["10205"],
   "itemids":["27692","27707"],
   "triggerids":["12345"]
}
默認參數:
{
"output":["itemid","name","key_","delay","history","status","flags","units","lastvalue","value_type"],
"selectApplications": ["applicationid","name","hostid","templateids"],
"selectTriggers":["triggerid","templateid","description","expression","comments","status","priority","value"],
"selectHosts":["hostid","host"]
}
 * @return Item列表 或 空
Array
 */
List<ZabbixItem> getItems(Map params);

 

15)    監控項-查詢2

關聯查詢應用,主機;

/**
 * 查詢監控項數據,和監控項關聯的
host,無用的字段不查
 
* @param params
 默認參數
{
"output":["itemid","name","lastclock","lastvalue","lastvalue","prevvalue","status","units"],
"selectApplications": ["applicationid","name","hostid","templateids"],
"selectHosts":["hostid","host"]
}
 * @return Item列表
key-zabbixItemId 或 空Map
 */
Map<String,ZabbixItem> getItemData(Map params);

 

16)    應用-查詢-根據id

每個application都有個parentId和hostid, 根據parentId 向上回溯查詢application,當其parentId為null時,對應的hostId才指向Template.

/**
 * 根據
application Id 查詢 application 詳情
 
* @param Id
 
* @return application 或 null
 */
ZabbixApplication getApplicationById(String Id);

 

17)    應用-查詢-根據id(批量)

/**
 * 批量查詢,根據
application Ids 查詢 applications 詳情
 
* @param ids
 
* @return key 為applicationId
 */
Map<String,ZabbixApplication> getApplicationsByIds(List<String> ids);

 

18)    應用-查詢-根據模板id

/**
 * 批量查詢,根據
application Ids 查詢 applications 詳情
 
* @param ids
 
* @return key 為applicationId
 */
Map<String,ZabbixApplication> getApplicationsByIds(List<String> ids);

 

19)    觸發器-查詢

/**
 * 獲取所有的觸發器
 
* doc:
 * @see
<a href = "https://www.zabbix.com/documentation/3.4/manual/api/reference/trigger/get">trigger.get</a>
 
* @param params
 
* 默認參數:
 {
    "output":["triggerid","description","priority","value","expression","status","comments"],
    "selectItems":["itemid","lastvalue","units"],
    "selectHosts":["host","hostid"]
 }
 * @return map  key = {@link ZabbixTrigger#triggerId} , value = {@link ZabbixTrigger}; 或空
Map
 */
Map<String,ZabbixTrigger> getTriggers(Map params);

 

20)    監控項-修改

/**
 * 根據
itemId 修改 item
 * @param
items 字段itemId 必填,只支持修改delay,history,status
 * @return
 
*/
Boolean itemsUpdate(List<ZabbixItem> items);

 

21)    觸發器-修改

/**
 * 根據
triggerId 修改 trigger
 * @param
triggers 字段triggerId 必填,只支持修改 status,comments,expression,
 *                 注意
:通過模板關聯生成的trigger 只能修改status,comments,其他是改不了的,會失敗
 
* @return  true/false
 */
Boolean triggersUpdate(List<ZabbixTrigger> triggers);

 

22)    應用-監控項-組織結構查詢-根據主機id

/**
 * 根據
hostIds 查詢關聯的application-Item 組織(組織結點 主要包含Id 和 name)
 
* @param hostIds
 
* @return
 
*/
List<ZabbixApplication> getApplicationAndItemOrgByHostId(List<String> hostIds);

 

23)    最新監控數據-查詢

若要查詢模板關聯的監控項,先查模板關聯的機器,然后調用該接口進行查詢。

/**
 * 查詢 監控數據,以主機
ID 和 applicationName 作為過濾條件
 
* 會過濾掉 已被禁用的監控項數據
 
* @param hostIds
 
* @param appNames 為空 時,查詢全部數據
 
* @return application-item
 
*/
List<ZabbixApplication> getLatestItemData(List<String> hostIds,List<String> appNames);

 

24)    報警數據-查詢

/**
 * 查詢報警數據
--來自觸發器
 
* @param params 查詢參數
 
* 默認參數:
 
{
    "output": "extend",
    "sortfield": ["eventid"],
    "sortorder": "DESC",
    "recent":"true",
    "selectAcknowledges": "extend"
 }
 * @see
<a href="https://www.zabbix.com/documentation/3.4/manual/api/reference/problem/get">problem.get</a>
 
* ctrl + 單擊 查看url鏈接
 
* @return {@link ZabbixProblem}
 */
List<ZabbixProblem> getProblems(Map params);

 

25)    報警事件查詢

/**
 * 查詢報警事件
--來自觸發器
 
* @param params
 
* 默認參數:
 
{  "output": "extend",
    "sortfield": ["clock", "eventid"],
    "sortorder": "DESC",
    "select_acknowledges":"extend",
    "selectRelatedObject":["triggerid","description","priority","value"],
    "selectHosts":["hostid","host"]
 }
 * @see
<a href="https://www.zabbix.com/documentation/3.4/manual/api/reference/event/get">event.get</a>
 
* @return {@link ZabbixProblem}
 */
List<ZabbixProblem> getEvents(Map params);

 

26)    關閉觸發器

忽略並關閉報警事件

/**
 *
關閉觸發器
 
* @param events  需關閉的event 列表
 
* 默認參數:
{
    "message": "
忽略",
    "action": 1
}
 * @return
 
*/
Boolean acknowledgeEvents(List<String> events);

 

27)    歷史數據-查詢

查詢指定監控項的歷史數據

參數history 表示返回值類型,摘錄一段官方文檔解釋:

History object types to return. 

Possible values: 
0 - numeric float; 
1 - character; 
2 - log; 
3 - numeric unsigned; 
4 - text. 

Default: 3.

 

就是說實際的數據類型 和參數 history的類型 必須一致,否則會導致查不到數據。

所以查之前,需要先查詢確定監控項的數據類型valueType.

/**
 *
查監控項的歷史數據
 
* @param params  itemids  string/array 監控項id 必填  "history":3, 必填-不填或者類型不對將查不到數據
 
* @see <a href="https://www.zabbix.com/documentation/3.4/manual/api/reference/history/get">history.get</a>
必填參數:
{
"itemids": ["27702"]
}
默認參數:
{
"sortfield":"clock",
"sortorder":"DESC"
}

 * @return
 
*/
List<ZabbixHistory> getHistory(Map params);

 

28)    圖表-查詢配置

如果要查圖表數據,需要先查圖表配置,然后對圖表配置中的監控項id, 通過getHistory接口查詢監控項的歷史數據。

/**
 * 查詢圖表配置信息
 
* @param params
 默認參數
:
params.put("output",new ArrayList(){{
add("graphid");
add("name");
add("graphtype");
}});

params.put("selectGraphItems",new ArrayList(){{
add("gitemid");
add("itemid");
add("color");
}});

params.put("selectItems",new ArrayList(){{
add("itemid");
add("name");
}});
 * @return
 
*/
List<GraphConfig> getGraphConfig(Map params);

 

29)    圖表-創建

/**
 * 創建監控圖表
 
* @param graphConfig
 
* @return
 
*/
GraphConfig createGraph(GraphConfig graphConfig) throws Exception;

 

30)    圖表-修改

/**
 * 更新監控圖表
 
* @param graphConfig
 
* @return
 
*/
GraphConfig updateGraph(GraphConfig graphConfig) throws Exception;

 

31)    圖表-刪除

/**
 * 刪除圖表
 
* @param params  圖表id
 * @return
 
* @throws Exception
 */
Boolean deleteGraph(List params) throws Exception;

 

 

四、           監控數據單位轉換

 

從zabbix 后台 查詢到的監控數據,都是最小單位,如時間的單位是 秒s,存儲的單位是B,流量的單位是B/s.

所以需要自適應進行轉換,轉成KB/s 或者 MB/s等。

 

1)轉成最合適,無溢出的單位

/**
 * @param
value 原始數據
 
* @param units 原始單位
 
* @return 轉成最合適 無溢出的單位
 
*/
public static UnitsFormatResult transformValueByUnits(String value,String units)

 

2) 轉成指定單位的數據

繪制圖表時,每個數據需要單位一致,才有可比性,才能進行正確的繪制,因此會用到此方法。

/**
 *
 * @param
value 原始數據
 
* @param units 原始單元
 
* @param targetUnits 目標單位
 
* @return
 
*/
public static UnitsFormatResult transformValueToTargetUnits(String value,String units,String targetUnits)

 

 

五、           請下載附件源碼

https://files.cnblogs.com/files/wangzhen-fly/zabbix3.4api%E5%B0%81%E8%A3%85-src.zip

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM