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

本文介绍OpenGauss数据库性能监控系统架构,涵盖Agent模块的数据采集与发送,Detector模块的数据预测及异常检测功能。

作者: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">&#x27;flag&#x27;</span>: {<span class="hljs-string">&#x27;host&#x27;</span>: self.db_host, <span class="hljs-string">&#x27;port&#x27;</span>: self.db_port, <span class="hljs-string">&#x27;type&#x27;</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">&#x27;utf-8&#x27;</span>),
                method=<span class="hljs-string">&#x27;POST&#x27;</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]]警示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gauss松鼠会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值