開發與維運

SLS新版告警-多數據源協同

前言

阿里雲SLS作為一站式的可觀測性平臺,用戶將日誌數據,時序數據,Trace數據都存儲在SLS;SLS提供統一的查詢分析語言,支持完整的SQL 92語法;SLS新版告警完整支持SLS的查詢分析語法,基於此,可以配置常見的如關鍵詞告警,同環比告警,網址錯誤監控,流量急跌或暴漲監控;在新版告警中,可以對多個數據源進行監控,並且支持多數據源的間的協同監控。支持常見的左聯,右聯,內聯,外聯,左斥,右斥等集合操作,可以使用在比如白名單,黑名單監控場景。

告警監控

image.png

告警監控可以對多個數據源進行監控:通過選擇不同的數據源類型(日誌存儲,時序存儲,資源數據),使用不同的查詢分析語句,可以得到不同的查詢結果,每個查詢結果可以看出一個結果集,對多個結果集之間可以進行集合操作,包括左聯,右聯,全聯,內聯,外聯,左斥,右斥等,也是本文介紹的重點。

在SLS新版告警的查詢統計時,最多可以設置三個查詢,兩個之間可以進行集合操作。

image.png

監控系統對於監控規則中的分組評估和觸發條件都是基於集合操作的結果進行評估,並非針對某一個查詢結果進行評估。

設置單個查詢時,集合操作結果即為單個查詢的結果,可以理解為對查詢結果進行評估。

集合操作類型及其使用場景

SLS集合操作主要包括笛卡爾積,不合並,拼接,左聯,右聯,全聯,左斥,右斥等操作,接下來會對每個集合操作進行簡單的介紹,並介紹其使用場景。

以下的介紹場景皆為兩個操作結果之間的集合操作,當監控中有三個查詢時,會先對前兩個結果進行集合操作,得到的結果在跟第三個結果進行集合操作

笛卡爾積

image.png

笛卡爾積在數學中是一種集合運算,在告警監控中,兩個查詢結果,第一個查詢結果為m條,第二個查詢結果為n條,進行笛卡爾積集合操作後的結果將有m*n條數據;監控規則也將會對這m*n條數據進行分組評估和觸發條件評估。

場景

假設同時對oss訪問日誌和nginx訪問日誌進行監控,每15分鐘統計一次oss的5xx錯誤和slb的5xxx錯誤,當錯誤總數達到1000時進行告警。

如圖,對於兩條查詢可以使用笛卡爾積進行集合操作,然後在觸發條件中,可以對兩個查詢後的結果進行聯合判斷。

image.png

集合操作結果示意圖,藍色表示集合操作後的結果

image.png

不合並

image.png

不合並表示集合操作結果只包含前一個查詢結果,捨棄後一個查詢結果,注意,這裡只是在規則進行評估時捨棄後一個查詢結果,也就是分組評估和觸發條件不會用到後一個查詢結果,但是後一個查詢結果還是可以在內容模板變量中被引用。

場景

監控nginx訪問日誌時,每15分鐘的5xx錯誤次數大於10次時觸發告警,並且在告警內容中列出具體出錯的域名信息;這裡可以把需求分為兩部分,第一部分是評估要用到的條件,5xx錯誤次數大於10,第二部分是告警內容列舉具體錯誤的域名信息;可以將第一部分用錯誤總次數作為查詢條件,第二個查詢使用域名錯誤作為查詢條件。

下面的例子這裡觸發條件設置為nginx_err_cnt > 10,在觸發條件中不可以引用host和err_cnt,因為在評估時不會對後一個查詢結果進行評估。

image.png

如果想要引用第二個查詢結果,可以在內容模板中使用${results[1].raw_results}來引用第二個查詢的結果。

集合操作示意圖,藍色會集合操作結果

image.png

拼接

image.png

拼接是直接將後一個操作結果直接合併到前一個操作結果,按照字段進行對齊,對於重複的數據不進行排重處理。

場景

假設有兩個logstore分別用來存儲北京和上海的nginx訪問日誌,需要對兩地的nginx 5xx同時進行監控,因為兩個logstore的結構一致,直接將兩個5xx的錯誤結果進行拼接,可以實現同時對兩地nginx的錯誤進行監控。

如下例子中,第一個查詢是北京的nginx訪問日誌,第二個查詢是上海的nginx訪問日誌,這裡直接設置觸發條件err_cnt > 10,可以對北京和上海的nginx訪問日誌同時進行監控。

image.png

集合操作示意圖

image.png

內聯

image.png

內聯類似數據庫中的inner join操作,對於兩個查詢結果,會根據連接的字段,找出兩個查詢結果中的公共部分。

場景

比如在oss訪問日誌的監控中,可以對oss訪問的5xx錯誤數進行監控,在資源表中可以存儲bucket對應的環境類型,假如我們只需要對資源表中對應的bucket進行監控,可以使用內聯操作,內聯的條件是第一個結果的bucket等於第二個結果的bucket。

image.png

這裡用到了資源數據,我們可以在告警中心-資源數據中,自定義一個資源數據,可以定義其字段和類型,並且批量添加數據

image.png

集合操作示意圖,藍色表為集合操作結果

image.png

左聯

image.png

左聯類似數據的left join,一般用在前一個查詢結果數據字段不足,用後一個查詢結果來進行補充的場景。

場景

在oss的監控中,把oss的bucket的描述信息存在資源數據中,包括字段bucket和desc;oss的錯誤監控查詢分析結果包含bucket和err_cnt,使用左聯後,連接條件是bucket相同,集合操作結果將包含bucket, err_cnt, desc(如果資源表中沒有出現的bucket,集合操作結果也不會有desc字段)。

image.png

集合操作示意圖,藍色的為集合操作結果。

image.png

注意,上述觸發條件選擇的是會有數據,這裡如果想對藍色結果進行引用可以使用內容模板變量${fire_results},表示所有的滿足觸發條件的結果。

右聯

image.png

右聯為左聯的相反操作,這裡不再贅述,左聯兩個操作結果調換位置,即為右聯。

全聯

image.png

全聯表示集合A和集合B相互補充信息。

場景

比如在OSS 5xx錯誤監控中,在5xx錯誤次數監控的同時,也希望可以看到5xx訪問的uv,可以在配置監控規則時使用全聯操作,連接條件是bucket相同。

image.png

集合操作示意圖:

image.png

左斥

image.png

左斥可以理解為前一個查詢的結果,排除第二個查詢的結果,常用在一種黑名單的操作中,左邊的結果,第二個查詢結果作為黑名單,第一個查詢結果作為評估結果。

場景

比如在OSS 5xx錯誤監控中,某些bucket是測試bucket,並不需要對齊進行監控,這時可以在資源數據中增加bucket黑名單,將測試bucket填進去,使用左斥操作即可實現黑名單效果。

image.png

集合操作示意圖:藍色表示集合操作結果

image.png

右斥

image.png

右斥是左斥的相反操作,在左斥中將兩個操作結果互換位置,即為右斥。

注意事項

  • 時序存儲進行查詢時,使用promql_query(string)、promql_query_range(string, string)函數查詢時,返回的字段包括metric, labels, time, value四個字段,其中labels為map類型,在配置監控規則時,會將labels展開,例如labels值為{"host":"xxxx", "ip": "192.168.1.102"},metric值為cpu_util,則查詢結果字段有metric, labels, time, value, host, ip 六個字段(該規則只適用用監控規則配置時)。
  • 使用查詢分析語句時,單個查詢和分析的結果超過1000條時,只會保留前1000條數據,用於集合操作,當存在三個查詢和分析操作且集合操作未選擇不合並時,只選取每個查詢和分析結果中的前100條數據。
  • 集合操作中,會默認對每個查詢結果的字段加上$x.前綴,比如第一個查詢結果的字段都會加上$0.前綴,第二個查詢結果的字段都會加上$1.前綴, x可以取值0,1,2。以下情況可以在觸發條件和分組評估字段中省略前綴:
    • 第一個查詢的所有字段都可以省略前綴$0.。
    • 只有一個查詢時,可以省略字段前綴$0.。
    • 有兩個查詢時,兩個查詢結果中的字段完全不同時,兩個查詢結果字段分別可以省略前綴$0.和$1.,如果三個查詢中的字段也完全不同,三個查詢結果中的字段可以省略前綴。
    • 有兩個查詢時,兩個查詢結果的字段有重複,且重複字段用於集合操作(左聯,右聯,內聯,外聯,左斥,右斥)的連接字段,且連接運算符是相等時,可以省略字段重複字段名;如果連接運算符不是相等時,第二個查詢結果中的重複字段保留前綴。
    • 當有三個查詢時,會先計算前兩個查詢的集合操作結果,然後拿這個集合操作結果跟第三個查詢進行集合操作,是否去掉前綴按照兩個查詢的方式進行。

參考

  • 多集合操作機制【鏈接
  • 評估表達式語法【鏈接
  • 創建資源數據【鏈接

進一步參考

image

Leave a Reply

Your email address will not be published. Required fields are marked *