概述
????趨勢預測功能模塊主要實現基于歷史時序數據預測未來時序變化趨勢。該模塊框架解耦,可以實現不同預測算法的靈活替換,并且該模塊功能可以實現不同特征時序的算法自動選擇,支持線性特征時序預測LR回歸算法和非線性特征預測ARIMA算法。目前該模塊可以覆蓋線性時序、非線性時序和周期時序的準確預測。
????dbmind的趨勢預測模塊是一個作為監控服務中的一個定時任務定時執行的。
??模塊數據流圖:

參數配置和建表
??它的主要參數配置是在misc/dbmind.config中:

??TSDB:prometheus時序數據庫的連接配置
??METADATABASE:保存預測結果的元數據庫的配置,支持sqlite,mogdb/opengauss,postgresql。
??forecasting_future_time:時序預測的長度,同時也是預測功能調度周期
??golden_kpi:待時序預測進行預測的關鍵指標項
保存數據庫預測結果的數據庫表結構(metadatabase/schema/forecasting_metrics.py)如下(需要在數據庫中創建該表):

??1:表名? ? ? 2:字段名? ? ?3:索引
在misc/metric_value_range.conf配置文件中對指標的值進行過濾,限制值范圍:

定時任務調用代碼
模塊的調用入口在:app/timed_app.py中:

??1:定時任務多久啟動一次。它是由dbmind.conf配置文件中的forecasting_future_time(秒)參數轉換為分鐘而來的,定位任務的單位是秒,所以乘60
??2:需要的歷史訓練數據的長度。
??3:首先通過從數據訪問接口層DAI獲取prometheus采集的指定指標的數據,第一個參數是指標名稱,第二個是需要的距離當前時間多久的歷史數據,第三個指標是對采集的數據做時間上的聚合。300就是沒隔300秒采集一次(自己重構的方法,源代碼中該方法沒有該參數,prometheus采集間隔短)
??4:并發執行時序預測。quickly_forecast_wrapper是封裝時序預測的一個方法,下面會詳細介紹。
??5:預測后結果數據存儲到源數據庫中。
app/timed_app.py中quickly_forecast_wrapper函數解析:

??1:quickly_forecast是趨勢預測的核心方法
??2:得到metric_value_range.conf中的值范圍
??3:值范圍過濾
算法核心代碼
核心預測方法在tools /common /algorithm /forecasting /forcasting_algorithm.py中:

??1:預測步長:預測的時長除以采集的間隔
??2:對原始數據做插值填補缺失值
??3:時序分解
??4:找到合適的算法并返回模型
??5:對趨勢分量進行訓練和預測
??6:合并時序,得到最終的預測結果
詳細來看一下第3步的時序分解:

??1:判斷是否是周期性數據,ACF+波峰+人為設定的峰的閾值來判斷是否是周期數據。(效果不會很一般,有很大的改進空間,可以參考一下auto periods 和阿里的robust periods,再加入先驗的搜索空間,比如小時、天、星期、月等)
??2:時序分解,用的STL分解。
??3:如果數據是非周期數據,直接把原始數據當做趨勢分量建模
詳細來看一下第4步的建模部分:

??1:評估模型適合用什么模型(下面會詳細介紹怎么評估)
??2:根據上面選出來的algorithm_name選擇線性回歸或ARIMA建模
??上面的estimate_order_of_model_parameters()如何選擇模型?

??1:默認選擇線性回歸模
??2:網格調參尋找ARIMA模型最佳的最優參數組合
??3: BIC評估是否是ARIMA的最優參數p和q
????以上就是趨勢預測模塊的核心代碼的詳細介紹,后續會更新dbmind的慢SQL根因定位和基于MCTS的索引推薦。




