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实现通过shelve修改对象实例
Sep 26 Python
简单的连接MySQL与Python的Bottle框架的方法
Apr 30 Python
python操作字典类型的常用方法(推荐)
May 16 Python
python3.5 tkinter实现页面跳转
Jan 30 Python
python利用高阶函数实现剪枝函数
Mar 20 Python
python3.5 email实现发送邮件功能
May 22 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
Jul 02 Python
python通过txt文件批量安装依赖包的实现步骤
Aug 13 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
Python爬虫爬取新闻资讯案例详解
Jul 14 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反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
php中memcache 基本操作实例
2015/05/17 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
2015/04/12 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
jQuery实现返回顶部功能
2016/02/23 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
[38:23]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS LGD第一场
2014/05/24 DOTA
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
python3.4实现邮件发送功能
2018/05/28 Python
python八皇后问题的解决方法
2018/09/27 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
python读取hdfs并返回dataframe教程
2020/06/05 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
web字体加载方案优化小结
2019/11/29 HTML / CSS
Sony C++笔试题
2013/03/10 面试题
银行介绍信范文
2014/01/10 职场文书
超市国庆节促销方案
2014/02/20 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
班组建设经验交流材料
2014/05/12 职场文书
人事专员岗位职责
2015/02/03 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
go结构体嵌套的切片数组操作
2021/04/28 Golang
OpenCV实现反阈值二值化
2021/11/17 Java/Android
python脚本框架webpy的url映射详解
2021/11/20 Python