一、背景
異常檢測是智能運維系統中的很重要的一環,在雲上針對各個服務時序名額的巡檢成為監控服務品質的重要手段。在雲平台上,系統和服務的名額項太多、時序形态豐富、異常類型難以枚舉,單單的依靠人工規則來做異常發現很達到預期效果;同時,現有的巡檢方法多采用SQL發起機器學習函數的方式,拉取部分資料做模型訓練,輸出結果,在海量的名額資料下反應延遲,成本昂貴,很難充分學習資料的特征而達到很好的效果。
SLS團隊,對現有的機器學習方法改進提升,采用流式學習的方式,将機器學習函數變為智能化的機器學習服務,讓模型在曆史資料流上不斷記憶,充分學習樣本特征,實時回報,更進一步降低使用者的使用門檻。大家隻需發起服務,配置一定的告警門檻值,即可實作對名額資料的實時智能巡檢。
二、實際業務痛點
- 名額太多
- 監控對象太多
- 門檻值參數太多
- ...
在時序監控場景中,使用者往往先确定監控對象,并通過其曆史資料,結合業務經驗,得到不同組的門檻值參數,通過各種手段(同比、環比、連續觸發幾次等)進行監控,往往一個監控對象要設計4~5條監控規則,并配置不同的參數。還有更大的問題,各個參數門檻值無法快速的複用到不同的類似觀測對象中,當觀測對象的規模達到數千,甚至上萬後,傳統的配置效率底下,無法滿足在大規則時序名額資料下的監控需求。流式算法具有天然的優勢可以解決上面的問題,使用者隻需要發起一個機器學習服務,模型自動拉取資料,實時訓練,實時回報(通俗地說:“來一個點,學習一個點,檢測一個點”),在極大的降低成本的同時,實作對每一條線的單獨模組化,單獨分析,單獨模型參數儲存,實作時序異常檢測的“千線千面”。
SQL請求式智能巡檢

服務化流式智能巡檢

我們利用Logtail去采集K8S主控端的秒級名額資料,将資料寫入到SLS中去,利用人工經驗對這份資料的聚合和采樣後,提取出如下8個黃金名額,配置分鐘粒度的流式告警。
觀測名額 | 名額名稱 |
---|---|
系統态CPU使用百分比 | cpu_sys |
CPU空閑時IO請求時間 | cpu_iowait |
使用者态CPU使用百分比 | cpu_user |
記憶體使用情況 | mem_usage |
存儲空間使用情況 | disk_usage |
使用的檔案描述符的個數 | fd |
網絡包重傳數量 | retrans |
系統負載 | load |
三、功能介紹
SLS團隊結合目前國際主流的流式異常檢測算法,包括RRCF、HTM、Skyline等流式算法,Time2Graph等最新時序模組化方法,自研三大流式巡檢功能,提供給大家使用。下面給大家做詳細介紹,具體可以參考
SLS官方文檔流式統計算法異常檢測
流式樹算法異常檢測
流式圖算法異常檢測
三種功能分别采用不同類型的算法,對名額時序進行異常檢測:
- 流式統計算法異常檢測主要采用核密度估計等統計學習算法
- 流式樹算法異常檢測主要采用RRCF等樹(森林)學習算法
- 流式圖算法異常檢測主要采用Time2Graph等圖學習算法
以上三種方法可以針對不同類型的時序異常進行檢測,包括:
時序變點異常

時序折點異

時序周期異常
不同的算法功能對不同的異常類型各有擅長,具體如下表所示:
變點異常 | 折點異常 | 周期異常 | |
---|---|---|---|
流式統計算法異常檢測 | 強 | 中 | 弱 |
流式樹算法異常檢測 | |||
流式圖算法異常檢測 |
大家可以根據自己資料的形态,選擇相應的功能進行時序智能巡檢。有關算法的具體原理可以參考之前的文章,大家也可以去網上查閱相關資料自行閱讀。接下來主要給大家介紹下在SLS中該怎麼使用這些功能。
接下來主要給大家介紹下在SLS中該怎麼使用這些功能。
四、案例實戰
我們以一個K8S叢集的機器名額資料的案例作為例子,描述如何使用SLS機器學習服務進行名額資料的智能巡檢。
4.1 資料導入
我們拉取監控中的機器名額資料,具體的操作步驟可參考:
《在SLS中時序名額資料的巡檢》接入資料後,我們可以得到一個按照固定的頻率寫入SLS中的LogStore的資料,我們可以訂閱這個LogStore的資料,并告知算法該資料的Schema,選擇需要的檢測算法,就可以完成針對資料中的執行個體(比如:通路日志中的域名、機器名額資料中的機器)進行巡檢。
- 以K8S監控資料為例,一個資料寫入的Agent(比如:Python SDK)按照一個固定的頻率(60秒)将200多台機器的多元度名額分别寫入到LogStore中去,如下圖中所展示的:每隔60秒,将每台機器的各種名額,按照[Region, Machine, Index_name, Value]的方式寫入到LogStore中;

- 這裡每條日志的格式為:

這裡,
region
表示一個叢集,
machine
表示一台機器,
index_name
表示一個名額,這裡我們對8種常用的名額進行監控和分析,包括CPU、記憶體、負載、網絡流量等。
value
表示具體的名額數值。
- 我們把要進行分析的字段加上索引,開啟統計:

4.2 參數配置,發起服務
當名額資料接入成功之後,我們可以開啟機器學習服務對時序資料進行智能巡檢
4.2.1 打開資料加工
- 我們開啟 “資料加工”模式,經過如下截圖中的操作步驟
- 來到建立資料加工規則的界面,我們要保證填寫的AK資訊具有對目前LogStore具有可讀且能建立消費組的權限,具體操作,請參考 《RAM自定義授權場景》 ;同時在存儲目标中,目前僅支援寫入到本Project下面,已将建立好的LogStore中,且存儲目标中的AK要具有寫入權限

- 下一步,選擇“加工範圍”,這裡的加工範圍所對應的時間是資料達到伺服器端的時間,接着就到了模型參數配置部分,針對各個參數的含義我們做一個介紹:
- 時間列:表示某條日志的時間戳,機關為秒;一般選擇
這個字段__time__
- 時間粒度:表示資料寫入的頻率,這裡要求資料對象寫入LogStore的頻率一緻。在這個案例裡是60秒
- 執行個體列:表示能唯一标記巡檢對象的字段,要求是text文本列,可多選。這個案例裡是
region
machine
,對應了某地區某機器下的某名額。index_name
- 特征列:表示某巡檢對象所對應的特征,要求為數值列,可多選。這個案例裡是
,即具體的名額數值。value
- 時間列:表示某條日志的時間戳,機關為秒;一般選擇

之後就可以選擇相應的算法功能進行異常檢測。
4.2.2 配置模型

模型參數配置如上圖所示,所有的操作為可視化操作。大家輸入好對應的選項,選擇具體要使用的模型,便可以開啟機器學習服務。不同模型的參數具體參考
官方文檔。
我們以流式圖算法異常檢測作為例子來發起機器學習服務。具體的資料形式
時間列是
__time__
,資料是每隔60s采集一個點,從
region - machine - index_name
唯一确定了一條名額時序(地區-機器-名額),其值是
value
。這裡,如果大家知道所要巡檢資料的上下界,可以直接填入,當資料超出邊界時,會直接判斷為異常;若大家不明确,這裡可以不填。
我們選擇
流式圖算法異常檢測
這個模型,這裡有三個參數需要我們填寫:時間粒度是60秒,算法檢測間隔與時間粒度一緻,即來一個點檢測一個點。流式圖算法異常檢測采用Time2Graph算法,數值預設劃分為5段。這裡,分成多少段大家可以根據自己的巡檢需求來進行設定,一般,分段越少,模型對異常越不敏感,報出的異常點就越少;分段越多反之。周期長度預設長度2880個點,即在60秒采集一個點的情況下,周期長度為48小時;大家如果知道資料明确的周期長度,可以更改。
其他模型的參數配置基本類似,大家可以參考
。以上,參數配置好後,我們便可以發起機器學習服務,對名額資料進行巡檢。那麼,我們如何看到巡檢的結果呢,接下來我們将以SLS的Dashbord功能為例,幫助大家直覺的看到模型巡檢的結果。
4.3 Join結果,DashBoard可視化
當服務發起後,沒過一個檢測間隔,算法便會将結果寫入到大家制定的存儲目标下,如下面的例子:
結果的
__time__
與來源名額資料的
__time__
保持一緻。寫出結果中,包含了能訓示一條時序的
entity
資訊,資料來源的
meta
資訊,以及模型判斷的
result
資訊。
result
中包含了模型判斷的是否異常的flag
is_anomaly
,是以
score
大于一定門檻值篩選出的異常點。
之後,通過 Join 名額資料的LogStore與結果輸出的 LogStore,我們可以将異常結果打标到時序曲線中。首先我們開啟結果輸出的LogStore的索引:

SQL join 的案例如下:
- 過濾出某地區某機器的某名額異常檢測結果(這裡目标寫入的LogStore為
)ml-detector-res
* | select time, score, index_name, machine, region from
(select time, cast(score as double) as score, index_name, machine, region from(
(select __time__ as time,
json_extract_scalar(result, '$.score') as score,
json_extract_scalar(entity, '$.index_name') as index_name,
json_extract_scalar(entity, '$.machine') as machine,
json_extract_scalar(entity, '$.region') as region,
job_name from ml-detector-res)
HAVING score > 0.75) where region = 'aysls-pub-cn-beijing-k8s' and
machine = '192.168.***.***:***' and
index_name = 'mem_usage'
這裡,0.75是一個異常分數門檻值,代表着模型判斷出的異常程度,大家可以自行設定
- 在原名額資料LogStore中過濾出對應的時序資料
SELECT __time__ - __time__ % 60 AS time, AVG(value) AS value
FROM log
GROUP BY time
注意,這裡避免有重複資料,我們對時序資料按時間做一次聚合。這裡資料的時間間隔是60s一個點,大家可以根據自己的資料格式自己定義。
- 有了異常結果打标與時序資料,我們可以通過join 将異常結果整合到時序中,進而幫助大家看到模型的判斷。具體的案例如下:
region: "aysls-pub-cn-beijing-k8s" and
machine: "192.168.***.***:***" and index_name: "mem_usage" |
select time, value,
case when score is null then 0 else score end as score,
case when score is null then 0 else 1 end as label from
(select A.time, A.value, B.score, 1 as label from
((select __time__ - __time__ % 60 as time, avg(value) as value from log
group by time ) as A left join
(select time, cast(score as double) as score,
index_name, machine, region from
(select __time__ as time,
json_extract_scalar(result, '$.score') as score,
json_extract_scalar(entity, '$.index_name') as index_name,
json_extract_scalar(entity, '$.machine') as machine,
json_extract_scalar(entity, '$.region') as region,
job_name from ml-detector-res)
HAVING score > 0.75) where region = 'aysls-pub-cn-beijing-k8s' and
machine = '192.168.***.***:***' and
index_name = 'mem_usage') as B
on A.time = B.time)
) order by time limit 100000
執行以上SQL,可以得到如下表格:

點選線圖,進行配置,就可以得到有異常标注的時序曲線:

選擇X軸和Y軸,以Label作為資訊配置散點列及散點大小:

之後我們就可以得到有模型異常标注的時序曲線了。
對于海量的機器,及其名額,我們可以在DashBoard中配置一些過濾器(Filter)以及互動行為,進而更友善的檢視模型智能巡檢的結果:
- 選擇SQL中要替換的内容,生成對應的變量
SLS機器學習服務最佳實踐:流式智能巡檢 SLS機器學習服務最佳實踐:流式智能巡檢 - 通過 SQL 找出可選的執行個體,比如可選的叢集、機器、名額等資訊,配置互動行為
SLS機器學習服務最佳實踐:流式智能巡檢 - 配置過濾器,使用者自動調節異常分數,實作使用者自己所需要的不同敏感程度的異常檢測
SLS機器學習服務最佳實踐:流式智能巡檢
通過上述配置,我們最終可以得到針對k8s叢集的智能巡檢分析報表

4.4 配置告警,實時巡檢
使用者在得到巡檢報告報表之後,可以檢視模型輸出的異常檢測結果。使用者可以根據自己的告警需求,設定告警門檻值,進而得到智能化的告警通知。具體的告警配置請見:
https://help.aliyun.com/document_detail/98379.html?spm=5176.2020520112.0.0.e5e034c0Hizt6q聯系我們
糾錯或者幫助文檔以及最佳實踐貢獻,請聯系:笃林
問題咨詢請加釘釘群: