天天看點

SLS機器學習服務最佳實踐:流式智能巡檢

一、背景

異常檢測是智能運維系統中的很重要的一環,在雲上針對各個服務時序名額的巡檢成為監控服務品質的重要手段。在雲平台上,系統和服務的名額項太多、時序形态豐富、異常類型難以枚舉,單單的依靠人工規則來做異常發現很達到預期效果;同時,現有的巡檢方法多采用SQL發起機器學習函數的方式,拉取部分資料做模型訓練,輸出結果,在海量的名額資料下反應延遲,成本昂貴,很難充分學習資料的特征而達到很好的效果。

SLS團隊,對現有的機器學習方法改進提升,采用流式學習的方式,将機器學習函數變為智能化的機器學習服務,讓模型在曆史資料流上不斷記憶,充分學習樣本特征,實時回報,更進一步降低使用者的使用門檻。大家隻需發起服務,配置一定的告警門檻值,即可實作對名額資料的實時智能巡檢。

二、實際業務痛點

  • 名額太多
  • 監控對象太多
  • 門檻值參數太多
  • ...

在時序監控場景中,使用者往往先确定監控對象,并通過其曆史資料,結合業務經驗,得到不同組的門檻值參數,通過各種手段(同比、環比、連續觸發幾次等)進行監控,往往一個監控對象要設計4~5條監控規則,并配置不同的參數。還有更大的問題,各個參數門檻值無法快速的複用到不同的類似觀測對象中,當觀測對象的規模達到數千,甚至上萬後,傳統的配置效率底下,無法滿足在大規則時序名額資料下的監控需求。流式算法具有天然的優勢可以解決上面的問題,使用者隻需要發起一個機器學習服務,模型自動拉取資料,實時訓練,實時回報(通俗地說:“來一個點,學習一個點,檢測一個點”),在極大的降低成本的同時,實作對每一條線的單獨模組化,單獨分析,單獨模型參數儲存,實作時序異常檢測的“千線千面”。

SQL請求式智能巡檢

SLS機器學習服務最佳實踐:流式智能巡檢

服務化流式智能巡檢

SLS機器學習服務最佳實踐:流式智能巡檢

我們利用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官方文檔
流式統計算法異常檢測
流式樹算法異常檢測
流式圖算法異常檢測           

三種功能分别采用不同類型的算法,對名額時序進行異常檢測:

  1. 流式統計算法異常檢測主要采用核密度估計等統計學習算法
  2. 流式樹算法異常檢測主要采用RRCF等樹(森林)學習算法
  3. 流式圖算法異常檢測主要采用Time2Graph等圖學習算法

以上三種方法可以針對不同類型的時序異常進行檢測,包括:

時序變點異常

SLS機器學習服務最佳實踐:流式智能巡檢

時序折點異

SLS機器學習服務最佳實踐:流式智能巡檢

時序周期異常

SLS機器學習服務最佳實踐:流式智能巡檢

不同的算法功能對不同的異常類型各有擅長,具體如下表所示:

變點異常 折點異常 周期異常
流式統計算法異常檢測
流式樹算法異常檢測
流式圖算法異常檢測

大家可以根據自己資料的形态,選擇相應的功能進行時序智能巡檢。有關算法的具體原理可以參考之前的文章,大家也可以去網上查閱相關資料自行閱讀。接下來主要給大家介紹下在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中;
SLS機器學習服務最佳實踐:流式智能巡檢
  • 這裡每條日志的格式為:
SLS機器學習服務最佳實踐:流式智能巡檢

這裡,

region

 表示一個叢集,

machine

 表示一台機器,

index_name

 表示一個名額,這裡我們對8種常用的名額進行監控和分析,包括CPU、記憶體、負載、網絡流量等。

value

 表示具體的名額數值。

  • 我們把要進行分析的字段加上索引,開啟統計:
SLS機器學習服務最佳實踐:流式智能巡檢

4.2 參數配置,發起服務

當名額資料接入成功之後,我們可以開啟機器學習服務對時序資料進行智能巡檢

4.2.1 打開資料加工

  • 我們開啟 “資料加工”模式,經過如下截圖中的操作步驟
SLS機器學習服務最佳實踐:流式智能巡檢
  • 來到建立資料加工規則的界面,我們要保證填寫的AK資訊具有對目前LogStore具有可讀且能建立消費組的權限,具體操作,請參考 《RAM自定義授權場景》 ;同時在存儲目标中,目前僅支援寫入到本Project下面,已将建立好的LogStore中,且存儲目标中的AK要具有寫入權限
SLS機器學習服務最佳實踐:流式智能巡檢
  • 下一步,選擇“加工範圍”,這裡的加工範圍所對應的時間是資料達到伺服器端的時間,接着就到了模型參數配置部分,針對各個參數的含義我們做一個介紹:
    • 時間列:表示某條日志的時間戳,機關為秒;一般選擇

      __time__

       這個字段
    • 時間粒度:表示資料寫入的頻率,這裡要求資料對象寫入LogStore的頻率一緻。在這個案例裡是60秒
    • 執行個體列:表示能唯一标記巡檢對象的字段,要求是text文本列,可多選。這個案例裡是

      region

      machine

      index_name

       ,對應了某地區某機器下的某名額。
    • 特征列:表示某巡檢對象所對應的特征,要求為數值列,可多選。這個案例裡是

      value

       ,即具體的名額數值。
SLS機器學習服務最佳實踐:流式智能巡檢

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

4.2.2 配置模型

SLS機器學習服務最佳實踐:流式智能巡檢

模型參數配置如上圖所示,所有的操作為可視化操作。大家輸入好對應的選項,選擇具體要使用的模型,便可以開啟機器學習服務。不同模型的參數具體參考

官方文檔

我們以流式圖算法異常檢測作為例子來發起機器學習服務。具體的資料形式

SLS機器學習服務最佳實踐:流式智能巡檢

時間列是

__time__

 ,資料是每隔60s采集一個點,從

region - machine - index_name

 唯一确定了一條名額時序(地區-機器-名額),其值是

value

 。這裡,如果大家知道所要巡檢資料的上下界,可以直接填入,當資料超出邊界時,會直接判斷為異常;若大家不明确,這裡可以不填。

我們選擇

流式圖算法異常檢測

 這個模型,這裡有三個參數需要我們填寫:時間粒度是60秒,算法檢測間隔與時間粒度一緻,即來一個點檢測一個點。流式圖算法異常檢測采用Time2Graph算法,數值預設劃分為5段。這裡,分成多少段大家可以根據自己的巡檢需求來進行設定,一般,分段越少,模型對異常越不敏感,報出的異常點就越少;分段越多反之。周期長度預設長度2880個點,即在60秒采集一個點的情況下,周期長度為48小時;大家如果知道資料明确的周期長度,可以更改。

其他模型的參數配置基本類似,大家可以參考

。以上,參數配置好後,我們便可以發起機器學習服務,對名額資料進行巡檢。那麼,我們如何看到巡檢的結果呢,接下來我們将以SLS的Dashbord功能為例,幫助大家直覺的看到模型巡檢的結果。

4.3 Join結果,DashBoard可視化

當服務發起後,沒過一個檢測間隔,算法便會将結果寫入到大家制定的存儲目标下,如下面的例子:

SLS機器學習服務最佳實踐:流式智能巡檢

結果的

__time__

 與來源名額資料的

__time__

 保持一緻。寫出結果中,包含了能訓示一條時序的

entity

 資訊,資料來源的

meta

 資訊,以及模型判斷的

result

 資訊。

result

 中包含了模型判斷的是否異常的flag

is_anomaly

 ,是以

score

 大于一定門檻值篩選出的異常點。

之後,通過 Join 名額資料的LogStore與結果輸出的 LogStore,我們可以将異常結果打标到時序曲線中。首先我們開啟結果輸出的LogStore的索引:

SLS機器學習服務最佳實踐:流式智能巡檢

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,可以得到如下表格:

SLS機器學習服務最佳實踐:流式智能巡檢

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

SLS機器學習服務最佳實踐:流式智能巡檢

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

SLS機器學習服務最佳實踐:流式智能巡檢

之後我們就可以得到有模型異常标注的時序曲線了。

對于海量的機器,及其名額,我們可以在DashBoard中配置一些過濾器(Filter)以及互動行為,進而更友善的檢視模型智能巡檢的結果:

  1. 選擇SQL中要替換的内容,生成對應的變量
    SLS機器學習服務最佳實踐:流式智能巡檢
    SLS機器學習服務最佳實踐:流式智能巡檢
  2. 通過 SQL 找出可選的執行個體,比如可選的叢集、機器、名額等資訊,配置互動行為
    SLS機器學習服務最佳實踐:流式智能巡檢
  3. 配置過濾器,使用者自動調節異常分數,實作使用者自己所需要的不同敏感程度的異常檢測
    SLS機器學習服務最佳實踐:流式智能巡檢

通過上述配置,我們最終可以得到針對k8s叢集的智能巡檢分析報表

SLS機器學習服務最佳實踐:流式智能巡檢

4.4 配置告警,實時巡檢

使用者在得到巡檢報告報表之後,可以檢視模型輸出的異常檢測結果。使用者可以根據自己的告警需求,設定告警門檻值,進而得到智能化的告警通知。具體的告警配置請見:

https://help.aliyun.com/document_detail/98379.html?spm=5176.2020520112.0.0.e5e034c0Hizt6q

聯系我們

糾錯或者幫助文檔以及最佳實踐貢獻,請聯系:笃林

問題咨詢請加釘釘群:

SLS機器學習服務最佳實踐:流式智能巡檢

繼續閱讀