VictoriaLogs 查询

夜莺( 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() 统计日志数量 stats count() as total
count_uniq(field) 统计字段唯一值数量 stats count_uniq(user_id) as users
sum(field) 求和 stats sum(bytes) as total_bytes
avg(field) 平均值 stats avg(response_time) as avg_rt
min(field) 最小值 stats min(latency) as min_latency
max(field) 最大值 stats max(latency) as max_latency

分组统计(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

更新时间 2025-03-13

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