前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[打造自己的监控系统]使用pandas处理数据获取Oracle系统状态趋势并格式化为highcharts需要的格式

[打造自己的监控系统]使用pandas处理数据获取Oracle系统状态趋势并格式化为highcharts需要的格式

作者头像
bsbforever
发布2020-08-19 10:33:54
3.1K0
发布2020-08-19 10:33:54
举报
文章被收录于专栏:时悦的学习笔记

开发环境

操作系统:CentOS 7.4 Python版本 :3.6 Django版本: 1.10.5 操作系统用户:oms 数据处理:pandas 前端展示:highcharts

通过上面我们已经知道了如何使用Django获取数据库的系统状态信息并将其存入redis数据库

这节讲如何使用pandas处理数据获取Oracle系统状态趋势

1. HighCharts格式要求

这里以官网的折线图为例

从上面代码可以看出我们可以自定义的内容有:

  • title:标题
  • subtitle:子标题
  • yAxis: Y轴内容
  • xAxis: X轴内容(图中为显示)
  • series:具体的内容,是个列表,列表中的元素为字典,字典包含name和data键,键对应的值也为列表,每个name代表一条线

所以最后我们传递给template的值需要包含上面的内容,其中title,subtilt,yAxis内容我们通过赋值的方式

xAxis以及series的内容我们通过pandas处理后的数据得到

具体方法见下面讲解

2. Oracle系统状态趋势获取原理

通过前面的章节我们获取了每个小时v$sysstat视图里面的数据,这里我以DBTime=10.65.1.119=DCPROD为例,具体数据如下图

冒号左边代表时间,采用Unix时间戳的形式

冒号右边为DBTime的值

这里我们分2部分讲解

  • 一个是以天为单位进行分组,计算每天的DBTime差值
  • 一个是以小时为单位进行分组,计算一天中每小时之间的差值

2.1 以天/周为单位

1. 首先遍历redis中对应的Key的列表的值,将符合时间段的提取出来,之后将取出来的值处理后格式化成pandas的DataFrame格式

注意:如果有天没有监控数据则不会有该日期,解决方法下面有讲

result=pd.DataFrame({'week':dweek,'date':ddate,'time':dtime,'value':dvalue})

可以看到我们将日期和周别单独提取出来了

2. 接下来我们以date或week来进行分组

day_df=result['value'].groupby(result['date'])

3. 接下来我们将分组value的第一个值减去最后一个值得到该天的DBTime数值

day_result=(day_df.first() - day_df.last())/unit

4. 接下来将得到的差值的结果以及日期转换成列表再次格式化成DataFrame格式

series_reindex=pd.DataFrame({'date':day_result.index.values.tolist(),'value':day_result.values.tolist()})

5. 之后将dataframe的index值变为date的值

代码语言:javascript
复制
series_reindex.set_index('date',inplace=True)

6. 为防止有天数未有值导致画图不准确,需要将该dataframe重新index下

例如我要查看12/1-12/20的趋势,如果12/10监控系统故障导致没有数据,这时上面出来的结果是没有12/10这一天的,这时我们需要强制reindex下,将12/10这天的差值设为0

这里的x为根据前后时间段算出来的天数、

s=series_reindex.reindex(x,fill_value=0)

7. 最后我们将结果变成highcharts所需要的格式

series_singal['name']=key series_singal['data']= s['value'].values.tolist() series_singal['x']=s.index.values.tolist()

2.2 以小时为单位

1. 首先遍历redis中对应的Key的列表的值,将符合时间段的提取出来,之后将取出来的值处理后格式化成pandas的DataFrame格式

注意:如果有的小时没有监控数据则不会有该日期,如12/14 11:00 解决方法下面有讲

2. 接下来我们以date来进行分组

day_df=result.groupby(result['date'])

3. 之后遍历分组的名称(name)和分组值(group)

每次迭代的值代表一天的24小时,

4. 之后对每一天的24小时进行索引重新设置及填充,这里填充的是平均值

group.set_index('time',inplace=True) s=group.reindex(new_index,fill_value=group['value'].mean())

5. 接下来我们需要将这24小时计算差值(25个值)

采用的方法很简单,就是将25个值的列表错位拆分为2个列表,之后相减

j=flist[1:] k=flist[0:-1] for i in range(0,len(j)): flist1.append(j[i]-k[i])

6. 最后我们将结果变成highcharts所需要的格式

series_singal['name']=name final_series.append(series_singal)

源代码位置

欢迎访问我的github主页查看源码

https://github.com/bsbforever/oms_django

monitor/command/views_performance.py中的loadprofile_highcharts函数

monitor/command/views_oracleperformance.py中的oracle_performance_day函数

下节为如何讲如何在前端显示

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 宅必备 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. HighCharts格式要求
  • 2. Oracle系统状态趋势获取原理
    • 2.1 以天/周为单位
      • 2.2 以小时为单位
        • 源代码位置
        相关产品与服务
        云数据库 Redis®
        腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档