opengauss 源码解析

指标采集、预测与异常检测

代码位置:/gausskernel/dbmind/tools/anomaly_detection

各模组在整体结构上的组合在摩天轮论坛上官方解析文章已经叙述的相对完整详尽。该报告对应为具体模块内部的实现。

Agent 模块

代码位置: ~/agentAgent模块负责数据库指标数据采集与发送,从代码的结构上看,可以分为 3 个子模块,即DBSource(/db_source.py),MemoryChannel(/channel.py),HttpSink(/sink.py),负责整合组织各个模块进行协作部分的代码位于~/metric_agent.py 的 agent_main()方法中。

DBSource

代码位置:~/agent/db_source.pyDBSource承担数据采集的功能,其承担的三个 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

负责收集数据库方面的性能数据。

对象方法 对应实现

gucparameter() 通过 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)的字典

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)

continue

    contents.update(**{'flag': {'host': self.db_host, 'port': self.db_port, 'type': self.db_type}})
retry_times = 5
while 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)
break
except Exception as e:
agent_logger.error("{error}, retry...".format(error=str(e)))
retry_times -= 1
if not retry_times:
raise
time.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/algorithmalgorithm为时序预测算法部分,其包括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]]警示。

openGauss数据库源码学习-指标采集、预测与异常检测的更多相关文章

  1. ABP框架源码学习之修改默认数据库表前缀或表名称

    ABP框架源码学习之修改默认数据库表前缀或表名称 1,源码 namespace Abp.Zero.EntityFramework { /// <summary> /// Extension ...

  2. Java 源码学习线路————_先JDK工具包集合_再core包,也就是String、StringBuffer等_Java IO类库

    http://www.iteye.com/topic/1113732 原则网址 Java源码初接触 如果你进行过一年左右的开发,喜欢用eclipse的debug功能.好了,你现在就有阅读源码的技术基础 ...

  3. 源码学习之ASP.NET MVC Application Using Entity Framework

    源码学习的重要性,再一次让人信服. ASP.NET MVC Application Using Entity Framework Code First 做MVC已经有段时间了,但看了一些CodePle ...

  4. Dapper源码学习和源码修改

    之前ORM比较火热,自己也搞了个WangSql,但是感觉比较low,大家都说Dapper性能好,所以现在学习学习Dapper,下面简单从宏观层面讲讲我学习的Dapper. 再了解一个东西前,先得学会使 ...

  5. Redis源码学习:字符串

    Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...

  6. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  7. mongo源码学习(三)请求接收传输层

    在上一篇博客中(mongo源码学习(二)db.cpp之mongoDbMain方法分析),我们把db.cpp中的mongoDbMain的执行过程分析了一下,最后会调用initAndListen(serv ...

  8. Vector源码学习

    安全的可增长数组结构 实现: 1. 内部采用数组的方式. 1.1 添加元素,会每次校验容量是否满足, 扩容规则有两种,1.增加扩容补偿的长度,2.按照现有数组长度翻一倍.容量上限是Integer.MA ...

  9. Asp.NetCore源码学习[2-1]:日志

    Asp.NetCore源码学习[2-1]:日志 在一个系统中,日志是不可或缺的部分.对于.net而言有许多成熟的日志框架,包括Log4Net.NLog.Serilog 等等.你可以在系统中直接使用这些 ...

  10. mybatis源码学习(一) 原生mybatis源码学习

    最近这一周,主要在学习mybatis相关的源码,所以记录一下吧,算是一点学习心得 个人觉得,mybatis的源码,大致可以分为两部分,一是原生的mybatis,二是和spring整合之后的mybati ...

随机推荐

  1. 连接微信群、Slack 和 GitHub:社区开放沟通的基础设施搭建

    NebulaGraph 社区如何构建工具让 Slack.WeChat 中宝贵的群聊讨论同步到公共领域. 要开放,不要封闭 在开源社区中,开放的一个重要意义是社区内的沟通.讨论应该是透明.包容并且方便所 ...

  2. 一文详解云上自动化部署集群管理工具 Nebula Operator

    本文首发于 Nebula Graph 公众号:Nebula Operator 开源啦!一文详解这个云上自动化部署集群管理工具 在介绍 Nebula Operator 之前,让我们先来了解下什么是 Op ...

  3. Java 继承成员变量和继承方法的区别

    1 package com.bytezreo.duotai3; 2 3 /** 4 * 5 * @Description 继承成员变量和继承方法的区别 6 * @author Bytezero·zhe ...

  4. GaussDB(DWS)运维利刃:TopSQL工具解析

    本文分享自华为云社区<GaussDB(DWS)运维利刃:TopSQL工具解析>,作者:胡辣汤. 在生产环境中,难免会面临查询语句出现异常中断.阻塞时间长等突发问题,如果没能及时记录信息,事 ...

  5. MySQL8.0与5.7版本的下载、安装与配置

    •软件下载 下载地址 [官网],点开该网址,点击  DOWNLOAD 来到如下页面: MySQL的版本介绍 MySQL Community Server  社区版本:开源免费,自由下载,但不提供官方技 ...

  6. 将MindSpore运行结果输出到log文件

    技术背景 我们在Linux系统下使用一些深度学习框架(如MindSpore)运行脚本的时候,经常会用一些打印输出来判断当前执行的步骤,或者是使用打印输出来定位算法问题.但是在Linux系统下程序输出其 ...

  7. 最小生成树(二)Prim算法

    一.思想 1.1 基本概念 加权无向图的生成树:一棵含有其所有顶点的无环连通子图. 最小生成树(MST):一棵权值最小(树中所有边的权值之和)的生成树. 1.2 算法原理 1.2.1 切分定理 切分定 ...

  8. canvas-screenshot 视频截屏功能,选择视频的一个区域,进行截图

    预览地址:http://pengchenggang.gitee.io/canvas-screenshot/ 参考资料:https://www.canvasapi.cn/ <!DOCTYPE ht ...

  9. 基于泰凌微TLSR825x的数据透传解决方案之源码解析

    一 概念 串口透传也叫透明传输,简称透传.串口透传是一种工作方式,一般出现在串口蓝牙模块中.串口透传蓝牙模块使用极其便利,开发者不需要了解蓝牙协议栈是如何实现的,只需要使用串口蓝牙模块就可以方便地开发 ...

  10. Oracle限制某个帐号只能在特定机器上访问数据库

    CREATE OR REPLACE TRIGGER logon_ip_control AFTER logon ON user_test.schema BEGIN IF USER IN ('user_t ...