openGauss源码解析(176)

openGauss源码解析:AI技术(23)

2. 关键代码段解析

(1) 后台线程的实现。

前面已经介绍过了,本功能可以分为三个角色:Agent、Monitor以及Detector,这三个不同的角色都是常驻后台的进程,各自执行着不同的任务。Daemon类就是负责运行不同业务流程的容器类,下面介绍该类的实现。

class Daemon:

"""

This class implements the function of running a process in the background."""

def __init__(self):

def daemon_process(self):

# 注册退出函数

atexit.register(lambda: os.remove(self.pid_file))

signal.signal(signal.SIGTERM, handle_sigterm)

# 启动进程

@staticmethod

def start(self):

try:

self.daemon_process()

except RuntimeError as msg:

abnormal_exit(msg)

self.function(*self.args, **self.kwargs)

# 停止进程

def stop(self):

if not os.path.exists(self.pid_file):

abnormal_exit("Process not running.")

read_pid = read_pid_file(self.pid_file)

if read_pid > 0:

os.kill(read_pid, signal.SIGTERM)

if read_pid_file(self.pid_file) < 0:

os.remove(self.pid_file)

(2) 数据库相关指标采集过程。

数据库的指标采集架构,参考了Apache Flume的设计。将一个完整的信息采集流程拆分为三个部分,分别是Source、Channel以及Sink。上述三个部分被抽象为三个不同的基类,由此可以派生出不同的采集数据源、缓存管道以及数据的接收端。

前文提到过的DBSource即派生自Source、MemoryChannel派生自Channel,HttpSink则派生自Sink。下面这段代码来自metric_agent.py,负责采集指标,在这里将上述模块串联起来了。

def agent_main():

# 初始化通道管理器

cm = ChannelManager()

# 初始化数据源

source = DBSource()

http_sink = HttpSink(interval=params['sink_timer_interval'], url=url, context=context)

source.channel_manager = cm

http_sink.channel_manager = cm

# 获取参数文件里面的功能函数

for task_name, task_func in get_funcs(metric_task):

source.add_task(name=task_name,

interval=params['source_timer_interval'],

task=task_func,

maxsize=params['channel_capacity'])

source.start()

http_sink.start()

(3) 数据存储与监控部分的实现。

Agent将采集到的指标数据发送到Detector服务器上,并由Detector服务器负责存储。Monitor不断对存储的数据进行检查,以便提前发现异常。

这里实现了一种通过SQLite进行本地化存储的方式,代码位于sqlite_storage.py文件中,实现的类为SQLiteStorage,该类实现的主要方法如下:

# 通过时间戳获取最近一段时间的数据

def select_timeseries_by_timestamp(self, table, period):

# 通过编号获取最近一段时间的数据

def select_timeseries_by_number(self, table, number):

其中,由于不同指标数据是分表存储的,因此上述参数table也代表了不同指标的名称。

异常检测当前主要支持基于时序预测的方法,包括Prophet算法(由Facebook开源的工业级时序预测算法工具)和ARIMA算法,他们分别被封装成类,供Forecaster调用。

上述时序检测的算法类都继承了AlgModel类,该类的结构如下:

class AlgModel(object):

"""

This is the base class for forecasting algorithms.

If we want to use our own forecast algorithm, we should follow some rules.

"""

def __init__(self):

pass

@abstractmethod

def fit(self, timeseries):

pass

@abstractmethod

def forecast(self, period):

pass

def save(self, model_path):

pass

def load(self, model_path):

pass

在Forecast类中,通过调用fit()方法,即可根据历史时序数据进行训练,通过forecast()方法预测未来走势。

获取到未来走势后如何判断是否是异常呢?方法比较多,最简单也是最基础的方法是通过阈值来进行判断,在我们的程序中,默认也是采用该方法进行判断的。

posted @ 2024-05-06 10:35  openGauss-bot  阅读(1)  评论(0编辑  收藏  举报