夜鷹(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

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云