环境信息
- zabbix 4.2.4
- Python 3.6.8
说明
- 本脚本在生产环境久经考验
- 部分特殊场景可能会出现已经解除的告警依然会推送,原因未知
- 自行替换脚本中的企业微信推送url,群id,zabbix api地址,zabbix用户名和密码
源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
#!/usr/bin/env python # encoding=utf-8 import datetime import json import time import requests def send_msg_to_wework(chat_id, content): diag = {"chatid": chat_id, "msgtype": "markdown", "markdown": { "content": content}} headers = {"Content-Type": "application/json"} diag = json.dumps(diag) requests.post('http://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxx', data=diag, headers=headers) def getToken(url, post_headers, url_user, url_password): post_data = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": url_user, "password": url_password }, "id": 1 } ret = requests.post(url, data=json.dumps(post_data), headers=post_headers) return json.loads(ret.text).get("result") def timestamp_to_string(timestamp): # 转换成localtime time_local = time.localtime(timestamp) # 转换成新的时间格式(2016-05-05 20:28:54) dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local) return dt def get_start_end_timestamp(): t = datetime.datetime.now() # 当前日期 t1 = t.strftime('%Y-%m-%d %H:%M:%S') # 转为秒级时间戳 current_time = time.mktime(time.strptime(t1, '%Y-%m-%d %H:%M:%S')) # 12小时前 t2 = (t - datetime.timedelta(hours=12)).strftime("%Y-%m-%d %H:%M:%S") # 转为秒级时间戳 half_day_before = time.mktime(time.strptime(t2, '%Y-%m-%d %H:%M:%S')) return int(half_day_before), int(current_time) def get_problem(url, post_headers, auth, time_start, time_end): post_data = { "jsonrpc": "2.0", "method": "problem.get", "params": { "output": "extend", "time_from": str(time_start), "time_till": str(time_end), "select_acknowledges": "extend", "selectTags": "extend", "selectSuppressionData": "extend", "sortfield": ["eventid"], "severities": [5, 4, 3, 2], # 5:一级,4:二级,3:三级,2:四级, "sortorder": "DESC" }, "auth": auth, "id": 1 } ret = requests.post(url, data=json.dumps(post_data), headers=post_headers) ret_dict = json.loads(ret.text) return ret_dict def get_trigger_id_list(url, auth, post_headers, event_id): post_data = { "jsonrpc": "2.0", "method": "event.get", "params": { "output": "extend", "eventids": event_id, "sortfield": ["eventid"], "sortorder": "DESC" }, "auth": auth, "id": 1 } ret = requests.post(url, data=json.dumps(post_data), headers=post_headers) ret_dict = json.loads(ret.text) return ret_dict def get_trigger_item(url, auth, post_headers, trigger_id): post_data = { "jsonrpc": "2.0", "method": "trigger.get", "params": { "output": "extend", "triggerids": trigger_id, "expandDescription": "1", "selectHosts": "extend" }, "auth": auth, "id": 1 } ret = requests.post(url, data=json.dumps(post_data), headers=post_headers) ret_dict = json.loads(ret.text) return ret_dict if __name__ == '__main__': # zabbix监控系统接口地址 url = "http://127.0.0.1/zabbix/api_jsonrpc.php" post_headers = {'Content-Type': 'application/json'} url_user = "admin" url_passwd = "admin12345" auth = getToken(url, post_headers, url_user, url_passwd) # 获取token值 time_start, time_end = get_start_end_timestamp() problem_data = get_problem(url, post_headers, auth, time_start, time_end) result_list = problem_data['result'] event_list = [] for res in result_list: event_list.append(str(res['eventid'])) trigger_id_list = get_trigger_id_list(url=url, auth=auth, post_headers=post_headers, event_id=event_list) trigger_item_list = get_trigger_item(url=url, auth=auth, post_headers=post_headers, trigger_id=[trigger['objectid'] for trigger in trigger_id_list['result']]) from pprint import pprint title = "# <font color='warning'>**生产-ZABBIX-告警信息定时统计 (最近12小时内仍未解除的告警, 最多显示50条) **</font><@all>\n" msg_to_wework_list = [] count = 1 for trigger in trigger_item_list['result']: trigger_name = trigger['description'] host_name = trigger['hosts'][0]['name'] msg_to_wework_list.append(str(count) + '. ' + "<font color='warning'>主机名称:</font>" + host_name + ' ' + "<font color='warning'>触发器名称:</font>" + trigger_name) count = count + 1 send_msg_to_wework("xxxxx", title + '\n\n'.join(msg_to_wework_list[0:20])) |