importrequestsimportjsonimporttimeclassZabbixCollector: Zabbix API 数据采集器专为提取存储性能月度数据设计。 def__init__(self,zabbix_url,username,password):self.urlf{zabbix_url}/api_jsonrpc.phpself.headers{Content-Type:application/json-rpc}self.usernameusername self.passwordpassword self.auth_tokenNoneself.req_id1def_call_api(self,method,params):底层封装统一处理 Zabbix JSON-RPC 请求与响应payload{jsonrpc:2.0,method:method,params:params,id:self.req_id}ifself.auth_token:payload[auth]self.auth_token self.req_id1try:responserequests.post(self.url,headersself.headers,jsonpayload,timeout10)response.raise_for_status()resultresponse.json()iferrorinresult:print(f[-] API 调用错误 ({method}):{result[error][data]})returnNonereturnresult.get(result)exceptExceptionase:print(f[-] 请求异常:{e})returnNonedeflogin(self):第一步登录并获取鉴权 Tokenprint([*] 正在连接 Zabbix API...)params{user:self.username,password:self.password}self.auth_tokenself._call_api(user.login,params)ifself.auth_token:print([] Zabbix 登录成功)returnTruereturnFalsedefget_host_id(self,host_name):第二步通过设备名称获取 Zabbix Host IDparams{filter:{host:[host_name]}}hostsself._call_api(host.get,params)ifhosts:returnhosts[0][hostid]returnNonedefdump_all_items_to_file(self,host_id,filenamezabbix_items_dump.txt):辅助排错工具导出该主机下的所有监控项清单print(f[*] 正在拉取 Host ID{host_id}的所有监控项请稍候...)params{output:[itemid,name,key_],hostids:host_id}itemsself._call_api(item.get,params)ifitems:withopen(filename,w,encodingutf-8)asf:f.write(f 主机 ID{host_id}监控项清单 (共{len(items)}项) \n\n)foriteminitems:f.write(f名称:{item[name]}\n)f.write(f -- ID:{item[itemid]}| Key:{item[key_]}\n)f.write(-*40\n)print(f[] 成功导出{len(items)}个监控项已保存至文件:{filename})returnTrueprint([-] 导出失败或该主机下无监控项。)returnFalsedefget_item_id(self,host_id,item_keyword):第三步根据关键词模糊查找特定监控项 IDparams{output:[itemid,name,key_],hostids:host_id,search:{name:item_keyword},searchWildcardsEnabled:True}itemsself._call_api(item.get,params)ifitems:returnitems[0][itemid],items[0][name]returnNone,Nonedefget_monthly_trend(self,item_id,days_back30):第四步按月度拉取趋势数据计算最大值与均值time_tillint(time.time())time_fromtime_till-(days_back*24*3600)params{output:[itemid,clock,value_min,value_max,value_avg],itemids:[item_id],time_from:time_from,time_till:time_till}trendsself._call_api(trend.get,params)ifnottrends:returnNoneall_maxmax(float(t[value_max])fortintrends)all_avgsum(float(t[value_avg])fortintrends)/len(trends)return{monthly_max:all_max,monthly_avg:all_avg,data_points:len(trends)}# 运行逻辑 if__name____main__:# 配置信息ZABBIX_URLhttp://192.168.0.130/zabbixZABBIX_USERAdminZABBIX_PASSzabbixTARGET_HOSTDorado5000202606# 模式控制设为 True 用于寻找未知的监控项名称设为 False 用于拉取性能数据MODE_DUMP_ITEMSTruezabbixZabbixCollector(ZABBIX_URL,ZABBIX_USER,ZABBIX_PASS)ifzabbix.login():print(f[*] 正在查询主机:{TARGET_HOST}...)host_idzabbix.get_host_id(TARGET_HOST)ifnothost_id:print(f[-] 在 Zabbix 里未找到主机{TARGET_HOST}。)else:print(f[] 成功定位主机 (Host ID:{host_id}))ifMODE_DUMP_ITEMS:# 模式 1导出所有监控项找名字zabbix.dump_all_items_to_file(host_id,dorado_items.txt)print(\n[!] 提示请打开 dorado_items.txt 搜索 IOPS/时延确认具体名称后修改脚本切换为模式 2。)else:# 模式 2根据确切名字拉取性能数据# TODO: 当你在 txt 文件中找到正确名字后填在这里并将 MODE_DUMP_ITEMS 改为 FalseSEARCH_KEYWORD填入你找到的确切名称print(f[*] 正在查找监控项: {SEARCH_KEYWORD}...)item_id,item_namezabbix.get_item_id(host_id,SEARCH_KEYWORD)ifitem_id:print(f[] 找到监控项: [{item_name}] (ID:{item_id}))print([*] 正在计算过去 30 天的性能聚合数据...)trend_datazabbix.get_monthly_trend(item_id,days_back30)iftrend_data:print(\n 月度性能统计 )print(f设备名称:{TARGET_HOST})print(f指标名称:{item_name})print(f月度均值 (Avg):{trend_data[monthly_avg]:.2f})print(f月度峰值 (Max):{trend_data[monthly_max]:.2f})else:print([-] 该监控项近期无趋势数据。)else:print(f[-] 未找到名称包含 {SEARCH_KEYWORD} 的监控项。)
zabbix获取监控项信息
importrequestsimportjsonimporttimeclassZabbixCollector: Zabbix API 数据采集器专为提取存储性能月度数据设计。 def__init__(self,zabbix_url,username,password):self.urlf{zabbix_url}/api_jsonrpc.phpself.headers{Content-Type:application/json-rpc}self.usernameusername self.passwordpassword self.auth_tokenNoneself.req_id1def_call_api(self,method,params):底层封装统一处理 Zabbix JSON-RPC 请求与响应payload{jsonrpc:2.0,method:method,params:params,id:self.req_id}ifself.auth_token:payload[auth]self.auth_token self.req_id1try:responserequests.post(self.url,headersself.headers,jsonpayload,timeout10)response.raise_for_status()resultresponse.json()iferrorinresult:print(f[-] API 调用错误 ({method}):{result[error][data]})returnNonereturnresult.get(result)exceptExceptionase:print(f[-] 请求异常:{e})returnNonedeflogin(self):第一步登录并获取鉴权 Tokenprint([*] 正在连接 Zabbix API...)params{user:self.username,password:self.password}self.auth_tokenself._call_api(user.login,params)ifself.auth_token:print([] Zabbix 登录成功)returnTruereturnFalsedefget_host_id(self,host_name):第二步通过设备名称获取 Zabbix Host IDparams{filter:{host:[host_name]}}hostsself._call_api(host.get,params)ifhosts:returnhosts[0][hostid]returnNonedefdump_all_items_to_file(self,host_id,filenamezabbix_items_dump.txt):辅助排错工具导出该主机下的所有监控项清单print(f[*] 正在拉取 Host ID{host_id}的所有监控项请稍候...)params{output:[itemid,name,key_],hostids:host_id}itemsself._call_api(item.get,params)ifitems:withopen(filename,w,encodingutf-8)asf:f.write(f 主机 ID{host_id}监控项清单 (共{len(items)}项) \n\n)foriteminitems:f.write(f名称:{item[name]}\n)f.write(f -- ID:{item[itemid]}| Key:{item[key_]}\n)f.write(-*40\n)print(f[] 成功导出{len(items)}个监控项已保存至文件:{filename})returnTrueprint([-] 导出失败或该主机下无监控项。)returnFalsedefget_item_id(self,host_id,item_keyword):第三步根据关键词模糊查找特定监控项 IDparams{output:[itemid,name,key_],hostids:host_id,search:{name:item_keyword},searchWildcardsEnabled:True}itemsself._call_api(item.get,params)ifitems:returnitems[0][itemid],items[0][name]returnNone,Nonedefget_monthly_trend(self,item_id,days_back30):第四步按月度拉取趋势数据计算最大值与均值time_tillint(time.time())time_fromtime_till-(days_back*24*3600)params{output:[itemid,clock,value_min,value_max,value_avg],itemids:[item_id],time_from:time_from,time_till:time_till}trendsself._call_api(trend.get,params)ifnottrends:returnNoneall_maxmax(float(t[value_max])fortintrends)all_avgsum(float(t[value_avg])fortintrends)/len(trends)return{monthly_max:all_max,monthly_avg:all_avg,data_points:len(trends)}# 运行逻辑 if__name____main__:# 配置信息ZABBIX_URLhttp://192.168.0.130/zabbixZABBIX_USERAdminZABBIX_PASSzabbixTARGET_HOSTDorado5000202606# 模式控制设为 True 用于寻找未知的监控项名称设为 False 用于拉取性能数据MODE_DUMP_ITEMSTruezabbixZabbixCollector(ZABBIX_URL,ZABBIX_USER,ZABBIX_PASS)ifzabbix.login():print(f[*] 正在查询主机:{TARGET_HOST}...)host_idzabbix.get_host_id(TARGET_HOST)ifnothost_id:print(f[-] 在 Zabbix 里未找到主机{TARGET_HOST}。)else:print(f[] 成功定位主机 (Host ID:{host_id}))ifMODE_DUMP_ITEMS:# 模式 1导出所有监控项找名字zabbix.dump_all_items_to_file(host_id,dorado_items.txt)print(\n[!] 提示请打开 dorado_items.txt 搜索 IOPS/时延确认具体名称后修改脚本切换为模式 2。)else:# 模式 2根据确切名字拉取性能数据# TODO: 当你在 txt 文件中找到正确名字后填在这里并将 MODE_DUMP_ITEMS 改为 FalseSEARCH_KEYWORD填入你找到的确切名称print(f[*] 正在查找监控项: {SEARCH_KEYWORD}...)item_id,item_namezabbix.get_item_id(host_id,SEARCH_KEYWORD)ifitem_id:print(f[] 找到监控项: [{item_name}] (ID:{item_id}))print([*] 正在计算过去 30 天的性能聚合数据...)trend_datazabbix.get_monthly_trend(item_id,days_back30)iftrend_data:print(\n 月度性能统计 )print(f设备名称:{TARGET_HOST})print(f指标名称:{item_name})print(f月度均值 (Avg):{trend_data[monthly_avg]:.2f})print(f月度峰值 (Max):{trend_data[monthly_max]:.2f})else:print([-] 该监控项近期无趋势数据。)else:print(f[-] 未找到名称包含 {SEARCH_KEYWORD} 的监控项。)