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发腾讯微博代码分享
Jan 10 Python
python读取csv文件示例(python操作csv)
Mar 11 Python
python3中str(字符串)的使用教程
Mar 23 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
浅谈使用Python内置函数getattr实现分发模式
Jan 22 Python
pyqt5简介及安装方法介绍
Jan 31 Python
500行代码使用python写个微信小游戏飞机大战游戏
Oct 16 Python
python3 webp转gif格式的实现示例
Dec 10 Python
python中逻辑与或(and、or)和按位与或异或(&amp;、|、^)区别
Aug 05 Python
Pycharm的Available Packages为空的解决方法
Sep 18 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
Feb 26 Python
教你用python实现一个无界面的小型图书管理系统
May 21 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
缅甸的咖啡简史
2021/03/04 咖啡文化
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
去除php注释和去除空格函数分享
2014/03/13 PHP
慎用 somefunction.prototype 分析
2009/06/02 Javascript
用js实现判断当前网址的来路如果不是指定的来路就跳转到指定页面
2011/05/02 Javascript
基于jquery完美拖拽,可返回拖动轨迹
2012/03/29 Javascript
JavaScript function 的 length 属性使用介绍
2014/09/15 Javascript
jquery动态导航插件dynamicNav用法实例分析
2015/09/06 Javascript
详解JavaScript函数对象
2015/11/15 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
Angular.js初始化之ng-app的自动绑定与手动绑定详解
2017/07/31 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
详解JS中的柯里化(currying)
2017/08/17 Javascript
angular4 共享服务在多个组件中数据通信的示例
2018/03/30 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
2019/09/06 Python
Python 如何创建一个简单的REST接口
2020/07/30 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
如何用PHP实现邮件发送
2012/12/26 面试题
党员自我评价分享
2013/12/13 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
2015年入党决心书
2015/02/05 职场文书
2015年组织委员工作总结
2015/04/23 职场文书
新郎婚礼致辞
2015/07/27 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android
javascript中Set、Map、WeakSet、WeakMap区别
2022/12/24 Javascript