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 httplib模块使用实例
Apr 11 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
python 矩阵增加一行或一列的实例
Apr 04 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
python3中property使用方法详解
Apr 23 Python
python issubclass 和 isinstance函数
Jul 25 Python
python代码 FTP备份交换机配置脚本实例解析
Aug 01 Python
实现Python3数组旋转的3种算法实例
Sep 16 Python
python 绘制场景热力图的示例
Sep 23 Python
上手简单,功能强大的Python爬虫框架——feapder
Apr 27 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 Python
python turtle绘图命令及案例
Nov 23 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的变量总结 新手推荐
2011/04/18 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
PHP7 新特性详细介绍
2016/09/06 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
深入分析javascript中console命令
2016/08/14 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
微信小程序 图片宽高自适应详解
2017/05/11 Javascript
jQuery Position方法使用和兼容性
2017/08/23 jQuery
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
微信小程序获取音频时长与实时获取播放进度问题
2018/08/28 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
tweenjs缓动算法的使用实例分析
2019/08/26 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
python模拟enum枚举类型的方法小结
2015/04/30 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python元组常见操作示例
2019/02/19 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
.NET面试题:什么是反射
2016/09/30 面试题
如何唤起类中的一个方法
2013/11/29 面试题
酒店前台接待岗位职责
2013/12/03 职场文书
工地宣传标语
2014/06/18 职场文书
2015年七夕爱情寄语
2015/03/24 职场文书
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫