Python+Mysql生成zabbix统计数据(优化)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

周末重新整理了一下,把有些不合理的地方改了下,自我感觉好多了

ZabbixReport.py

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
167
168
169
170
171
172
173
174
175
176
#!/usr/bin/python
#coding:utf-8
 
import  MySQLdb
import  time,datetime
 
 
#zabbix数据库信息:
zdbhost  =  '192.168.1.100'
zdbuser  =  'zabbix'
zdbpass  =  'zabbixreport'
zdbport  =  3306
zdbname  =  'zabbix'
 
#生成文件名称:
xlsfilename  =  'damo.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  =  '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 , 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' ))
             =  1
             for  ip  in  self .IpInfoList:
                 worksheet.write(i, 0 ,ip)
                 =  +  1
 
             #写入其他列:
             =  1
             for  value  in  keys:
                 worksheet.write( 0 ,i,value[ 0 ].decode( 'utf-8' ))
 
                 #写入该列内容:
                 =  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 ])
                     =  +  1
 
                 =  +  1
         except  Exception,e:
             print  e
 
 
 
     def  __del__( self ):
         '''关闭数据库连接'''
         self .cursor.close()
         self .conn.close()
 
if  __name__  = =  "__main__" :
     zabbix  =  ReportForm()
     zabbix.getInfo()
     zabbix.writeToXls2()
本文转自运维笔记博客51CTO博客,原文链接http://blog.51cto.com/lihuipeng/1535454如需转载请自行联系原作者                                                                                                                                                                                                                                                lihuipeng
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
11天前
|
关系型数据库 MySQL 数据库
ORM对mysql数据库中数据进行操作报错解决
ORM对mysql数据库中数据进行操作报错解决
35 2
|
11天前
|
SQL 关系型数据库 MySQL
MySQL如何排查和删除重复数据
该文章介绍了在MySQL中如何排查和删除重复数据的方法,包括通过组合字段生成唯一标识符以及使用子查询和聚合函数来定位并删除重复记录的具体步骤。
29 2
|
7天前
|
SQL 关系型数据库 MySQL
MySQL操作利器——mysql-connector-python库详解
MySQL操作利器——mysql-connector-python库详解
36 0
|
5天前
|
消息中间件 canal 关系型数据库
Maxwell:binlog 解析器,轻松同步 MySQL 数据
Maxwell:binlog 解析器,轻松同步 MySQL 数据
39 11
|
4天前
|
关系型数据库 MySQL 数据库
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
18 5
|
11天前
|
关系型数据库 MySQL 数据库
Python MySQL查询返回字典类型数据的方法
通过使用 `mysql-connector-python`库并选择 `MySQLCursorDict`作为游标类型,您可以轻松地将MySQL查询结果以字典类型返回。这种方式提高了代码的可读性,使得数据操作更加直观和方便。上述步骤和示例代码展示了如何实现这一功能,希望对您的项目开发有所帮助。
37 4
|
9天前
|
关系型数据库 MySQL Python
mysql之python客户端封装类
mysql之python客户端封装类
|
10天前
|
关系型数据库 MySQL Python
pymysql模块,python与MySQL之间的交互
pymysql模块,python与MySQL之间的交互
|
6天前
|
SQL 关系型数据库 MySQL
30天拿下Python之使用MySQL
30天拿下Python之使用MySQL
14 0
|
7天前
|
关系型数据库 MySQL 数据管理
pymysql:Python操作MySQL数据库的又一利器
pymysql:Python操作MySQL数据库的又一利器
12 0
下一篇
无影云桌面