Python+Mysql生成zabbix统计数据

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

先大概了解一下zabbix数据库结构:

1、groups表

wKioL1PZ9l2DeGFfAAEDMjzH7lI086.jpg

可以根据组名查到组ID


2、找到组ID就可以根据组ID找出这个组下面的所有服务器的ID,这个关系在hosts_groups表里面:

wKioL1PZ9vfBBxHKAAEPD2MX5VU788.jpg


3、有了hostid就可以在hosts表里查看这台机器的基本信息了:

wKioL1PZ98jCuezkAAPU0Vuzf4s989.jpg

items表则可以根据hostid查出这台服务器的所有监控项:

wKiom1PZ9q_y6ZdqAALMc4xTfZE224.jpg


4、终于在items表查到itemid,利用这个itemid在trends和trends_uint这两个表中统计出我们需要的数据

wKiom1PZ91LgY2LoAAGEwEweiyA064.jpg


我python水平挺菜的,很多面向对象的功能都不知道咋用,求大神教育

0804编辑:重新整理了一份新的:http://lihuipeng.blog.51cto.com/3064864/1535454

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#!/usr/bin/python
#coding:utf-8
 
import  MySQLdb
import  time,datetime
 
 
#zabbix数据库信息:
zdbhost  =  '192.168.1.1'
zdbuser  =  'zabbix'
zdbpass  =  'zabbixreport'
zdbport  =  3306
zdbname  =  'zabbix'
 
#需要查询的key列表
keys  =  {
         'trends_uint' :[
             'net.if.in[eth0]' ,
             'net.if.out[eth0]' ,
             'vfs.fs.size[/,used]' ,
             'vm.memory.size[available]' ,
         ],
         'trends' :[
             'system.cpu.load[percpu,avg5]' ,
             'system.cpu.util[,idle]' ,
         ],
     }
 
 
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  =  'qjsh'
 
         #获取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  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 ,itemid, start_time, stop_time):
         '''查询trends_uint表的值,type的值为min,max,avg三种'''
         resultlist  =  {}
         for  type  in  [ '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
             resultlist[ type =  result
         return  resultlist
 
     def  getTrends_uintValue( self ,itemid, start_time, stop_time):
         '''查询trends_uint表的值,type的值为min,max,avg三种'''
         resultlist  =  {}
         for  type  in  [ '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:
                 resultlist[ type =  int (result)
             else :
                 resultlist[ type =  0
         return  resultlist
 
 
     def  getLastMonthData( self ,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(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  table, keylists  in  keys.items():
                 for  key  in  keylists:
                     print  "\t正在统计 key_:%s"  %  key
                     data  =   zabbix.getLastMonthData(resultdict[ 'hostid' ],table,key)
                     zabbix.IpInfoList[ip][key]  =  data
 
     def  writeToXls( self ):
         '''生成xls文件'''
         try :
             import  xlsxwriter
             #创建文件
             workbook  =  xlsxwriter.Workbook( 'damo.xls' )
             #创建工作薄
             worksheet  =  workbook.add_worksheet()
             #写入标题(第一行)
             =  0
             for  value  in  [ "主机" , "CPU平均空闲值" , "CPU最小空闲值" , "可用平均内存(单位M)" , "可用最小内存(单位M)" , "CPU5分钟负载" , "进入最大流量(单位Kbps)" , "进入平均流量(单位Kbps)" , "出去最大流量(单位Kbps)" , "出去平均流量(单位Kbps)" ]:
                 worksheet.write( 0 ,i, value.decode( 'utf-8' ))
                 =  +  1
             #写入内容:
             =  1
             for  ip,value  in  self .IpInfoList.items():
                 worksheet.write(j, 0 , ip)
                 worksheet.write(j, 1 '%.2f'  %  value[ 'system.cpu.util[,idle]' ][ 'avg' ])
                 worksheet.write(j, 2 '%.2f'  %  value[ 'system.cpu.util[,idle]' ][ 'min' ])
                 worksheet.write(j, 3 '%dM'  %  int (value[ 'vm.memory.size[available]' ][ 'avg' /  1024  /  1024 ))
                 worksheet.write(j, 4 '%dM'  %  int (value[ 'vm.memory.size[available]' ][ 'min' /  1024  /  1024 ))
                 worksheet.write(j, 5 '%.2f'  %  value[ 'system.cpu.load[percpu,avg5]' ][ 'avg' ])
                 worksheet.write(j, 6 , value[ 'net.if.in[eth0]' ][ 'max' ] / 1000 )
                 worksheet.write(j, 7 , value[ 'net.if.in[eth0]' ][ 'avg' ] / 1000 )
                 worksheet.write(j, 8 , value[ 'net.if.out[eth0]' ][ 'max' ] / 1000 )
                 worksheet.write(j, 9 , value[ 'net.if.out[eth0]' ][ 'avg' ] / 1000 )
                 =  +  1
             workbook.close()
         except  Exception,e:
             print  e
 
 
 
     def  __del__( self ):
         '''关闭数据库连接'''
         self .cursor.close()
         self .conn.close()
 
if  __name__  = =  "__main__" :
     zabbix  =  ReportForm()
     zabbix.getInfo()
     zabbix.writeToXls()

生成xls文件我用了一个叫xlsxwriter的第三方库,这个库只能写不能读,感觉还可以,生成出来的效果:

wKioL1PZ-VWAgEvhAAbEjHEpkVM093.jpg

本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1533315如需转载请自行联系原作者


lihuipeng

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
存储 JSON 数据库
Python中列表数据的保存与读取:以txt文件为例
Python中列表数据的保存与读取:以txt文件为例
17 2
|
4天前
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
【5月更文挑战第10天】BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
23 1
|
1天前
|
机器学习/深度学习 关系型数据库 MySQL
MySQL 到 Greenplum 实时数据同步实操分享,2024年最新【Python面试题
MySQL 到 Greenplum 实时数据同步实操分享,2024年最新【Python面试题
|
2天前
|
JSON JavaScript 数据格式
利用 python 分析基金,合理分析数据让赚钱赢在起跑线!(1)
利用 python 分析基金,合理分析数据让赚钱赢在起跑线!(1)
|
3天前
|
存储 JSON 数据格式
Python知识点——高维数据的格式化
Python知识点——高维数据的格式化
5 0
|
3天前
|
Python
Python知识点——文件和数据格式化
Python知识点——文件和数据格式化
6 0
|
4天前
|
存储 机器学习/深度学习 数据可视化
基于Python的数据分组技术:将数据按照1, 2, 3规则分为三个列表
基于Python的数据分组技术:将数据按照1, 2, 3规则分为三个列表
8 1
|
4天前
|
存储 JSON 数据挖掘
python序列化和结构化数据详解
python序列化和结构化数据详解
14 0
|
4天前
|
数据采集 数据可视化 数据挖掘
Python 与 PySpark数据分析实战指南:解锁数据洞见
Python 与 PySpark数据分析实战指南:解锁数据洞见
|
4天前
|
数据采集 数据处理 开发者
Python 中的数据处理技巧:高效数据操作的艺术
Python 在数据处理方面表现卓越,为开发者提供了丰富的工具和库以简化数据操作。在本文中,我们将探讨 Python 中数据处理的一些技巧,包括数据清洗、数据转换以及优化数据操作的最佳实践。通过掌握这些技巧,您可以在 Python 中更加高效地处理和分析数据。

推荐镜像

更多