夜鷹(Nightingale)ES 日誌告警規則

ES 日誌告警可以通過對日誌進行查詢分析,來及時發現異常日誌,並觸發告警。
首先可以選擇ES數據源,然後配置查詢條件和告警條件,下面針對每個數字指向的功能,進行詳細說明
1 選擇索引
支持多種配置方式
- 指定單個索引 gb 在 gb 索引中搜索所有的文檔
- 指定多個索引 gb,us 在 gb 和 us 索引中搜索所有的文檔
- 指定索引前綴 g*,u* 在任何以 g 或者 u 開頭的索引中搜索所有的文檔
2 設置過濾條件
目前支持的是 query string 語法
可以指定字段名稱進行查詢:
- status:active - 查詢 status 字段包含 active 的記錄
- title:(quick OR brown) - 查詢 title 字段包含 quick 或 brown 的記錄
- author:“John Smith” - 查詢 author 字段包含完整短語 “John Smith” 的記錄
支持使用 ? 和 * 通配符:
- qu?ck - ? 匹配單個字符
- bro* - * 匹配零個或多個字符
使用 ~ 運算符進行模糊匹配:
- quikc~ - 匹配與 quick 相似的詞
- “fox quick”~5 - 短語查詢中的詞之間可以相隔最多5個位置
支持數值和日期範圍:
- count:[1 TO 5] - 閉區間,包含1和5
- date:[2022-01-01 TO 2022-12-31]
- age:>=10 - 大於等於10
可以使用 AND、OR、NOT 等布爾操作符:
- quick AND brown - 同時包含兩個詞
- quick OR brown - 包含其中任意一個詞
- quick NOT fox - 包含 quick 但不包含 fox
詳細的語法可以參考 ES 文檔
3 設置日期字段
點擊可以選擇日誌中的日期字段,通過此字段來作為查詢日誌的時間範圍的依據
4 設置查詢日誌的時間範圍
如果是 5 分鐘,表示在做告警查詢時,會查詢過去 5 分鐘內的日誌
5 數值提取
對日誌進行統計分析的函數,比如 count、sum、avg、min、max 等
6 Group By
對日誌進行分組,比如按照 host 字段進行分組,進行 count 統計, 查詢到的結果會按照 host 字段進行分組
7 告警條件
統計分析得到的數值,會賦值給告警條件中的 A、B、C 等變量,然後根據這些變量進行告警條件判斷,比如 $A > 10 表示日誌數量大於10條時觸發告警
8 高級配置
在有的場景,日誌會出現延遲,如果延遲3分鐘,查詢最近3分鐘的數據,會查不到數據,這時,可以在高級配置中,設置延遲查詢時間,比如延遲180s,表示查詢查詢的時候,把開始時間和終止時間都向前偏移180s
使用範例
示例1:錯誤日誌監控
- 索引:app-logs-*
- 查詢條件:level:ERROR AND service:payment
- 時間範圍:5分鐘
- 數值提取:count()
- 告警條件:$A > 10 說明:監控支付服務在5分鐘內的錯誤日誌數量是否超過10條
示例2:接口響應時間監控
- 索引:nginx-access-*
- 查詢條件:path:"/api/v1/order*" AND response_time:>500
- 時間範圍:10分鐘
- 數值提取:avg(response_time)
- Group By:path
- 告警條件:$A > 1000 說明:監控訂單相關接口的平均響應時間是否超過1秒
示例3:異常狀態碼監控
- 索引:nginx-*
- 查詢條件:status:[500 TO 599]
- 時間範圍:15分鐘
- 數值提取:count()
- Group By:host, status
- 告警條件:$A > 50 說明:按主機和狀態碼分組統計5xx錯誤,如果某台主機的某個狀態碼出現次數超過50次則告警
示例4:業務異常關鍵字監控
- 索引:business-logs-*
- 查詢條件:message:(“timeout” OR “connection refused” OR “out of memory”)
- 時間範圍:30分鐘
- 數值提取:count()
- 告警條件:$A > 5 說明:監控包含特定錯誤關鍵字的日誌數量