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脚本实现监控报表的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • python通过zabbix api获取主机

    zabbix强大地方在于有强大的api,zabbix 的api可以拿到zabbix大部分数据,目前我所需的数据基本可以通过api获取,以下是通过zabbix api获取的主机信息python代码,其他数据也如此类推,api使用方法可参见官网文档: #!/usr/bin/env python #-*- coding: utf-8 -*- import json import urllib2 from urllib2 import URLError from login import zabbix_

  • python实现zabbix发送短信脚本

    本文实例为大家分享了zabbix发送短信的具体代码,供大家参考,具体内容如下 使用方法 ./sendSMS.py PHONE_NUMBER args_2 SMS_MSG 接收参数输入 参数一: 接收手机号(zabbix传来的第1个参数,报警接收手机号),第一个参数可以对比发送邮件的脚本 参数二: 短信主题(zabbix传来的第2个参数,报警主题),在命令行测试必须输入,用来占位,脚本中并不获取这个参数 参数三: 短信内容(zabbix传来的第3个参数,报警内容) 手动调试方法 python se

  • zabbix利用python脚本发送报警邮件的方法

    前言 zabbix是个非常强大的监控工具,可以监控linux和windows的服务器数据,也可以通过自定义key来扩展默认的监控项,但是自带的邮件报警提供的信息却不太友善.本文想通过自定脚本的方式,实现在报警邮件的同时发送对应的图像和url连接. 步骤如下: 1.编辑zabbix_server.conf文件,修改AlertScriptsPath参数,该参数用于指定外部脚本的绝对路径. vim /etc/zabbix/zabbix_server.conf AlertScriptsPath=/usr

  • python批量添加zabbix Screens的两个脚本分享

    前言 在最初搭建公司监控系统的时候,最头疼的是需要把同类项目组的相同图形添加到一个Screens,由于只能一个一个的添加,非常耗时耗经历. 下面分享两个脚本来解决这个头疼的问题. 1.将单个主机的所有图形添加到一个Screens 使用方法 #更改main()函数里的url.username.password #参数一:主机名 #参数二:筛选图名称 python zabbix_screen_host.py 'zabbixserver' 'zabbixserver' zabbix_screen_ho

  • Python 调用 zabbix api的方法示例

    前提准备: 1.使用python requests模块 2.了解json 3.zabbix api的具体调用建议先浏览一下官网 先上代码: import requests,json # #url一定要正确,IP地址换成自己zabbix服务器的 zbx_url = "http://192.168.60.130:3080/zabbix/api_jsonrpc.php" #在post请求头部必须要有 'Content-Type': 'application/json-rpc' headers

  • python实现Zabbix-API监控

    做运维的朋友应该知道,公司IDC机房经常有上架.下架.报修和报废的服务器.如果服务器数量很多的时候很容易造成监控遗漏. 大的互联网公司把监控系统和CMDB(资产管理系统|配置管理数据库系统)集成在一起,当上架一台新机器的时候CMDB里面会记录相关的信息,Zabbix根据CMDB里面信息自动Link相关的模块,添加|删除监控.很多小的公司没有资产管理系统,但作为监控的负责人应该每天知道上架了哪些新的机器,确保能添加到Zabbix监控里面. 首先给大家说一下脚本思路: 1)通过Nmap工具扫描网段,

  • 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值,取值,格式

  • python通过ssh-powershell监控windows的方法

    本文实例讲述了python通过ssh-powershell监控windows的方法.分享给大家供大家参考.具体分析如下: 对于服务器的监控来说,监控linux不管是自己动手写脚本还是用一些开源的工具比如nagios,zenoss什么的.但毕竟还是有些公司有windows做服务器的,相对linux来说,windows没有方便的shell,cmd下提供的命令对于监控来说远远没有linux方便.但是现在windows上如果安装了powershell(win7,2008自带),就比以前方便多了,linu

  • 浅谈python脚本设置运行参数的方法

    正在学习Django框架,在运行manage.py的时候需要给它设置要监听的端口,就是给这个脚本一个运行参数.教学视频中,是在Eclipse中设置的运行参数,网上Django大部分都是在命令行中运行manage.py时添加参数,没有涉及到如何在pycharm中设置运行参数.以下是两种设置运行参数的方法(以manage.py为例),不设置运行参数时,运行结果为 D:\Python2.7\python.exe "D:/Django project/DjangoProject1/manage.py&q

  • 使用Python快速制作可视化报表的方法

    我们可以试用可视化包--Pyechart. Echarts是百度开源的一个数据可视化JS库,主要用于数据可视化. pyecharts是一个用于生成Echarts图标的类库.实际就是Echarts与Python的对接. 安装 pyecharts兼容Python2和Python3.执行代码: pip install pyecharts(快捷键Windows+R--输入cmd) 初级图表 1.柱状图/条形图 from pyecharts import Bar attr=["衬衫","

  • aws 通过boto3 python脚本打pach的实现方法

    脚本要实现的功能:输入instance id 1:将所有的volume take snapshot 2:  获取public ip 并登陆机器执行 ps 命令记录patch前进程状态已经端口状态 3:获取机器所在的elb 4:  从elb中移除当前机器 5:检查snapshots是否完成 6:snapshots完成后patching 7:  patching完成后将instance加回到elb #!/usr/bin/python # vim: expandtab:tabstop=4:shiftw

  • 使用python脚本自动生成K8S-YAML的方法示例

    1.生成 servie.yaml 1.1.yaml转json service模板yaml apiVersion: v1 kind: Service metadata: name: ${jarName} labels: name: ${jarName} version: v1 spec: ports: - port: ${port} targetPort: ${port} selector: name: ${jarName} 转成json的结构 { "apiVersion": "

  • Python脚本实现定时任务的最佳方法

    目录 前言 问题描述 解决方案 总结 前言 在日常工作中,常常需要周期性地执行某些任务,常用的方式是采用 Linux 系统自带的 crond 结合命令行实现,但最近却遇到了一个让人头大的问题. 问题描述 一个包含cx_Oracle的python文件,直接在linux下使用python命令可以运行,但是设置crontab定时任务会报错如下: cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loade

  • Python脚本实时处理log文件的方法

    这个Python脚本是用来对实时文件的内容监控,比如 Error 或者 time out 字段都可以进行自定义:算是我的第一个真正的Python脚本,自己感觉还是比较臃肿,不过打算放到blog上记录一下(还是初学者,大神们勿喷哈),真心希望博友们能够再指点一下(现在记录每次的文件大小值是输出到了一个文件中,并且里面还嵌套了有shell命令,这些我认为都是可以优化掉的吧,只是现在我还不知道怎么做):告警是基于zabbix,自定义的模板是120s执行一次 #!/usr/local/bin/pytho

  • python实现实时监控文件的方法

    在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和$upstream_response_time时间,分析出最耗时的请求,然后去改进代码,这时就要对日志进行实时分析了,发现时间长的语句就要报警出来,提醒开发人员要关注,当然这是其中一个应用场景,通过这种监控方式还可以应用到任何需要判断或分析文件的地方,所以今天我们就来看看如何用python实现实时监

随机推荐