2021-12-4-openGauss数据库源码学习-指标采集、预测与异常检测
opengauss源码解析
指标采集、预测与异常检测
代码位置:/gausskernel/dbmind/tools/anomaly_detection
各模组在整体结构上的组合在摩天轮论坛上官方解析文章已经叙述的相对完整详尽。该报告对应为具体模块内部的实现。
Agent模块
代码位置: ~/agent
Agent
模块负责数据库指标数据采集与发送,从代码的结构上看,可以分为3个子模块,即DBSource(/db_source.py)
,MemoryChannel(/channel.py)
,HttpSink(/sink.py)
,负责整合组织各个模块进行协作部分的代码位于~/metric_agent.py的agent_main()方法中。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
DBSource
代码位置:~/agent/db_source.py
DBSource
承担数据采集的功能,其承担的三个task可以在agent_main()部分直观的看到,分别为database_exporter
,os_exporter
,wdr
。该三个task的代码位于anomaly_detection/task中.
在metric_agent()中的使用
os_exporter
负责收集部署opengauss的设备上系统的部分性能数据。
对象方法 | 对应实现 |
---|---|
cpu_usage()/memory_usage() | linux命令ps -ux获取 |
io_read()/io_write() | linux命令 pidstat获取 |
io_wait() | iostat获取 |
disk_space() | 通过sql获取路径,再通过命令du -sh获取 |
可以看到该task收集的数据包括cpu使用率,io读写,io等待,内存使用以及硬盘空间存储部分。
DatabaseExporter
负责收集数据库方面的性能数据。
对象方法 | 对应实现 |
---|---|
guc_parameter() | 通过sql语句查询pg_setting中的数据,包括工作内存,共享缓冲区的大小以及最大的连接数量 |
current_connections() | select count(1) from pg_stat_activity |
gps()每秒事务量 | 通过sql语句从gs_sql_count中获取select/update/insert/delete计数,间隔0.1s采样,乘以10作为结果 |
process() |
linux命令ps -aux获取进程信息,通过分割筛选等处理获取进程数据,返回key为(pid)_(process) ,value为(cpu_usage:memory_usage) 的字典
|
temp_file() |
sql获取路径后检查临时数据文件夹pgsql_tmp是否存在,返回t /f
|
WDR(Workload Diagnosis Report
)
WDR基于两次不同时间点系统的性能快照数据,生成两个时间点之间的性能表现报表,用于诊断数据库内核的性能故障。而该部分的wdr相关的仅仅是一小部分,wdr
中summary
级和detail
级别的性能数据比起内置的这部分数据要丰富的多。该task模块中主要通过sql语句进行计数器的查询
MemoryChannel
代码位置:~/agent/channel.py
整体为一个存放数据的队列,结构比较简单
对象方法 | 对应实现 |
---|---|
put() | 尝试向队列中放置数据,超过最大限度时log提醒并舍去新数据 |
take() | 数据出列并返回其值 |
size() | 返回队列数据量 |
HttpSink
代码位置:~/agent/sink.py
其从MemoryChannel
获取数据,并根据metric_agent.py中提供的协议ssl
/http
进行转发,重试次数为5次,间隔1s
def process(self):agent_logger.info('Begin send data to {url}.'.format(url=self._url))while self.running:contents = self._channel.take()if not contents:time.sleep(0.5)continuecontents.update(**{'flag': {'host': self.db_host, 'port': self.db_port, 'type': self.db_type}})retry_times = 5while retry_times:try:req = request.Request(self._url, headers=_JSON_HEADER,data=json.dumps(contents).encode('utf-8'),method='POST')request.urlopen(req, context=self.context)breakexcept Exception as e:agent_logger.error("{error}, retry...".format(error=str(e)))retry_times -= 1if not retry_times:raisetime.sleep(1.0)time.sleep(self._interval)
Detector
代码位置: ~/detector
detector模块负责数据预测与异常检测,从代码的结构上看,可以分为3个部分,即algorithm
,service
和tools
,负责整合组织各个模块进行协作部分的代码位于~/metric_detector.py中。
receiver
代码位置:~/detector/service/resource/receiver.py
receiver
为service部分中,其功能为接受和存储获取到的性能数据。其中agent收集到的三部分tasks数据os_exporter
,database_exporter
以及wdr
通过sqlite存储在本地。
数据接收:
数据存储:
SQLiteStorage
代码位置:~/detector/service/storage/sqlite_storage.py
SQLiteStorage
实现了一种通过SQLite进行本地化存储数据的方式,该类主要是加载sql配置,并封装了一些需要的各种sql操作以使用,如下:
方法 | 对应功能 |
---|---|
select_timeseries_by_timestamp | 按照时间戳获取最近一段时间的数据 |
select_timeseries_by_number | 按照编号获取最近一段时间的数据 |
load_sql_operation | 加载本地table.json的sql操作 |
get_latest_timestamp | 获取最新的时间戳 |
table.json
位于/tools/anomaly_detection下,为该部分实现时加载的sql配置文件
algorithm
代码位置:~/detector/algorithm
algorithm
为时序预测算法部分,其包括arima
和prophet
两套时间序列预测算法框架,model
中的AlgModel
为算法的父类,也提供了使用自定义算法时的模板,使用时若未指定算法会默认使用auto_arima
.
对象方法 | 实现功能 |
---|---|
fit() | 输入时序数据list[[[[timestamp]]],[[[value]]]]进行模型训练 |
forecast() | 给定时间期间[[period]],[[freq]]进行数据预测,返回时序数据 |
save()/load() |
通过pickle 库来加载、存放模型
|
fit():
forecast():
trend
包括forecast
和detect
模块,提供时序数据预测与基于阈值的异常检测报警功能
forecast
代码位置:~/detector/tools/trend/forecast.py
该模块功能为读取时序数据(数量最少不低于设定值[[minimum_timeseries_length]]),并通过选定的预测算法进行拟合预测,生成数据future_reselt
([[status]],[[metric_name]],[[detect_basis]] ([[minimum]],[[maximum]]),[[future_date]],[[future_value]])提供处理
detect
代码位置:~/detector/tools/trend/detect.py
该模块根据forecast
封装后的数据以及配置中设定的数据阈值进行判断,正常的数据写入[[m_logger]],检测异常的数据,即[[higher]],[[lower]]写入[[a_logger]]警示。
2021-12-4-openGauss数据库源码学习-指标采集、预测与异常检测相关推荐
- 【参赛作品47】openGauss数据库源码学习-指标采集、预测与异常检测
作者:parker opengauss源码解析 指标采集.预测与异常检测 代码位置:/gausskernel/dbmind/tools/anomaly_detection 各模组在整体结构上的组合在摩 ...
- openGauss数据库源码解析系列文章--openGauss简介(一)
openGauss数据库是华为深度融合在数据库领域多年经验,结合企业级场景要求推出的新一代企业级开源数据库.此前,Gauss松鼠会已经发布了openGauss数据库核心技术系列文章,介绍了openGa ...
- openGauss数据库源码解析系列文章——openGauss开发快速入门(二)
在上一篇openGauss数据库源码解析系列文章--openGauss开发快速入门(上)中,我们介绍了openGauss的安装部署方法,本篇将具体介绍openGauss基本使用. 二. openGau ...
- openGauss数据库源码解析系列文章—— AI技术之“自调优”
上一篇介绍了第七章执行器解析中"7.6 向量化引擎"及"7.7 小结"的相关内容,本篇我们开启第八章 AI技术中"8.1 概述"及" ...
- openGauss数据库源码解析系列文章——openGauss开发快速入门(一)
作为openGauss数据库开发者,在基于开源社区的openGauss版本进行二次开发的过程中,需要完成软件包获取.源码了解.代码修改.编译发布等过程,同时还需要安装数据库以了解数据库的基本特点.验证 ...
- ⭐openGauss数据库源码解析系列文章—— 角色管理⭐
在前面介绍过"9.1 安全管理整体架构和代码概览.9.2 安全认证",本篇我们介绍第9章 安全管理源码解析中"9.3 角色管理"的相关精彩内容介绍. 9.3 角 ...
- ⭐openGauss数据库源码解析系列文章—— 对象权限管理⭐
在前面文章中介绍过"9.3 角色管理整",本篇我们介绍第9章 安全管理源码解析中"9.4 对象权限管理"的相关精彩内容介绍. 9.4 对象权限管理 权限管理是安 ...
- 【2021/12/25】 thinkphp源码无差别阅读(三)
thinkphp源码无差别阅读(三) framework阅读 Http.php 属性:app.name.path.routePath.isBild 构造方法:__construct 设置应用名称:na ...
- 【2021/12/29】thinkphp源码无差别阅读(七)
thinkphp源码无差别阅读(七) framework阅读 View.php 属性:namespace.data.filter. 获取模板引擎:engine 模板变量赋值:assign 试图过滤:f ...
最新文章
- 【Qt】信号和槽传递自定义结构体
- 【机器学习】多项式回归原理介绍
- 论初次修改 Android framework 代码
- python中abc属于字符串吗_Python基础学习:字符串
- 【转】gl_NormalMatrix
- ​清华大学提出基于生成对抗神经网络的自然图像多风格卡通化方法并开源代码...
- tomcat启动报错:Bean name 'XXX' is already used in this beans element
- ResNet原理和实现
- background-position 用法介绍
- 006-虚拟机中centos7实现nat静态ip上网
- Pycharm如何取消自动换行
- Asp.Net IIS 管理类(全)
- study - 收藏集 - 掘金
- resizableImageWithCapInsets:方法的探析 (转载笔记)
- -bash: vi: command not found -bash: ls: command not found
- 韩荣温控器nx2使用说明书_如何查看您的Ecobee温控器的使用历史记录
- 计算机组策略没有权限,运行组策略或程序时提示没有权限
- html5 视频字幕制作工具,短视频如何添加字幕?10分钟学习5款视频字幕制作工具,干货!...
- Win10 通过重置来修复系统的方法
- 无法在 Mountain Lion 上启动 visual Paradigm 软件安装程序
热门文章
- 货代英语--------澳大利亚包装声明
- Bootstrap框架网格系统工作原理
- spring基于aspectj的AOP配置 aop:aspectj-autoproxy proxy-target-class=true
- 人力资源管理系统需求文档
- c语言随机坐标函数,c语言随机数生成函数和时间函数
- Latex 添加关键字keywords
- git回滚 reset 之后如何恢复到之前状态
- ssm商城系统html模块,jsp+ssm+mysql实现的【在线商城系统】毕设思路指导及模板文档...
- 工作总结汇报该怎么写,才能让上司满意
- orangepi3 -硬件测试,并升级内核到4.9