ZABBIX3.2使用python脚本实现监控报表的方法


Posted in Python onJuly 02, 2019

如下所示:

ZABBIX3.2使用python脚本实现监控报表的方法

#!/usr/bin/python
#coding:utf-8
 
import MySQLdb
import time,datetime
 
 
#zabbix数据库信息:
zdbhost = '172.16.8.200'
zdbuser = 'zabbix'
zdbpass = 'zabbix'
zdbport = 3306
zdbname = 'zabbix'
 
#生成文件名称:
xlsfilename = 'zabbix.xls'
 
#需要查询的key列表 [名称,表名,key值,取值,格式化,数据整除处理]
keys = [
  ['CPU核心数','trends_uint','system.cpu.num','avg','',1],
  ['CPU平均空闲值','trends','system.cpu.util[,idle]','avg','%.2f',1],
  ['CPU最小空闲值','trends','system.cpu.util[,idle]','min','%.2f',1],
  ['CPU5分钟负载','trends','system.cpu.load[percpu,avg5]','avg','%.2f',1],
  ['物理内存大小(单位G)','trends_uint','vm.memory.size[total]','avg','',1048576000],
  ['可用平均内存(单位G)','trends_uint','vm.memory.size[available]','avg','',1048576000],
  ['可用最小内存(单位G)','trends_uint','vm.memory.size[available]','min','',1048576000],
  ['swap总大小(单位G)','trends_uint','system.swap.size[,total]','avg','',1048576000],
  ['swap平均剩余(单位G)','trends_uint','system.swap.size[,free]','avg','',1048576000],
  ['根分区总大小(单位G)','trends_uint','vfs.fs.size[/,total]','avg','',1073741824],
  ['根分区平均剩余(单位G)','trends_uint','vfs.fs.size[/,free]','avg','',1073741824],
  ['进入最大流量(单位Kbps)','trends_uint','net.if.in[eth0]','max','',1000],
  ['进入平均流量(单位Kbps)','trends_uint','net.if.in[eth0]','avg','',1000],
  ['出去最大流量(单位Kbps)','trends_uint','net.if.out[eth0]','max','',1000],
  ['出去平均流量(单位Kbps)','trends_uint','net.if.out[eth0]','avg','',1000],
]
 
 
class ReportForm:
 
  def __init__(self):
    '''打开数据库连接'''
    self.conn = MySQLdb.connect(host=zdbhost,user=zdbuser,passwd=zdbpass,port=zdbport,db=zdbname)
    self.cursor = self.conn.cursor(cursorclass=MySQLdb.cursors.DictCursor)
 
    #生成zabbix哪个分组报表
    self.groupname = 'zabbix server'
 
    #获取IP信息:
    self.IpInfoList = self.__getHostList()
 
  def __getHostList(self):
    '''根据zabbix组名获取该组所有IP'''
 
    #查询组ID:
    sql = '''select groupid from groups where name = '%s' ''' % self.groupname
    self.cursor.execute(sql)
    groupid = self.cursor.fetchone()['groupid']
 
    #根据groupid查询该分组下面的所有主机ID(hostid):
    sql = '''select hostid from hosts_groups where groupid = %s''' % groupid
    self.cursor.execute(sql)
    hostlist = self.cursor.fetchall()
 
    #生成IP信息字典:结构为{'119.146.207.19':{'hostid':10086L,},}
    IpInfoList = {}
    for i in hostlist:
      hostid = i['hostid']
      sql = '''select host from hosts where status = 0 and hostid = %s''' % hostid
      ret = self.cursor.execute(sql)
      if ret:
        IpInfoList[self.cursor.fetchone()['host']] = {'hostid':hostid}
    return IpInfoList
 
  def __getItemid(self,hostid,itemname):
    '''获取itemid'''
    sql = '''select itemid from items where hostid = %s and key_ = '%s' ''' % (hostid, itemname)
    if self.cursor.execute(sql):
      itemid = self.cursor.fetchone()['itemid']
    else:
      itemid = None
    return itemid
 
  def getTrendsValue(self,type, itemid, start_time, stop_time):
    '''查询trends_uint表的值,type的值为min,max,avg三种'''
    sql = '''select %s(value_%s) as result from trends where itemid = %s and clock >= %s and clock <= %s''' % (type, type, itemid, start_time, stop_time)
    self.cursor.execute(sql)
    result = self.cursor.fetchone()['result']
    if result == None:
      result = 0
    return result
 
  def getTrends_uintValue(self,type, itemid, start_time, stop_time):
    '''查询trends_uint表的值,type的值为min,max,avg三种'''
    sql = '''select %s(value_%s) as result from trends_uint where itemid = %s and clock >= %s and clock <= %s''' % (type, type, itemid, start_time, stop_time)
    self.cursor.execute(sql)
    result = self.cursor.fetchone()['result']
    if result:
      result = int(result)
    else:
      result = 0
    return result
 
 
  def getLastMonthData(self,type,hostid,table,itemname):
    '''根据hostid,itemname获取该监控项的值'''
    #获取上个月的第一天和最后一天
    ts_first = int(time.mktime(datetime.date(datetime.date.today().year,datetime.date.today().month-1,1).timetuple()))
    lst_last = datetime.date(datetime.date.today().year,datetime.date.today().month,1)-datetime.timedelta(1)
    ts_last = int(time.mktime(lst_last.timetuple()))
 
    itemid = self.__getItemid(hostid, itemname)
 
    function = getattr(self,'get%sValue' % table.capitalize())
 
    return function(type,itemid, ts_first, ts_last)
 
  def getInfo(self):
    #循环读取IP列表信息
    for ip,resultdict in zabbix.IpInfoList.items():
      print "正在查询 IP:%-15s hostid:%5d 的信息!" % (ip, resultdict['hostid'])
      #循环读取keys,逐个key统计数据:
      for value in keys:
        print "\t正在统计 key_:%s" % value[2]
        if not value[2] in zabbix.IpInfoList[ip]:
          zabbix.IpInfoList[ip][value[2]] = {}
        data = zabbix.getLastMonthData(value[3], resultdict['hostid'],value[1],value[2])
        zabbix.IpInfoList[ip][value[2]][value[3]] = data
 
 
  def writeToXls2(self):
    '''生成xls文件'''
    try:
      import xlsxwriter
 
      #创建文件
      workbook = xlsxwriter.Workbook(xlsfilename)
 
      #创建工作薄
      worksheet = workbook.add_worksheet()
 
      #写入第一列:
      worksheet.write(0,0,"主机".decode('utf-8'))
      i = 1
      for ip in self.IpInfoList:
        worksheet.write(i,0,ip)
        i = i + 1
 
      #写入其他列:
      i = 1
      for value in keys:
        worksheet.write(0,i,value[0].decode('utf-8'))
 
        #写入该列内容:
        j = 1
        for ip,result in self.IpInfoList.items():
          if value[4]:
            worksheet.write(j,i, value[4] % result[value[2]][value[3]])
          else:
            worksheet.write(j,i, result[value[2]][value[3]] / value[5])
          j = j + 1
 
        i = i + 1
    except Exception,e:
      print e
 
 
 
  def __del__(self):
    '''关闭数据库连接'''
    self.cursor.close()
    self.conn.close()
 
if __name__ == "__main__":
  zabbix = ReportForm()
  zabbix.getInfo()
  zabbix.writeToXls2()

以上这篇ZABBIX3.2使用python脚本实现监控报表的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python的Django框架中的中间件
Jul 24 Python
Python实现获取磁盘剩余空间的2种方法
Jun 07 Python
python中使用%与.format格式化文本方法解析
Dec 27 Python
python分治法求二维数组局部峰值方法
Apr 03 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
如何使用python操作vmware
Jul 27 Python
python之PyQt按钮右键菜单功能的实现代码
Aug 17 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
Feb 28 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
Oct 23 Python
python爬虫用scrapy获取影片的实例分析
Nov 23 Python
Django中ORM的基本使用教程
Dec 22 Python
浅谈python 中类属性共享的问题
Jul 02 #Python
如何通过Python实现标签云算法
Jul 02 #Python
对python特殊函数 __call__()的使用详解
Jul 02 #Python
对python 调用类属性的方法详解
Jul 02 #Python
python算法题 链表反转详解
Jul 02 #Python
python输入多行字符串的方法总结
Jul 02 #Python
Django高级编程之自定义Field实现多语言
Jul 02 #Python
You might like
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
php实现字符串首字母大写和单词首字母大写的方法
2015/03/14 PHP
php基于dom实现的图书xml格式数据示例
2017/02/03 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
javascript 表单验证常见正则
2009/09/28 Javascript
JavaScript中链式调用之研习
2011/04/07 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
浅析JavaScript 箭头函数 generator Date JSON
2016/05/23 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
js 数字、字符串、布尔值的转换方法(必看)
2017/04/07 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
2017/09/29 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
Layui Form 自定义验证的实例代码
2019/09/14 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
python发送邮件实例分享
2017/07/28 Python
pandas series序列转化为星期几的实例
2018/04/11 Python
解决Python下imread,imwrite不支持中文的问题
2018/12/05 Python
Django 创建新App及其常用命令的实现方法
2019/08/04 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
基于numpy中的expand_dims函数用法
2019/12/18 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
小学生元旦广播稿
2014/02/21 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
南湾猴岛导游词
2015/02/09 职场文书
2015年销售助理工作总结
2015/05/11 职场文书
毕业典礼致辞
2015/07/29 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android