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

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

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

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
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
存储 数据采集 JavaScript
基于Python的Web数据与解析
基于Python的Web数据与解析
8 0
|
2天前
|
消息中间件 存储 关系型数据库
【微服务】mysql + elasticsearch数据双写设计与实现
【微服务】mysql + elasticsearch数据双写设计与实现
|
3天前
|
SQL 分布式计算 关系型数据库
使用 Spark 抽取 MySQL 数据到 Hive 时某列字段值出现异常(字段错位)
在 MySQL 的 `order_info` 表中,包含 `order_id` 等5个字段,主要存储订单信息。执行按 `create_time` 降序的查询,显示了部分结果。在 Hive 中复制此表结构时,所有字段除 `order_id` 外设为 `string` 类型,并添加了 `etl_date` 分区字段。然而,由于使用逗号作为字段分隔符,当 `address` 字段含逗号时,数据写入 Hive 出现错位,导致 `create_time` 值变为中文字符串。问题解决方法包括更换字段分隔符或使用 Hive 默认分隔符 `\u0001`。此案例提醒在建表时需谨慎选择字段分隔符。
|
3天前
|
数据采集 数据挖掘 Serverless
利用Python和Pandas库优化数据清洗流程
在数据分析项目中,数据清洗是至关重要的一步。传统的数据清洗方法往往繁琐且易出错。本文将介绍如何利用Python编程语言中的Pandas库,通过其强大的数据处理能力,实现高效、自动化的数据清洗流程。我们将探讨Pandas库在数据清洗中的应用,包括缺失值处理、重复值识别、数据类型转换等,并通过一个实际案例展示如何利用Pandas优化数据清洗流程,提升数据质量。
|
5天前
|
SQL 关系型数据库 MySQL
解决向MySQL中导入文件中的 数据时出现的问题~
解决向MySQL中导入文件中的 数据时出现的问题~
|
5天前
|
SQL 关系型数据库 MySQL
mysql插入500条数据sql语句
【5月更文挑战第12天】
|
6天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之写doris,mysql字段变更,重新提交才能同步新字段数据吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6天前
|
关系型数据库 MySQL Java
实时计算 Flink版产品使用合集之同步MySQL数据到Hologres时,配置线程池的大小该考虑哪些
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6天前
|
NoSQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之如何将MySQL的CDC实时数据写入到Hudi
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6天前
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版产品使用合集之使用DTS从RDSMySQL数据库同步数据到云Kafka,增量同步数据延迟时间超过1秒。如何诊断问题并降低延迟
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

推荐镜像

更多