夜莺-Nightingale
夜莺V7
项目介绍 功能概览
部署升级 部署升级
数据接入 数据接入
告警管理 告警管理
数据查看 数据查看
功能介绍 功能介绍
数据库表结构 数据库表结构
API FAQ
夜莺V6
项目介绍 架构介绍
快速开始 快速开始
黄埔营
安装部署 安装部署
升级
采集器 采集器
使用手册 使用手册
API API
数据库表结构 数据库表结构
FAQ FAQ
开源生态
Prometheus
版权声明
第1章:天降奇兵 第1章:天降奇兵
第2章:探索PromQL 第2章:探索PromQL
第3章:Prometheus告警处理 第3章:Prometheus告警处理
第4章:Exporter详解 第4章:Exporter详解
第5章:数据与可视化 第5章:数据与可视化
第6章:集群与高可用 第6章:集群与高可用
第7章:Prometheus服务发现 第7章:Prometheus服务发现
第8章:监控Kubernetes 第8章:监控Kubernetes
第9章:Prometheus Operator 第9章:Prometheus Operator
参考资料

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 说明:监控包含特定错误关键字的日志数量
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
开源项目