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笔记(2)
Oct 24 Python
pycharm 使用心得(八)如何调用另一文件中的函数
Jun 06 Python
Python实现的几个常用排序算法实例
Jun 16 Python
Python中Collection的使用小技巧
Aug 18 Python
jupyter安装小结
Mar 13 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
pyspark操作MongoDB的方法步骤
Jan 04 Python
python+pyqt5编写md5生成器
Mar 18 Python
python 叠加等边三角形的绘制的实现
Aug 14 Python
sklearn-SVC实现与类参数详解
Dec 10 Python
python logging设置level失败的解决方法
Feb 19 Python
pytorch查看模型weight与grad方式
Jun 24 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
Yii框架getter与setter方法功能与用法分析
2019/10/22 PHP
div当滚动到页面顶部的时候固定在顶部实例代码
2013/05/27 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
使用Vue制作图片轮播组件思路详解
2018/03/21 Javascript
图片文字识别(OCR)插件Ocrad.js教程
2018/11/26 Javascript
vue实现跨域的方法分析
2019/05/21 Javascript
VUE:vuex 用户登录信息的数据写入与获取方式
2019/11/11 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
传媒专业推荐信范文
2013/11/23 职场文书
劳动竞赛口号
2014/06/16 职场文书
信用卡工作证明模板
2014/09/14 职场文书
个人四风问题对照检查材料思想汇报
2014/10/06 职场文书
领导班子三严三实心得体会
2014/10/13 职场文书
2014年度个人工作总结
2014/11/07 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
Python中Permission denied的解决方案
2021/04/02 Python
docker-compose部署Yapi的方法
2022/04/08 Servers
Python 匹配文本并在其上一行追加文本
2022/05/11 Python