需求:统计现有服务器的资源利用率,降本增效

方案: 利用现有zabbix监控信息,使用python检索zabbix的mysql库,筛选出可用信息进行计算,倒出表格

问题:zabbix mysql表信息需要查询,zabbix4以后数据库结构发生变化,groups表被取消,无法直接查询出组名对应组id

脚本简介:

根据主机组名称->通过模版表hstgrp查询出主机组id->通过主机与主机组对应表hosts_groups查询出该组所有主机的ip->遍历ip去监控项表item查询监控项键值key_的值 →根据进制 进行需求计算(键值与zabbix监控项模版相关,如有特殊需求,需先创建监控项)→计算结果在当前目录生成 主机组名+当前日期的.xlsx 文件

#!/usr/bin/python
#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import pymysql as MySQLdb
import time
import datetime
import xlsxwriter,xlwt# zabbix数据库信息:
zdbhost = 'localhost'
zdbuser = 'zabbix'
zdbpass = 'yoyi@2018'
zdbport = 3306
zdbname = 'zabbix'# 生成文件名称:
xlsfilename = 'Group_Production_Server.xlsx'# 需要查询的key列表 [名称,表名,key值,取值,格式化,数据整除处理]
keys = [['CPU平均空闲值','trends','system.cpu.util[,idle]','avg','%.2f',1],['CPU最小空闲值','trends','system.cpu.util[,idle]','min','%.2f',1],['内存大小(单位G)','trends_uint','vm.memory.size[total]','avg','',1073741824],['剩余内存(单位G)','trends_uint','vm.memory.size[available]','avg','',1073741824],['内存使用(单位G)','trends_uint','vm.memory.size[used]','avg','',1073741824],['可用平均内存(单位G)','trends_uint','vm.memory.size[available]','avg','',1073741824],['可用最小内存(单位G)','trends_uint','vm.memory.size[available]','min','',1073741824],#['swap总大小(单位G)','trends_uint','system.swap.size[,total]','avg','',1048576000],#['swap平均剩余(单位G)','trends_uint','system.swap.size[,free]','avg','',1048576000],['DISK总大小(G)','trends_uint','vfs.fs.size[/,total]','avg','',1073741824],['DISK剩余(G)','trends_uint','vfs.fs.size[/,free]','avg','',1073741824],['DISK使用(G)','trends_uint','vfs.fs.size[/,used]','avg','',1073741824],#['磁盘使用率(%)','trends','fs01_used','avg','%.2f',1],#['进入最大流量(单位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)self.cursor = self.conn.cursor()#生成zabbix哪个分组报表self.groupname = 'JXQ-algo'#获取IP信息:self.IpInfoList = self.__getHostList()def __getHostList(self):'''根据zabbix组名获取该组所有IP'''#查询组ID:sql = '''select groupid from hstgrp where name = '%s'; ''' % self.groupnameself.cursor.execute(sql)groupid = self.cursor.fetchone()[0]#groupid = '49'#根据groupid查询该分组下面的所有主机ID(hostid):sql = '''select hostid from hosts_groups where groupid = '%s' ''' % groupidself.cursor.execute(sql)hostlist = self.cursor.fetchall()#生成IP信息字典:结构为{'119.146.207.19':{'hostid':10086L,},}IpInfoList = {}for i in hostlist:hostid = i[0]sql = '''select ip from interface where hostid = '%s' ''' % hostidret = self.cursor.execute(sql)if ret:IpInfoList[self.cursor.fetchone()[0]] = {'hostid':hostid}return IpInfoListdef __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']itemid = self.cursor.fetchone()[0]else:itemid = Nonereturn itemiddef 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']result = self.cursor.fetchone()[0]if result == None:result = 0return resultdef 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']result = self.cursor.fetchone()[0]if result:result = int(result)else:result = 0return resultdef getLastMonthData(self,type,hostid,table,itemname):'''根据hostid,itemname获取该监控项的值'''#获取上个月的第20天和最后1天ts_first = int(time.mktime(datetime.date(datetime.date.today().year,datetime.date.today().month-1,20).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 getNowData(self):nowtime = datetime.datetime.now().strftime('%Y-%m-%d')return nowtimedef 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]] = datadef writeToXls2(self):'''生成xls文件'''#xlsfilename = '%s.xls'%(self.groupname)xlsfilename = '%s-%s.xlsx'%(self.groupname,datetime.date.today())try:wbk = xlsxwriter.Workbook(xlsfilename)worksheet = wbk.add_worksheet()wbk.add_format({'bold': 1})worksheet.set_column("A:I", 18)worksheet.set_row(row=0,height=30,cell_format=None)#设置样式title_formatter = wbk.add_format()title_formatter.set_border(1)title_formatter.set_bg_color('#4682B4')title_formatter.set_align('center')title_formatter.set_bold()title_formatter.set_color("#F8F8FF")title_formatter.set_font_size(14)content_formatter=wbk.add_format()content_formatter.set_font_size(12)content_formatter.set_align("center")#写入第一列:worksheet.write(0,0,"主机名",title_formatter)i = 1for ip in self.IpInfoList:worksheet.write(i,0,ip,content_formatter)i = i + 1#写入其他列:i = 1for value in keys:worksheet.write(0,i,value[0],title_formatter)#写入该列内容:j = 1for ip,result in self.IpInfoList.items():if value[4]:worksheet.write(j,i, value[4] % result[value[2]][value[3]],content_formatter)else:worksheet.write(j,i, result[value[2]][value[3]] / value[5],content_formatter)j = j + 1 i = i + 1#wbk.save(xlsfilename)wbk.close()except Exception as e:print (e)#def __del__(self):#  '''关闭数据库连接'''#  self.cursor.close()#  self.conn.close()if __name__ == "__main__":zabbix = ReportForm()zabbix.getInfo()zabbix.writeToXls2()

结果事例

利用python+zabbix查询服务器利用率相关推荐

  1. 利用ARP协议查询服务器的MAC,HTTP报文格式又是怎样的 如何使用ARP协议查询Mac地址...

    浏览器从地址栏得到服务器 IP,接着构造一个 HTTP 报文,其中包括: 请求行包含请求方法.URL.协议版本 请求报头(Request Header):由 "关键字: 值"对组成 ...

  2. 利用python批量查询企业信息_python实现批量获取指定文件夹下的所有文件的厂商信息...

    本文实例讲述了python实现批量获取指定文件夹下的所有文件的厂商信息的方法.分享给大家供大家参考.具体如下: 功能代码如下: import os, string, shutil,re import ...

  3. python提前查成绩_利用Python来查询自己的成绩!想改成绩吗?我教你啊!

    前言 前段时间在公众号发布了一篇用Python网络爬虫来获取百度贴吧某帖子内所有图片的文章.写的确实不好.很多地方连我自己都搞不明白,这篇文章笔者尽量把它写好,写明白.还望各位大佬海涵. 这个系列是干 ...

  4. python批量查询豆瓣书籍评分(教程附源码)

    在懒人盘分享的高分电子书是利用python批量查询得到的 发现常规的豆瓣api不允许调用了,几番搜索发现一个接口 https://book.douban.com/j/subject_suggest?q ...

  5. 利用python实现百度竞价自动化效果监控

    百度竞价效果监控 很多客户朋友做了百度推广,全国或者多地区推广,很多时候监控不到本地以外城市的推广情况,不方便推广的调整. 问题 百度推广可以选择不同地区不同出价策略和不同的创意等,但是监控不到数据的 ...

  6. python --搭建FTP服务器

    一.了解FTP服务器 二.利用python搭建FTP服务器 1.安装 pyftpdlib 模块 2.找到pyftpdlib模块源文件所在目录 3.到 pyftpdlib目录下 4. 编写并运行FTP代 ...

  7. python 播放视频 ftp_利用Python快速搭建HTTPFTP服务器

    用 Python 快速实现 FTP 服务器 有时当你想快速搭建一个 FTP 服务器来临时实现文件上传下载时,这是特别有用的.我们这里利用 Python 的Pyftpdlib 模块可以快速的实现一个 F ...

  8. 利用python来自己写一个服务器台账统计小工具

    利用python来自己写一个服务器台账统计小工具 前言 无奈呀,压力创造成品 背景是这样的,相信在看的各位在管理服务器密码的时候,肯定会有个台账啥的,当然咱也有,但是吧,为了安全期间,不允许出现在服务 ...

  9. python网页版本_利用jupyter网页版本进行python函数查询方式

    我就废话不多说了,还是直接看代码吧! import numpy world_alchol=numpy.genfromtxt("world_alcohol.txt",delimter ...

最新文章

  1. php嵌入html还是html嵌入php,php嵌入html有哪几种方法
  2. NBT:利用细胞甘油三酯存储提高链霉菌中聚酮类化合物的效价
  3. Junit内部解密之四: Junit单元测试最佳实践
  4. Linux命令如何显示光标
  5. Leetcode--560. 和为K的子数组
  6. 广东工业大学计算机学院微信群,谢光强
  7. Android花屏分析,Unity游戏在手机上运行时的花屏现象
  8. linux无法将文件移入回收站,linux中使用rm命令将文件移到回收站的方法
  9. 程序迭代时测试操作的要点(后端前端)
  10. Windows的空格预览神器 | QuickLook
  11. 数据结构与算法-二叉树遍历
  12. 4k微型计算机接口,单片微型计算机原理与接口技术:基于STC15W4K32S4单片机
  13. dplayer安装php_Dplayer播放器集成p2p加速源码分享
  14. 01 WIFI ----- SDIO接口驱动
  15. PTA 1075 链表元素分类
  16. Kafka_producer
  17. 相似图片搜索、算法、识别的原理解析(上)
  18. MySQL开启ssl证书
  19. 手握2亿美金,专挑“硬骨头”?The Engine公布第一批“改变世界”的被投公司名单...
  20. 施一公:我对科研的体验

热门文章

  1. 一文带你了解Zookeeper基本概念、集群搭建、使用方法
  2. 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法
  3. Java基础篇之利用IO流给文件加密、解密
  4. Java对象内存大小计算
  5. 常见3种视频加密原理知多少
  6. 渗透测试必备google插件
  7. python做交易软件_我用Python做了个量化交易工具!
  8. 【GISer小O】JAVA后台的小白之路(一)_2 ——分分合合三剑客
  9. 长尾关键词排名优化技巧
  10. [Go实战]简单使用scylladb