创建日志阈值规则
要创建日志阈值规则,您需要具备以下条件
此规则会查询 Kibana 高级设置(Advanced Settings)中由 observability:logSources 设置定义的索引模式。默认值为 logs-*-*、logs-* 和 filebeat-*。您无法针对单个规则覆盖这些索引。
条件可用的比较符取决于所选字段。可用的组合包括:
数值字段:more than(大于)、more than or equals(大于或等于)、less than(小于)或 less than or equals(小于或等于)。
可聚合字段:is(等于)或 is not(不等于)。
不可聚合字段:matches(匹配)、does not match(不匹配)、matches phrase(匹配短语)、does not match phrase(不匹配短语)。
- Matches 会查询您输入的值的部分或全部内容,而不管其顺序如何。例如,
WITH message MATCHES your example message会查找包含单词your、example和message的消息,并返回包含其中部分或全部单词的结果。 - Matches phrase 会查询您输入的值的精确内容。例如,
WITH message MATCHES PHRASE your example message会查找短语your example message并返回包含该精确短语的结果。
- Matches 会查询您输入的值的部分或全部内容,而不管其顺序如何。例如,
有几个关键的支持用例。您可以创建基于包含或匹配文本模式的字段的规则、基于数值字段和算术运算符的规则,或者包含多个条件的单个规则。
这些比较符中的每一个都由不同的 Elasticsearch 查询类型支持,在某些情况下,了解这些查询类型对于正确配置规则非常重要。上面列出的比较符映射到以下 Elasticsearch 查询类型:
- more than:使用 gt 的 range
- more than or equals:使用 gte 的 range
- less than:使用 lt 的 range
- less than or equals:使用 lte 的 range
- is 和 is not:term
- matches 和 does not match:match
- matches phrase 和 does not match phrase:match_phrase
可以为日志阈值规则设置 group by(分组依据)。您可以设置一个或多个分组。
设置了 group by 后,将对所选字段执行复合聚合。当这些分组中的任何一个匹配所选规则条件时,将按分组触发警报。
在选择多个分组的情况下,组名用逗号分隔。
例如,如果选择了 host.name 和 host.architecture 作为分组依据字段,并且有两个主机(Host A 和 Host B)以及两种架构(Architecture A 和 Architecture B),复合聚合会形成多个分组。我们将重点关注 Host A, Architecture A 和 Host B, Architecture B 分组。
如果分组 Host A, Architecture A 匹配规则条件,而 Host B, Architecture B 不匹配,则会触发一个警报。
类似地,如果只选择了一个分组依据,例如 host.name,并且 Host A 匹配条件而 Host B 不匹配,则会为 Host A 触发一个警报。如果两个分组都匹配条件,则会触发两个警报。
当选择了分组依据字段,但在触发警报的给定时间范围内没有任何文档包含所选字段时,您将无法确定分组。当规则条件对特定数量的文档敏感(该数字可能为 0)时,这一点尤为相关。例如,当查询某台主机是否有少于五个文档匹配某个条件时,如果该主机在查询期间未报告日志,则不会触发警报。
为了确定有多少日志条目会匹配您配置的每个部分,您可以查看每个条件的图表预览。这对于确定有多少日志条目会匹配配置的各个部分非常有用。设置分组依据后,图表会为每个分组显示一个柱形。要查看预览,请选择条件旁边的箭头。
阴影区域表示已选择的阈值。
要了解一个查询与另一个查询的对比情况,请创建比率规则。当比率值达到特定阈值时,会触发此类规则。比率阈值是第一个查询(查询 A)的文档数除以第二个查询(查询 B)的文档数。
以下示例在错误日志数量是警告日志的两倍时触发警报。
由于不能除以 0,当查询 A 或查询 B 的文档数为 0 时,会导致比率未定义/不确定。在这种情况下,不会触发警报。
通过将规则连接到使用以下支持的内置集成的操作,来扩展您的规则。
- D3 Security
- 电子邮件
- IBM Resilient
- 索引
- Jira
- Microsoft Teams
- 可观测性 AI 助手连接器
- Opsgenie
- PagerDuty
- 服务器日志
- ServiceNow ITOM
- ServiceNow ITSM
- ServiceNow SecOps
- Slack
- Swimlane
- Torq
- Webhook
- xMatters
部分连接器类型是付费商业功能,而其他则是免费的。有关 Elastic 订阅级别的比较,请前往订阅页面。
选择连接器后,必须设置操作频率。您可以选择在每个检查间隔或自定义间隔创建警报摘要。或者,您可以设置操作频率以选择操作运行的频率(例如,在每个检查间隔、仅当警报状态更改时或在自定义操作间隔)。在这种情况下,您还必须选择影响操作运行时间的特定阈值条件:Fired(已触发)或 Recovered(已恢复)。
您还可以通过指定仅当操作符合 KQL 查询或当告警发生在特定时间范围内时才运行操作,来进一步限定操作运行的条件
- If alert matches query(如果告警匹配查询):输入定义字段值对或发送通知必须满足的查询条件的 KQL 查询。该查询仅搜索为该规则指定的索引中的告警文档。
- If alert is generated during timeframe(如果在时间范围内生成告警):设置时间范围详细信息。仅当告警在您定义的时间范围内生成时才会发送通知。
使用默认通知消息或进行自定义。您可以通过点击消息文本框上方的图标并从可用变量列表中进行选择,从而为消息添加更多上下文。
以下变量特定于此规则类型。您还可以指定 所有规则通用的变量。
context.alertDetailsUrl- 链接到警报故障排除视图以获取更多上下文和详细信息。如果未配置
server.publicBaseUrl,则此项将为空字符串。 context.grouping- 包含正在报告数据的组的对象。
context.interval- 满足警报条件的时间段的长度和时间单位。
context.reason- 告警原因的简要说明。
context.serviceName- 为其创建警报的服务。
context.threshold- 高于此值的任何触发值都会导致警报触发。
context.transactionName- 为其创建警报的事务名称。
context.transactionType- 为其创建警报的事务类型。
context.triggerValue- 突破阈值并触发警报的值。
context.viewInAppUrl- 链接到警报源。
设置 group by(分组依据)时,我们建议为阈值使用 more than(大于)比较符——这允许我们的查询应用急切过滤,从而显著提升性能。否则,我们建议使用具有最低基数(可能性数量)的 group by 字段。
执行规则检查时,将根据规则的配置构建查询。在绝大多数情况下,您不需要知道这些查询是什么。但是,为了确定最佳配置或协助调试,查看这些查询的结构可能会很有用。以下是针对以下配置的 Elasticsearch 查询示例:
{
"index":"filebeat-*",
"allowNoIndices":true,
"ignoreUnavailable":true,
"body":{
"track_total_hits":true,
"query":{
"bool":{
"filter":[
{
"range":{
"@timestamp":{
"gte":1600771280862,
"lte":1600774880862,
"format":"epoch_millis"
}
}
},
{
"term":{
"log.level":{
"value":"error"
}
}
}
],
"must_not":[
{
"term":{
"log.file.path":{
"value":"/nginx"
}
}
}
]
}
},
"size":0
}
}
- 取自 Log indices(日志索引)设置
- 取自 Timestamp(时间戳)设置
{
"index":"filebeat-*",
"allowNoIndices":true,
"ignoreUnavailable":true,
"body":{
"query":{
"bool":{
"filter":[
{
"range":{
"@timestamp":{
"gte":1600768208910,
"lte":1600779008910,
"format":"epoch_millis"
}
}
}
]
}
},
"aggregations":{
"groups":{
"composite":{
"size":40,
"sources":[
{
"group-0-host.name":{
"terms":{
"field":"host.name"
}
}
}
]
},
"aggregations":{
"filtered_results":{
"filter":{
"bool":{
"filter":[
{
"range":{
"@timestamp":{
"gte":1600771808910,
"lte":1600775408910,
"format":"epoch_millis"
}
}
},
{
"term":{
"log.level":{
"value":"error"
}
}
}
],
"must_not":[
{
"term":{
"log.file.path":{
"value":"/nginx"
}
}
}
]
}
}
}
}
}
},
"size":0
}
}
- 取自 Log indices(日志索引)设置
- 取自 Timestamp(时间戳)设置
对于日志阈值规则,无法将显式索引模式设置为配置的一部分。索引模式改为从 Log sources(日志来源)高级设置中推断得出。
每次执行规则检查时,都会检查 Log indices(日志索引)设置,但创建规则时不会存储它。
在 Settings(设置)下设置的 Timestamp(时间戳)字段决定了查询中用于时间戳的字段。