作者:parker

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相关的仅仅是一小部分,wdrsummary级和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)continue

    contents.update(**{<span class="hljs-string">'flag'</span>: {<span class="hljs-string">'host'</span>: self.db_host, <span class="hljs-string">'port'</span>: self.db_port, <span class="hljs-string">'type'</span>: self.db_type}})retry_times = <span class="hljs-number">5</span><span class="hljs-keyword">while</span> retry_times:<span class="hljs-keyword">try</span>:req = request.Request(self._url, headers=_JSON_HEADER,data=json.dumps(contents).encode(<span class="hljs-string">'utf-8'</span>),method=<span class="hljs-string">'POST'</span>)request.urlopen(req, context=self.context)<span class="hljs-keyword">break</span><span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:agent_logger.error(<span class="hljs-string">&quot;{error}, retry...&quot;</span>.<span class="hljs-built_in">format</span>(error=<span class="hljs-built_in">str</span>(e)))retry_times -= <span class="hljs-number">1</span><span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> retry_times:<span class="hljs-keyword">raise</span>time.sleep(<span class="hljs-number">1.0</span>)time.sleep(self._interval)

Detector

代码位置: ~/detector

detector模块负责数据预测与异常检测,从代码的结构上看,可以分为3个部分,即algorithmservicetools,负责整合组织各个模块进行协作部分的代码位于~/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为时序预测算法部分,其包括arimaprophet两套时间序列预测算法框架,model中的AlgModel为算法的父类,也提供了使用自定义算法时的模板,使用时若未指定算法会默认使用auto_arima.

对象方法 实现功能
fit() 输入时序数据list[[[[timestamp]]],[[[value]]]]进行模型训练
forecast() 给定时间期间[[period]],[[freq]]进行数据预测,返回时序数据
save()/load() 通过pickle库来加载、存放模型
fit():

forecast():

trend

包括forecastdetect模块,提供时序数据预测与基于阈值的异常检测报警功能

forecast

代码位置:~/detector/tools/trend/forecast.py

该模块功能为读取时序数据(数量最少不低于设定值[[minimum_timeseries_length]]),并通过选定的预测算法进行拟合预测,生成数据future_reselt([[status]],[[metric_name]],[[detect_basis]] ([[minimum]],[[maximum]]),[[future_date]],[[future_value]])提供处理

detect

该模块功能为读取时序数据(数量最少不低于设定值[[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]]警示。

【参赛作品47】openGauss数据库源码学习-指标采集、预测与异常检测相关推荐

  1. 2021-12-4-openGauss数据库源码学习-指标采集、预测与异常检测

    opengauss源码解析 指标采集.预测与异常检测 代码位置:/gausskernel/dbmind/tools/anomaly_detection 各模组在整体结构上的组合在摩天轮论坛上官方解析文 ...

  2. openGauss数据库源码解析系列文章——openGauss开发快速入门(二)

    在上一篇openGauss数据库源码解析系列文章--openGauss开发快速入门(上)中,我们介绍了openGauss的安装部署方法,本篇将具体介绍openGauss基本使用. 二. openGau ...

  3. openGauss数据库源码解析系列文章--openGauss简介(一)

    openGauss数据库是华为深度融合在数据库领域多年经验,结合企业级场景要求推出的新一代企业级开源数据库.此前,Gauss松鼠会已经发布了openGauss数据库核心技术系列文章,介绍了openGa ...

  4. openGauss数据库源码解析系列文章—— AI技术之“自调优”

    上一篇介绍了第七章执行器解析中"7.6 向量化引擎"及"7.7 小结"的相关内容,本篇我们开启第八章 AI技术中"8.1 概述"及" ...

  5. openGauss数据库源码解析系列文章——openGauss开发快速入门(一)

    作为openGauss数据库开发者,在基于开源社区的openGauss版本进行二次开发的过程中,需要完成软件包获取.源码了解.代码修改.编译发布等过程,同时还需要安装数据库以了解数据库的基本特点.验证 ...

  6. ⭐openGauss数据库源码解析系列文章—— 角色管理⭐

    在前面介绍过"9.1 安全管理整体架构和代码概览.9.2 安全认证",本篇我们介绍第9章 安全管理源码解析中"9.3 角色管理"的相关精彩内容介绍. 9.3 角 ...

  7. ⭐openGauss数据库源码解析系列文章—— 对象权限管理⭐

    在前面文章中介绍过"9.3 角色管理整",本篇我们介绍第9章 安全管理源码解析中"9.4 对象权限管理"的相关精彩内容介绍. 9.4 对象权限管理 权限管理是安 ...

  8. openGauss数据库源码解析系列文章—— SQL引擎源解析(一)

    本篇我们开启"SQL引擎源解析"中"6.1 概述"及"6.2 SQL解析"的精彩内容介绍. 第6章 SQL引擎源解析 SQL引擎作为数据库系 ...

  9. openGauss数据库源码解析系列文章——SQL引擎源码解析(一)

    SQL引擎作为数据库系统的入口 , 主要承担了对SQL语言进行解析 . 优化 . 生成执行计划的 作用.对于用户输入的SQL语句,SQL引擎会对语句进行语法/ 语义上的分析以 判断是否满足语法规则等, ...

最新文章

  1. RemoveError: ‘requests‘ is a dependency of conda and cannot be removed from conda‘s operating envir
  2. 生鲜水产品牌“仙泉湖”获和智4000万元投资
  3. 为什么 wait/notify/notifyAll 在 Object 类定义而不是 Thread 类?
  4. 向ArcMap添加未出现的工具 如planarize lines
  5. 办公自动化系统开发实例导航 源码_本色世界源码搭建(系统开发)
  6. gazebo 直接获取传感器数据_【ROS-Gazebo】IMU插件使用与数据采集——以四足机器人pigot为例...
  7. dairy-20110419-每日总结
  8. DBA一族九阳神功秘籍
  9. 大规模针对iOS设备的恶意广告活动劫持3亿次浏览器会话
  10. python3.6字典有序_为什么Python3.6字典变得有序了?
  11. Spark-Serialization序列化的2种方式解释对比使用场景
  12. 【Java并发编程的艺术】第二章读书笔记之原子操作
  13. spring-第十五篇之AOP面向切面编程之AspectJ框架简单应用
  14. ubuntu16.04下怎么安装flash player
  15. java移位运算详解
  16. 小米 Notebook Air 2016 13.3黑苹果efi引导文件
  17. 关于Si24r1调试的总结
  18. 深度解析volatile关键字,就是这么简单
  19. 基于51单片机的交通灯仿真方案原理图设计一个数码管
  20. PAT 甲级 1016. Phone Bills

热门文章

  1. 初学者  C语言如何通过函数求同心圆环面积
  2. 1901年-2020年全球气象数据 CRU TS 介绍、下载与使用教程
  3. 第九届蓝桥杯——星期一
  4. 一键卸载docker、docker-compose
  5. 三相全控桥式整流matlab仿真,基于matlab的三相桥式全控整流电路的仿真研究
  6. 【2020-07】落地页获取百度搜索关键字最新方法
  7. 计算机英语考试范围,2011.12月份。牡师院计算机系英语考试题范围(翻译)
  8. Latex 图片插入、引用
  9. 【面经】腾讯U3d面试面经 帧同步方向(总)
  10. bzoj3538[Usaco2014 Open]Dueling GPS*