夜鷹(Nightingale)VictoriaLogs 日誌告警規則
VictoriaLogs 日誌告警通過 LogsQL 進行日誌統計分析,及時發現異常並觸發告警。
配置說明
查詢統計
查詢條件
在查詢條件輸入框中輸入 LogsQL 統計查詢語句,查詢結果會賦值給變量 $A。
查詢語句格式:<過濾條件> | stats <統計函數>
點擊「數據預覽」按鈕可以查看查詢結果,驗證查詢語句是否正確。
閾值判斷
基於查詢統計的結果設置告警閾值,例如 $A > 10 表示統計值大於 10 時觸發告警。
請確保所有變量均有數據,且它們的標籤一致,否則無法進行閾值判斷。
數據缺失
配置當查詢無數據時的處理策略。
LogsQL 查詢語法
過濾條件
關鍵字查詢
error # 查詢包含 "error" 的日誌
"connection timeout" # 查詢包含完整短語的日誌
字段過濾
_stream:{host="server1"} # 匹配 stream 標籤
level:=error # 精確匹配字段值
level:error # 字段包含某值
status:>=500 # 數值比較
邏輯運算符
error AND timeout # 同時包含
error OR warning # 包含任一
error NOT debug # 排除
通配符和正則
err* # 前綴匹配
/error|warning/i # 正則匹配(i 表示忽略大小寫)
時間過濾
使用 _time 字段篩選時間範圍,這在告警場景中非常常用:
_time:1m # 最近 1 分鐘
_time:5m # 最近 5 分鐘
_time:10m # 最近 10 分鐘
_time:30m # 最近 30 分鐘
_time:1h # 最近 1 小時
_time:1d # 最近 1 天
時間範圍查詢:
_time:[now-5m, now] # 最近 5 分鐘(等同於 _time:5m)
_time:[2024-01-01, 2024-01-02] # 指定日期範圍
_time:["2024-01-01 10:00", "2024-01-01 12:00"] # 指定時間範圍
組合使用示例:
_time:5m AND level:=error # 最近 5 分鐘的錯誤日誌
_time:10m AND status:>=500 # 最近 10 分鐘的 5xx 錯誤
統計管道(stats)
查詢語句必須使用 | stats 管道進行統計,常用統計函數:
| 函數 | 說明 | 示例 |
|---|---|---|
count() |
統計日誌數量 | ` |
count_uniq(field) |
統計字段唯一值數量 | ` |
sum(field) |
求和 | ` |
avg(field) |
平均值 | ` |
min(field) |
最小值 | ` |
max(field) |
最大值 | ` |
分組統計(by)
使用 by (field) 按字段分組,分組後每個分組會獨立產生告警:
error | stats by (host) count() as count
詳細的 LogsQL 語法請參考 VictoriaLogs 官方文檔
使用範例
示例1:錯誤日誌數量監控(5分鐘)
查詢條件:
_time:5m AND level:=error AND _stream:{service="payment"} | stats count() as count
閾值判斷: $A > 10
示例2:按主機分組監控錯誤(5分鐘)
查詢條件:
_time:5m AND level:=error | stats by (host) count() as count
閾值判斷: $A > 50
每個主機獨立告警。
示例3:5xx 狀態碼監控(10分鐘)
查詢條件:
_time:10m AND status:>=500 AND status:<600 | stats count() as count
閾值判斷: $A > 100
示例4:按服務和狀態碼分組統計(10分鐘)
查詢條件:
_time:10m AND status:>=400 | stats by (service, status) count() as count
閾值判斷: $A > 50
示例5:平均響應時間監控(5分鐘)
查詢條件:
_time:5m AND _stream:{app="api-gateway"} | stats avg(response_time) as avg_rt
閾值判斷: $A > 1000
示例6:關鍵字告警(10分鐘)
查詢條件:
_time:10m AND ("timeout" OR "connection refused" OR "out of memory") | stats count() as count
閾值判斷: $A > 5
示例7:正則表達式匹配(5分鐘)
查詢條件:
_time:5m AND /exception|panic|fatal/i AND _stream:{env="production"} | stats by (service) count() as count
閾值判斷: $A > 20
示例8:唯一用戶數監控(30分鐘)
查詢條件:
_time:30m AND level:=error | stats count_uniq(user_id) as affected_users
閾值判斷: $A > 100