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

ES 日誌告警

ES 日誌告警可以通過對日誌進行查詢分析,來及時發現異常日誌,並觸發告警。

首先可以選擇ES數據源,然後配置查詢條件和告警條件,下面針對每個數字指向的功能,進行詳細說明

1 選擇索引

支持多種配置方式

  1. 指定單個索引 gb 在 gb 索引中搜索所有的文檔
  2. 指定多個索引 gb,us 在 gb 和 us 索引中搜索所有的文檔
  3. 指定索引前綴 g*,u* 在任何以 g 或者 u 開頭的索引中搜索所有的文檔

2 設置過濾條件

目前支持的是 query string 語法(Lucene 語法)

基礎查詢語法
語法 說明 示例
字段:值 查詢字段包含指定值的記錄 status:active
字段:(值1 OR 值2) 查詢字段包含任意一個值的記錄 title:(quick OR brown)
字段:"完整短語" 查詢字段包含完整短語的記錄(不分詞) author:"John Smith"
關於分詞的重要說明

Elasticsearch 對 text 類型字段會進行分詞處理,這是最容易踩坑的地方:

什麼是分詞?

  • 當字段類型為 text 時,ES 會將內容拆分成多個詞(token)建立索引
  • 中文分詞器會將「連接超時」拆分為「連接」、「超時」等詞
  • 英文會按空格和標點拆分,「John Smith」會拆分為「john」和「smith」

分詞對查詢的影響:

查詢方式 行為 是否會被分詞
message:連接超時 查詢詞也會被分詞,默認 OR 邏輯匹配 ✅ 會分詞
message:"連接超時" 短語查詢,要求完整短語按順序出現 ❌ 不分詞
message.keyword:連接超時 使用 keyword 子字段,精確匹配 ❌ 不分詞

常見問題:查詢結果中沒有搜索的關鍵字

如果你搜索 message:連接超時,但返回的日誌中並沒有「連接超時」這個詞,原因是:

  1. 查詢詞「連接超時」被分詞成了「連接」、「超時」
  2. ES 默認使用 OR 邏輯,只要文檔包含其中任意一個詞就會返回
  3. 所以只包含「連接」或「超時」的日誌也會被查詢出來

解決方案:

# 方案1:使用引號進行短語查詢(推薦)
message:"連接超時"

# 方案2:使用 AND 強制所有詞都必須存在
message:(連接 AND 超時)

# 方案3:使用 keyword 子字段精確匹配(需索引支持)
message.keyword:*連接超時*

支持使用 ? 和 * 通配符:

  • 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 說明:監控包含特定錯誤關鍵字的日誌數量
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云