创建 Elasticsearch 查询规则
需要 Editor 角色或更高权限才能创建 Elasticsearch 查询规则。要了解更多信息,请参阅 分配用户角色和权限。
Elasticsearch 查询规则类型运行用户配置的查询,将匹配数与配置的阈值进行比较,并在满足阈值条件时安排操作运行。
- 要访问此页面,请从您的项目中转到警报。
- 单击管理规则 → 创建规则。
- 在选择规则类型下,选择 Elasticsearch 查询。
可以使用 Elasticsearch 查询领域特定语言 (DSL)、Elasticsearch 查询语言 (ES|QL)、Kibana 查询语言 (KQL) 或 Lucene 定义 Elasticsearch 查询规则。
创建 Elasticsearch 查询规则时,您选择的查询类型会影响您必须提供的信息。 例如

定义您的查询
如果您使用 查询 DSL,则必须选择索引和时间字段,然后提供您的查询。 仅使用 `query`、`fields`、`_source` 和 `runtime_mappings` 字段,不考虑其他 DSL 字段。 例如
{ "query":{ "match_all" : {} } }
如果您使用 KQL 或 Lucene,则必须指定数据视图,然后定义基于文本的查询。 例如,`http.request.referrer: "https://example.com"`。
如果您使用 ES|QL,您必须提供源命令,后跟一系列可选的处理命令,并用管道字符 (|) 分隔。 例如
FROM kibana_sample_data_logs | STATS total_bytes = SUM(bytes) BY host | WHERE total_bytes > 200000 | SORT total_bytes DESC | LIMIT 10
如果您使用查询 DSL、KQL 或 Lucene,请设置组和阈值。
- 何时
- 指定如何计算与阈值比较的值。 该值是通过聚合时间窗口内的数字字段来计算的。 聚合选项包括:`count`、`average`、`sum`、`min` 和 `max`。 使用 `count` 时,将使用文档计数,并且不需要聚合字段。
- 覆盖或分组覆盖
- 指定是将聚合应用于所有文档,还是使用最多四个分组字段拆分为组。 如果选择使用分组,则它是 terms 或 multi terms aggregation;当满足条件时,将为每组唯一值创建一个警报。 为了限制高基数字段上的警报数量,您必须指定要针对阈值检查的组数。 仅检查顶部组。
- 阈值
-
定义一个阈值和一个比较运算符(`高于`、`高于或等于`、`低于`、`低于或等于` 或 `介于`)。 将聚合计算的值与此阈值进行比较。
设置时间窗口,该窗口定义搜索文档的追溯范围。
如果您使用查询 DSL、KQL 或 Lucene,请设置满足阈值条件时要发送到配置的操作的文档数量。
如果您使用查询 DSL、KQL 或 Lucene,请选择是否通过排除上一次运行中的匹配项来避免警报重复。 当您使用分组字段时,此选项不可用。
设置检查间隔,该间隔定义评估规则条件的频率。 通常,此值应设置为小于时间窗口的值,以避免检测中的间隙。
使用测试查询功能来验证您的查询是否有效。
如果您使用查询 DSL、KQL 或 Lucene,则查询会针对使用配置的时间窗口选择的索引运行。 将显示与查询匹配的文档数量。 例如

如果您使用 ES|QL 查询,则会显示一个表。 例如

如果查询无效,则会发生错误。
您可以选择在满足规则条件时以及不再满足规则条件时发送通知。 特别是,此规则类型支持
- 警报摘要
- 在查询匹配时运行的操作
- 在不再满足规则条件时运行的恢复操作
对于每个操作,您必须选择一个连接器,该连接器提供服务或第三方集成商的连接信息。
连接器类型
连接器提供了一个中心位置来存储服务和与第三方系统集成的连接信息。 在定义警报规则的操作时,以下连接器可用
- 案例
- D3 安全
- 电子邮件
- IBM Resilient
- 索引
- Jira
- Microsoft Teams
- 可观察性 AI 助手
- Opsgenie
- PagerDuty
- 服务器日志
- ServiceNow ITOM
- ServiceNow ITSM
- ServiceNow SecOps
- Slack
- Swimlane
- Torq
- Webhook
- xMatters
某些连接器类型是付费商业功能,而另一些则是免费的。 有关 Elastic 订阅级别的比较,请转到订阅页面。
有关创建连接器的更多信息,请参阅 连接器。
操作频率
操作变量
使用默认通知消息或对其进行自定义。 您可以通过单击添加变量图标 并从可用变量列表中进行选择,向消息添加更多上下文。

以下变量是此规则类型特有的。您还可以指定所有规则通用的变量。
context.conditions
- 描述阈值条件的字符串。例如:
count 大于 4
。 context.date
- 规则满足条件的日期,采用 ISO 格式。例如:
2022-02-03T20:29:27.732Z
。 context.hits
-
与查询匹配的最新文档。使用 Mustache 模板数组语法,您可以迭代这些命中项,以从 Elasticsearch 文档中获取值到您的操作中。
例如,电子邮件连接器操作中的消息可能包含
Elasticsearch query rule '{{rule.name}}' is active: {{#context.hits}} Document with {{_id}} and hostname {{_source.host.name}} has {{_source.system.memory.actual.free}} bytes of memory free {{/context.hits}}
context.hits
返回的文档包括_source
字段。 如果 Elasticsearch 查询搜索 API 的fields
参数被使用, 文档也会返回fields
字段, 该字段可用于访问由runtime_mappings
参数定义的任何运行时字段。 例如{{#context.hits}} timestamp: {{_source.@timestamp}} day of the week: {{fields.day_of_week}} {{/context.hits}}
- 这里的
fields
参数用于访问day_of_week
运行时字段。
由于
fields
响应始终为每个字段返回一个值数组,因此使用 Mustache 模板数组语法来迭代您操作中的这些值。 例如{{#context.hits}} Labels: {{#fields.labels}} - {{.}} {{/fields.labels}} {{/context.hits}}
- 这里的
context.link
- 链接到 Discover 并显示触发警报的记录。
context.message
- 警报的消息。例如:
rule 'my es-query' is active:
- Value: 2
- Conditions Met: Number of matching documents is greater than 1 over 5m
- Timestamp: 2022-02-03T20:29:27.732Z
context.title
- 警报的标题。例如:
rule term match alert query matched
。 context.value
-
满足阈值条件的值。
默认情况下,排除先前运行的匹配项已开启,并且该规则会检查多次运行中文档匹配项的重复情况。如果您配置的规则的计划间隔小于时间窗口,并且一个文档在多次运行中与查询匹配,则只会收到一次警报。
该规则使用匹配项的时间戳来避免多次对同一匹配项发出警报。当规则运行时,最新匹配项的时间戳用于评估规则条件。仅考虑先前运行的最新时间戳和当前运行之间的匹配项。
假设您已配置规则每分钟运行一次。该规则使用 1 小时的时间窗口,并检查查询是否有超过 99 个匹配项。Elasticsearch 查询规则类型执行以下操作
运行 1 (0:00) |
规则在过去一小时内找到 113 个匹配项:113 > 99 |
规则处于活动状态,并向用户发出警报。 |
运行 2 (0:01) |
规则在过去一小时内找到 127 个匹配项。其中 105 个匹配项是之前已发出警报的重复项,因此您实际上有 22 个匹配项:22 !> 99 |
无警报。 |
运行 3 (0:02) |
规则在过去一小时内找到 159 个匹配项。其中 88 个匹配项是之前已发出警报的重复项,因此您实际上有 71 个匹配项:71 !> 99 |
无警报。 |
运行 4 (0:03) |
规则在过去一小时内找到 190 个匹配项。其中 71 个匹配项是之前已发出警报的重复项,因此您实际上有 119 个匹配项:119 > 99 |
规则处于活动状态,并向用户发出警报。 |