# -*- coding:utf-8 -*-
import json
import requests
import time,datetime
import csv,chardet

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 getEvent(url, post_headers, auth,allgroupid_list, time_start, time_end):
post_data = {
"jsonrpc": "2.0",
"method": "event.get",
"params": {
"output": "extend",
#"time_from": "1615132800",
#"time_till": "1615737599",
"time_from": time_start,
"time_till": time_end,
"select_acknowledges": "extend",
"selectTags": "extend",
"selectSuppressionData": "extend",
"groupids": allgroupid_list,
"sortfield": ["clock", "eventid"],
"value": 1, #1表示告警事件,0表示恢复事件
"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)
print(ret_dict.get("result"))
for i in ret_dict.get("result"):
print(i)
print(len(ret_dict.get("result")))
return ret_dict

def eventAllExportCsv(data,csvfile):
data_list = data.get("result")
severity = []
f = open(csvfile, 'w', newline='')
csv_write = csv.writer(f)
row0 = ["eventid","clock","name","severity"] #csv第一行标题
csv_write.writerow(row0)
for i in data_list:
severity.append(i.get("severity"))
eventlevel = i.get("severity")
if eventlevel == "5":
eventlevel = "一级"
elif eventlevel == "4":
eventlevel = "二级"
elif eventlevel == "3":
eventlevel = "三级"
elif eventlevel == "2":
eventlevel = "四级"
else:
eventlevel = "未知"
eventtime = time.localtime(int(i.get("clock")))
eventtime = time.strftime("%Y-%m-%d %H:%M:%S", eventtime)
#print(i.get("eventid") + " " + eventtime + " " + i.get("name") + " " + eventlevel)
csv_write.writerow([i.get("eventid"),eventtime,i.get("name"),eventlevel])
return severity

def severityCountAddToCsv(severity,csvfile):
f = open(csvfile, 'a+', newline='')
csv_write = csv.writer(f)
csv_write.writerow([])
csv_write.writerow(["告警等级","总数"])
csv_write.writerow(["一级告警", str(severity.count('5'))])
csv_write.writerow(["二级告警", str(severity.count('4'))])
csv_write.writerow(["三级告警", str(severity.count('3'))])
csv_write.writerow(["四级告警", str(severity.count('2'))])

def typeCountAddToCsv(typeDict,csvfile):
f = open(csvfile, 'a+', newline='')
csv_write = csv.writer(f)
csv_write.writerow([])
csv_write.writerow(["监控对象类型","总数"])
for key in typeDict:
csv_write.writerow([key, typeDict[key]])

def typeGroupCount(typegroupname):
typegroupid_list = getHostGroupId(url, post_headers, auth, typegroupname)
intcount = {}
for i in range(len(typegroupid_list)):
eventdata = getEvent(url, post_headers, auth, typegroupid_list[i], time_start, time_end)
strkey = typegroupname[i]
intcount[strkey] = len(eventdata.get("result"))
newadd = {}
venter_data = 0
storage_data = 0
hardware_data = 0
for key in intcount:
if "06-" in key:
storage_data += intcount[key]
elif "10-" in key:
hardware_data += intcount[key]
elif "12-" in key or "Hypervisors" in key:
venter_data += intcount[key]
elif "01-" in key:
newadd_key = "Linux系统"
newadd_value = intcount[key]
elif "02-" in key:
newadd_key = "Windows系统"
newadd_value = intcount[key]
elif "Oracle" in key:
newadd_key = "Oracle"
newadd_value = intcount[key]
elif "Mysql" in key:
newadd_key = "Mysql"
newadd_value = intcount[key]
else :
pass
newadd[newadd_key] = newadd_value
newadd["服务器硬件"] = hardware_data
newadd["venter"] = venter_data
newadd["存储"] = storage_data
print(newadd)
return newadd

def appgroupCount(appgroupname):
appgroupid_list = getHostGroupId(url, post_headers, auth, appgroupname)
intcount = {}
bqx_totalcount = []
zab_totalcount = []
ac_totalcount = []
portal_totalcount = []
sap_totalcount = []
srm_totalcount = []
bk_totalcount = []
plm_totalcount = []
bom_totalcount = []
bigdata_totalcount = []
carnet_totalcount = []
for i in range(len(appgroupid_list)):
eventdata = getEvent(url, post_headers, auth, appgroupid_list[i], time_start, time_end)
strkey = appgroupname[i]
appcount = []
for j in eventdata.get("result"):
appcount.append(j.get("severity"))
if "50-" in appgroupname[i]:
strkey = "XXX系统"
bqx_totalcount += appcount
intcount[strkey] = bqx_totalcount
elif "13-" in appgroupname[i]:
strkey = "ACXX"
ac_totalcount += appcount
intcount[strkey] = ac_totalcount
elif "20-" in appgroupname[i]:
strkey = "XX门户网站"
portal_totalcount += appcount
intcount[strkey] = portal_totalcount
elif "30-" in appgroupname[i]:
strkey = "XXX系统"
sap_totalcount += appcount
intcount[strkey] = sap_totalcount
elif "31-" in appgroupname[i]:
strkey = "XXX系统"
srm_totalcount += appcount
intcount[strkey] = srm_totalcount
elif "32-" in appgroupname[i]:
strkey = "XX运维平台"
bk_totalcount += appcount
intcount[strkey] = bk_totalcount
elif "40-" in appgroupname[i]:
strkey = "XX系统"
plm_totalcount += appcount
intcount[strkey] = plm_totalcount
elif "45-" in appgroupname[i]:
strkey = "XX系统"
bom_totalcount += appcount
intcount[strkey] = bom_totalcount
elif "51-" in appgroupname[i]:
strkey = "大数据平台"
bigdata_totalcount += appcount
intcount[strkey] = bigdata_totalcount
elif "70-" in appgroupname[i]:
strkey = "XXX"
carnet_totalcount += appcount
intcount[strkey] = carnet_totalcount
elif "11-" in appgroupname[i]:
strkey = "Zabbix系统"
zab_totalcount = appcount
intcount[strkey] = zab_totalcount
else:
pass
print(intcount)
for key in intcount:
intcount[key] = [intcount[key].count("5"),intcount[key].count("4"),intcount[key].count("3"),intcount[key].count("2")]
print(intcount)
return intcount

def appCountAddToCsv(appDict, csvfile):
f = open(csvfile, 'a+', newline='')
csv_write = csv.writer(f)
csv_write.writerow([])
csv_write.writerow(["应用系统", "一级", "二级", "三级", "四级"])
for key in appDict:
csv_write.writerow([key, appDict[key][0], appDict[key][1], appDict[key][2], appDict[key][3]])

def getHostGroupId(url, post_headers, auth, hostgroupname):
post_data = {
"jsonrpc": "2.0",
"method": "hostgroup.get",
"params": {
"output": "extend",
"filter": {
"name": hostgroupname
}
},
"auth": auth,
"id": 1
}
ret = requests.post(url, data = json.dumps(post_data), headers = post_headers)
print("ret:",json.loads(ret.text))
print("result:", json.loads(ret.text).get("result"))
groupid_list = []
groupid_dict = {}
for i in json.loads(ret.text).get("result"):
groupid_list.append(i.get("groupid"))
strkey = i.get("name")
strvalue = i.get("groupid")
groupid_dict[strkey] = strvalue

print("groupid_dict:",groupid_dict)
return groupid_list

if __name__ == '__main__':
url = 'http://xx.xx.xx.xx/api_jsonrpc.php' #zabbix监控系统接口地址
post_headers = {'Content-Type': 'application/json'}
url_user = "******"
url_passwd = "******"
auth = getToken(url,post_headers,url_user,url_passwd) #获取token值
print(auth)
date = datetime.datetime.now() #获取当前时间
time_start = date - datetime.timedelta(days=date.weekday() + 7) # 上周开始时间
time_end = date - datetime.timedelta(days=date.weekday() + 1) # 上周结束时间
time_start =time.strptime(time_start.strftime("%Y-%m-%d")+" 00:00:00", "%Y-%m-%d %H:%M:%S")
time_end = time.strptime(time_end.strftime("%Y-%m-%d")+" 23:59:59", "%Y-%m-%d %H:%M:%S")
time_start = int(time.mktime(time_start))
time_end = int(time.mktime(time_end))

# 导出过去一周所有告警到csx文件
#csvfile = "过去一周监控告警统计" + time.strftime('_%Y%m%d%H%M%S', time.localtime(time.time())) + ".csv"
allgroupname = ["01-Linux生产系统", "02-Windows生产系统", "06-存储-A10负载均衡监控", "06-存储-光纤交换机监控", \
"06-存储-存储日志监控", "09-信息管理中心-系统运维部-DBA组-Mysql", "09-信息管理中心-系统运维部-DBA组-Oracle", \
"10-服务器硬件监控-Dell", "10-服务器硬件监控-H3C", "10-服务器硬件监控-华为", "10-西安机房服务器硬件监控-H3C",\
"12-信息管理中心-系统运维部-Vcenter", "20-宝能门户网站", "Hypervisors"]
getEvent(url, post_headers, auth, "116", time_start, time_end)
allgroupid_list = getHostGroupId(url, post_headers, auth, allgroupname)
eventdata = getEvent(url, post_headers, auth, allgroupid_list, time_start, time_end)
severity_list = eventAllExportCsv(eventdata,csvfile)
print(eventdata.get("result"))
print(len(eventdata.get("result")))

# #按告警等级统计,统计追加到csv文件
severityCountAddToCsv(severity_list,csvfile)

#按对象类型统计,统计追加到csv文件
typegroupname = ["01-Linux生产系统", "02-Windows生产系统","06-存储-A10负载均衡监控", "06-存储-光纤交换机监控", \
"06-存储-存储日志监控", "09-信息管理中心-系统运维部-DBA组-Mysql", "09-信息管理中心-系统运维部-DBA组-Oracle", \
"10-服务器硬件监控-Dell", "10-服务器硬件监控-H3C", "10-服务器硬件监控-华为", "10-西安机房服务器硬件监控-H3C", \
"12-信息管理中心-系统运维部-Vcenter", "Hypervisors"]
typeDict = typeGroupCount(typegroupname)
typeCountAddToCsv(typeDict,csvfile)

# 按应用系统统计,统计追加到csv文件
appgroupname = ["11-信息管理中心-系统运维部-zabbix监控平台", "13-信息管理中心-系统管控部-AC日志", "20-宝能门户网站", \
"30-信息管理中心-研发管理部-SAP系统", "31-信息管理中心_系统运营部-SRM-直采系统", \
"31-信息管理中心_系统运营部-SRM-间采系统", "32-信息管理中心_系统运营部-蓝鲸智云平台", \
"40-信息管理中心_信息运营部-PLM系统", "45-信息管理中心_研究总院IT部-BOM管理系统", "50-宝汽销-系统运维部", \
"50-宝汽销-系统运维部-Mysql", "51-信息管理中心_研究院-大数据平台", "70-前海七剑-研究院-车联网"]
appDict = appgroupCount(appgroupname)
appCountAddToCsv(appDict, csvfile)

自动统计zabbix过去一周监控告警的更多相关文章

  1. python自动统计zabbix系统监控覆盖率

    脚本主要功能: 1)通过zabbix api接口采集所有监控主机ip地址: 2)通过cmdb系统(蓝鲸)接口采集所有生产主机IP地址.主机名.操作系统.电源状态: 3)以上2步返回数据对比,找出未监控 ...

  2. Zabbix添加web页面监控告警

    一,选择添加了web监控的主机 二,创建一个告警触发器 三,定义监控项 设置完毕假如网站down就会触发告警 怎么设置web监控以及触发告警action参考 Zabbix使用SMTP发送邮件报警并且制 ...

  3. Zabbix中获取各用户告警媒介分钟级统计

    任务内容: 获取Zabbix各用户告警媒介分钟级统计,形成趋势图,便于观察各用户在每分钟收到的告警数量,在后续处理中,可以根据用户在某时间段内(例如3分钟内)收到的邮件总数,来判断是否有告警洪水的现象 ...

  4. 24 Zabbix系统配置日志监控告警--关键字触发

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 24 Zabbix系统配置日志监控告警--关键字触发 trapper是被监控主机主动发送数据给za ...

  5. 运维监控-Zabbix Server 使用微信 WeChat 告警

    运维监控-Zabbix Server 使用微信 WeChat 告警 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 微信公众号告警每个一天只支持1000次告警,如果超出这个次数了就不 ...

  6. zabbix监控告警Received empty response from Zabbix Agent Assuming that agent dropped connection

    zabbix监控告警Received empty response from Zabbix Agent Assuming that agent dropped connection错误 查看zabbi ...

  7. zabbix模板的自动发现规则(ldd)实现被监控项自动发现

    zabbix模板的自动发现规则(ldd)实现被监控项自动发现 自动发现规则(ldd)用途说明 在zabbix自带的linux模板的自动发现规则中,有一个Mounted filesystem disco ...

  8. Zabbix的集中式监控

    相对于传统的ZABBIX硬件系统级监控(CPU,内存,硬盘,网卡),应用级的监控就显得有些复杂了. 如果对不同的应该来不同的应用,配置会很多的. 如果我们能在一个指定的AGENT上监控所有的APACH ...

  9. 分布式监控告警平台Centreon快速使用

    一. Centreon概述 Centreon是一款功能强大的分布式IT监控系统,它通过第三方组件可以实现对网络.操作系统和应用程序的监控:首先,它是开源的,我们可以免费使用它:其次,它的底层采用nag ...

随机推荐

  1. Publish/Subscribe Pattern & Vanilla JavaScript

    Publish/Subscribe Pattern & Vanilla JavaScript https://en.wikipedia.org/wiki/Publish–subscribe_p ...

  2. flutter 混合开发

    flutter 混合开发 https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps https://flutter.de ...

  3. lightning & web components & templates & slots

    lightning & web components & templates & slots Web components, Custom elements, Template ...

  4. js 裁剪图片

    js 裁剪图片 https://gugeji.com/search?q=js剪切图片

  5. SMS OTP 表单最佳做法 (短信验证)

    <form action="/verify-otp" method="POST"> <input type="text" ...

  6. Flutter Navigator2.0

    Example 1 import 'package:dart_printf/dart_printf.dart'; import 'package:flutter/material.dart'; cla ...

  7. Java自学第7期——异常(Exception)

    1.概念: 异常 :指的是程序在执行过程中,出现的非正常的情况,终会导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类, 产生异常就是创建异常对象并抛出了一个异常对象. Ja ...

  8. HashMap扩容后是否需要rehash?

    需要,因为要重新计算旧数组元素在新数组地址.HashMap在JDK1.8中的rehash算法(也就是扩容后重新为里面的键值对寻址的算法)进行优化.hash寻址算法是 index =(n - 1) &a ...

  9. JS遍历对象的属性和值

    对于需要动态获取对象的某些属性和对应的值的时候,就需要遍历对象的属性和值. const user = { name: '张三', age: 20, addr: '湖北武汉', sex: '男' } / ...

  10. Kubernetes中分布式存储Rook-Ceph部署快速演练

    最近在项目中有涉及到Kubernetes的分布式存储部分的内容,也抽空多了解了一些.项目主要基于Rook-Ceph运行,考虑到Rook-Ceph部署也不那么简单,官方文档的步骤起点也不算低,因此,在整 ...