跳过编写告警规则:NGINX OTel 集成中内置 6 个现成的 ES|QL 模板

作者:来自 Elastic Jeffrey Rengifo

Elastic 集成提供告警规则模板,每个模板都是一个已经设置阈值的 ES|QL 查询。你可以在几分钟内创建 Elasticsearch 告警规则,根据你的流量进行调整,并提前发现无声的数据流。

NGINX OpenTelemetry Assets 集成提供 6 个告警规则模板。每个模板都是一个已经调优阈值的 ES|QL 查询。安装该集成后,你可以从其中一个模板创建规则,并调整阈值以匹配你的流量。这样,你可以在几分钟内获得可用的告警,而无需从头编写规则。本教程涵盖完整设置、阈值调优,以及如何使用空闲数据流规则来发现停止发送数据的服务。

Elastic 集成告警规则模板的前提条件

Elastic Stack 9.4.0 或更高版本

告警规则模板从 9.2.1 开始提供,位于集成 Assets 标签页下。本文介绍了三个需要 9.4.0 的功能:专用的 Alerting 标签页、空闲数据流规则,以及处于技术预览阶段的 NGINX OpenTelemetry Assets 软件包。

步骤 1:使用 OpenTelemetry 将 NGINX 日志和指标发送到 Elasticsearch

首先,将 NGINX 指标和日志发送到 Elasticsearch。

启用 NGINX stub_status 模块,并确保采集器可以读取访问日志和错误日志。然后,配置 EDOT 或上游 OpenTelemetry Collector,使用 nginx 和 filelog 接收器,将指标和日志导出到 Elasticsearch。

集成设置中包含完整的接收器和管道配置。

如果你想复现此示例,可以使用配套代码仓库

两 类 信号对于告警都很重要,并且每组模板读取不同的数据流:

  • 基于日志的模板(4xx 和 5xx 错误率、错误日志峰值)查询 logs-nginx.access.otel-* 和 logs-nginx.error.otel-*,这些数据流来自 filelog 接收器。
  • 基于指标的模板(活动连接数、丢弃连接数)查询 metrics-nginxreceiver.otel-*,这些数据流来自 nginx 接收器。

这里很容易出错:Fleet Nginx(OpenTelemetry)输入软件包只收集 stub_status 指标。它对应的日志集成是经典 Nginx 集成,该集成写入基于 ECS 的 nginx.access 和 nginx.error 数据集,而不是日志模板所查询的 .otel- 数据流。如果你只依赖这一组合,基于日志的规则将没有任何数据可评估,并且会静默地永远不会触发。请同时运行 filelog 接收器,而不仅仅是 nginx 接收器。

步骤 2:安装 NGINX OpenTelemetry Assets 集成

NGINX OpenTelemetry Assets 是一个仅包含内容的软件包。它提供仪表板、告警规则模板和 SLO 模板,但自身不会采集数据。数据来自你在步骤 1 中设置的采集器。

你无需手动安装它。当步骤 1 中的 NGINX OTel 数据开始到达后,Elastic 会检测到这些数据,并自动为你安装 Assets 软件包,这通常需要一到两分钟。在管理 > 集成 > 已安装集成中确认,那里应该会显示 NGINX OpenTelemetry Assets。

步骤 3:根据规则模板创建 Elasticsearch 告警规则

打开该集成并选择 Alerting 标签页。

该软件包提供 6 个模板:高 4xx 和 5xx 错误率、高活动连接数、错误日志峰值、丢弃连接数,以及一个通用的"按服务统计的高错误率"模板。该通用模板指向一个占位符索引 logs-myservicereceiver.otel-*,你可以重新指定目标索引并重命名。

其中 5 个 NGINX 规则每分钟运行一次 ES|QL,并根据 host.name 对结果进行分组,因此告警会指出出现问题的主机。通用模板则根据 service.name 进行分组,因为它的设计目标是重新指定到你选择的任意服务。

选择一个模板,例如 [Nginx OTel] High 5xx error rate。Kibana 会打开一个预填充的基于 Elasticsearch 查询规则的创建规则表单。它会按照计划运行模板中的 ES|QL,并在查询返回结果行时触发告警。

查询如下:

scss 复制代码
`

1.  FROM logs-nginx.access.otel-*
2.  // Flag each access log entry as a server error (5xx) or not
3.  | EVAL is_5xx = CASE(http.response.status_code >= 500, 1, 0)
4.  // Aggregate total requests and 5xx count per NGINX host
5.  | STATS total = COUNT(*), errors_5xx = SUM(is_5xx) BY host.name
6.  // Minimum sample size to avoid noisy low-traffic hosts
7.  | WHERE total > 50
8.  // Calculate 5xx error rate as a percentage
9.  | EVAL error_rate_pct = ROUND(TO_DOUBLE(errors_5xx) / TO_DOUBLE(total) * 100.0, 2)
10.  // Alert threshold: adjust to tune sensitivity
11.  | WHERE error_rate_pct > 5.0
12.  | SORT error_rate_pct DESC
13.  | LIMIT 10

`AI写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

它会统计每个主机的请求数量和 5xx 响应数量,保留具有足够流量的重要主机,并返回错误率超过 5% 的主机。

在表单打开期间,需要注意以下三点:

  • 首先发送数据 。ES|QL 会根据查询运行时已存在的索引验证列名。在任何 NGINX 数据被采集之前打开模板,编辑器会报告 Unknown column "http.response.status_code",并且表单会显示错误。一旦数据开始流入(步骤 1),同一个查询就会通过验证,错误也会消失,因此请先采集数据,再创建规则。
  • 将时间字段设置为 @timestamp
  • 保持选择 "为每一行创建一个告警"(Create an alert for each row)。由于查询根据 host.name 进行分组,这会让每个受影响的主机分别触发自己的告警。

添加一个连接器和一个操作,使告警能够发送到 Slack、电子邮件或 PagerDuty,然后保存并启用该规则。

步骤 4:在 ES|QL 中调整告警规则模板阈值

这些阈值只是起始值,因此需要根据你自己的流量情况进行确认。阈值位于 ES|QL 的 WHERE 子句中。

要使规则更加严格,将 error_rate_pct > 5.0 修改为 error_rate_pct > 2.0。如果希望在触发前要求更多流量,则提高 total > 50 的值。在保存之前,使用规则表单中的"测试查询"(Test query)确认修改后的查询能够解析并返回结果行。

还有三个设置值得关注:

  • 时间窗口:查询运行时回溯的时间范围。较短的窗口响应更快,但在突发流量情况下会产生更多噪声。
  • 规则计划:查询运行的频率,默认每分钟运行一次。
  • 告警延迟:在创建告警之前,条件必须连续满足的运行次数,用于过滤单次运行中的短暂异常。

如何在 Elasticsearch 中检测空闲数据流?

阈值规则只有在数据持续到达时才会触发。当某个 agent 离线或输出出现故障时,数据会停止,阈值规则就没有可评估的内容。

许多 Elastic 集成都包含一个针对这种情况动态生成的空闲数据流模板。它名为 [{Integration name}] [Idle data streams](https://www.elastic.co/docs/reference/fleet/alerting-rule-templates "Idle data streams"),会出现在相同的 Alerting 标签页中,不过它是自动生成的,而不是集成中打包提供的。当在设定时间段内没有数据写入该集成的数据流模式时,它会触发告警。

NGINX OpenTelemetry 软件包不包含空闲数据流模板,因此在步骤 3 的 Alerting 标签页中不会看到此类模板。本节末尾会介绍替代方案。

默认时间周期为 24 小时,这通常太长。生产服务可能大半天都处于静默状态,而你仍然无法及时发现。

创建规则时,将周期缩短到符合你所需响应速度的范围。对于关键服务,15 分钟到 1 小时通常比较合适。对于批处理任务,将周期设置为明显长于其运行间隔的时间,这样任务运行之间的空闲间隔不会触发告警。

那么为什么这个示例没有包含它?该模板是根据集成定义的数据流模式生成的,并且不会为仅输入类型的软件包生成。像 NGINX OpenTelemetry Assets 这样的仅内容软件包也不会定义自己的数据流。要在这样的基于采集器的设置中检测数据停止,需要手动使用 Elasticsearch 查询规则重新创建该规则。使用查询 DSL 或 KQL 版本,而不是 ES|QL,因为 ES|QL 规则会在返回结果行时触发,而无法针对数据不存在的情况发出告警。

将规则指向 OTel 数据流(logs-nginx.access.otel-*metrics-nginxreceiver.otel-*),并将触发条件设置为:在例如最近 15 分钟的时间窗口内,匹配文档数量低于 1 时触发。这样就能复现空闲数据流模板的行为,并将范围限定在采集器写入的数据流上。

开始使用 Elastic 集成告警规则模板

告警规则模板将告警配置简化为几个步骤:发送数据、安装集成、根据模板创建规则,以及调整阈值。应将内置阈值视为需要确认的默认值,而不是可以盲目信任的数字。如果存在空闲数据流模板,应降低其默认的 24 小时时间周期,以便在服务停止发送数据时快速发现。

资源

原文:Alerting rule templates in Elastic integrations --- Elastic Observability Labs

相关推荐
Elasticsearch9 小时前
缩小 AI 差距:下一代知识访问如何为政府解锁任务成果
elasticsearch
Elastic 中国社区官方博客10 小时前
Elasticsearch:搜索教程 - 语义搜索(三)
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
西邮彭于晏1 天前
图文详解:Git分支创建、合并与冲突解决|新手零门槛完整教程
大数据·git·elasticsearch
Elastic 中国社区官方博客1 天前
Elastic 和 OpenAI 合作,将前沿智能引入非结构化企业数据
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai
Elastic 中国社区官方博客1 天前
Elasticsearch:搜索教程 - 全文搜索(一)
大数据·python·elasticsearch·搜索引擎·全文检索
西邮彭于晏1 天前
Git 标签(Tag)与版本发布完整指南|附全场景命令速查表
大数据·git·elasticsearch
Elasticsearch1 天前
Elasticsearch:搜索教程 - 语义搜索(三)
elasticsearch
Elasticsearch1 天前
Elasticsearch:搜索教程 - 向量搜索(二)
elasticsearch
Devin~Y1 天前
从本地生活电商到 AI RAG:互联网大厂 Java 面试场景完整实战
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag