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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 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
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
23天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
17天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
122 15
|
22天前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。
|
1月前
|
传感器 物联网 开发者
使用Python读取串行设备的温度数据
本文介绍了如何使用Python通过串行接口(如UART、RS-232或RS-485)读取温度传感器的数据。详细步骤包括硬件连接、安装`pyserial`库、配置串行端口、发送请求及解析响应等。适合嵌入式系统和物联网应用开发者参考。
53 3
|
1月前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
31 1
|
1月前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
1月前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
1月前
|
数据采集 JavaScript 程序员
探索CSDN博客数据:使用Python爬虫技术
本文介绍了如何利用Python的requests和pyquery库爬取CSDN博客数据,包括环境准备、代码解析及注意事项,适合初学者学习。
82 0
|
1月前
|
数据采集 存储 分布式计算
超酷炫Python技术:交通数据的多维度分析
超酷炫Python技术:交通数据的多维度分析
|
1月前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
36 0