(繼續貼一篇之前工作期間寫的經驗案例)
一、 案例背景
我負責開發過一個平台的監控報警模塊,基於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