如何使用日志数据创建警报

Melori Arellano
作者:Melori Arellano

最后更新时间:2024 年 9 月 2 日

高级

如何使用日志数据创建警报规则

Loki 存储您的日志,只为每个日志流索引标签。将 Loki 与 Grafana 报警结合使用是跟踪环境中发生事件的强大方法。您可以根据日志行中的内容创建指标警报规则,以通知您的团队。更棒的是,您可以将日志消息中的标签数据直接添加到警报通知中。

在本教程中,您将

  • 生成示例日志并使用 Promtail 将其拉取到 Grafana。
  • 基于 Loki 查询 (LogQL) 创建警报规则。
  • 创建 Webhook 联系点以将警报通知发送到。

提示

查看我们的高级警报教程,探索警报实例和通知路由等高级主题。

开始之前

Grafana Cloud 用户

作为 Grafana Cloud 用户,您无需安装任何内容。

继续到生成示例日志

Grafana OSS 用户

为了在本地运行 Grafana 堆栈,请确保您已安装以下应用程序。

为了演示使用 Grafana 堆栈观察数据,请将文件下载到您的本地机器。

  1. 下载并保存一个 Docker compose 文件以运行 Grafana、Loki 和 Promtail。

    bash
    wget https://raw.githubusercontent.com/grafana/loki/v2.8.0/production/docker-compose.yaml -O docker-compose.yaml
  2. 运行 Grafana 堆栈。

    bash
    docker compose up -d

第一次运行 docker compose up -d 时,Docker 会下载本教程所需的所有资源。这可能需要几分钟时间,具体取决于您的网络连接。

注意

如果您已经在系统上运行了 Grafana、Loki 或 Prometheus,您可能会看到错误,因为 Docker 镜像试图使用您的本地安装正在使用的端口。如果是这种情况,请停止服务,然后再次运行命令。

提示

或者,您可以在我们的交互式学习环境中尝试此示例:开始使用 Grafana 报警

这是一个配置完整的环境,所有依赖项都已安装。

Interactive

Grafana Killercoda 存储库中提供反馈、报告错误和提出问题。

生成示例日志

  1. 下载并保存一个生成日志的 Python 文件。

    bash
    wget https://raw.githubusercontent.com/grafana/tutorial-environment/master/app/loki/web-server-logs-simulator.py
  2. 执行日志生成 Python 脚本。

    bash
    python3 ./web-server-logs-simulator.py | sudo tee -a /var/log/web_requests.log

脚本故障排除

如果您在 Explore 中看不到示例日志

  • 输出文件是否存在,检查 /var/log/web_requests.log 以查看它是否包含日志。
  • 如果文件为空,请检查您是否按照上述步骤创建了文件。
  • 如果文件存在,请验证 promtail 容器是否正在运行。
  • 在 Grafana Explore 中,检查时间范围是否仅限于过去 5 分钟。

创建联系点

除了是一个开源的可观测性工具之外,Grafana 还拥有自己的内置警报服务。这意味着,您可以随时收到有关数据中感兴趣事件的通知,甚至可以在可视化效果中查看这些事件的图表。

在本步骤中,我们将设置一个新的联系点。此联系点将使用webhook集成。为了使此操作正常工作,我们还需要一个用于接收警报的 webhook 集成端点。我们将使用Webhook.site快速设置测试端点。这样我们可以确保我们的警报确实向某个地方发送了通知。

  1. 在您的浏览器中,登录您的 Grafana Cloud 帐户。

    OSS 用户:要登录,请导航至https://127.0.0.1:3000,Grafana 运行的地方。

  2. 在另一个选项卡中,转至Webhook.site

  3. 复制您的唯一 URL。

您的 webhook 端点现在正在等待第一个请求。

接下来,让我们在 Grafana 的警报 UI 中配置一个联系点,以将通知发送到我们的 webhook 端点。

  1. 返回 Grafana。在 Grafana 的侧边栏中,将鼠标悬停在警报(铃铛)图标上,然后单击联系点

  2. 单击+ 添加联系点

  3. 名称中,写Webhook

  4. 集成中,选择Webhook

  5. URL中,粘贴 webhook 端点的端点。

  6. 单击测试,然后单击发送测试通知以将测试警报发送到您的 webhook 端点。

  7. 导航回Webhook.site。在左侧,现在有一个POST /条目。单击它以查看 Grafana 发送了哪些信息。

    A POST entry in Webhook.site
    Webhook.site 中的 POST 条目
  8. 返回 Grafana 并单击保存联系点

我们已经创建了一个虚拟的 Webhook 端点,并在 Grafana 中创建了一个新的警报联系点。现在,我们可以创建警报规则并将其链接到此新集成。

创建警报规则

接下来,我们将建立一个警报规则在 Grafana 警报中,当警报规则被触发和解决时通知我们。

  1. 在 Grafana 中,导航至警报>警报规则
  2. 单击新的警报规则
  3. 为您的警报规则输入警报规则名称。使其简短且描述性,因为这将显示在您的警报通知中。例如,web-requests-logs

定义查询和警报条件

在本节中,我们定义查询、表达式(用于操作数据)以及必须满足的触发警报的条件。

  1. 从下拉菜单中选择Loki数据源。

  2. 在查询编辑器中,通过单击右侧的按钮切换到代码模式。

  3. 粘贴下面的查询。

    sum by (message)(count_over_time({filename="/var/log/web_requests.log"} != "status=200" | pattern "<_> <message> duration<_>" [10m]))

此查询将计算状态码不是 200(OK)的日志行数,然后使用瞬时查询和括号中指示的时间间隔,按消息类型对结果集求和。它使用 LogQL 模式解析器添加一个名为message的新标签,其中包含日志行的级别、方法、url 和状态。

您可以使用解释查询切换按钮来全面解释查询语法。可选的日志生成脚本将创建一个类似于下面示例的样本日志行

2023-04-22T02:49:32.562825+00:00 level=info method=GET url=test.com status=200 duration=171ms

注意

如果您使用的是自己的日志,请修改 LogQL 查询以匹配您自己的日志消息。请参阅 Loki 文档以了解模式解析器
  1. 删除“B”减少表达式(单击垃圾桶图标)。减少表达式默认情况下会出现,在这种情况下,它是不需要的,因为查询的数据已经被减少了。请注意,阈值表达式现在是您的警报条件

  2. 在“C”阈值表达式

    • 输入更改为“A”以选择数据源。
    • 输入0作为阈值。这是警报规则应该触发的值。高于此值会触发警报规则。
  3. 单击预览以运行查询。

    它应该从状态码不是 200(OK)的日志行中返回警报实例,并且满足警报条件。警报规则触发的条件是任何超过0阈值的事件。由于 Loki 查询返回了超过零个警报实例,因此警报规则处于触发状态。

    Preview of a firing alert instances
    触发警报实例的预览

设置评估行为

一个评估组定义了警报规则何时触发,它基于两个设置

  • 评估组:警报规则的评估频率。
  • 评估间隔:条件必须满足多长时间才能开始触发。这允许您的数据在触发警报之前稳定下来,有助于减少不必要的通知频率。

要设置评估

  1. 文件夹中,单击+ 新文件夹并输入一个名称。例如:web-server-alerts。此文件夹将包含我们的警报。
  2. 评估组中,重复上述步骤以创建一个新的评估组。我们将将其命名为1m-evaluation
  3. 选择一个评估间隔(警报将被评估的频率)。例如,每1m(1分钟)。
  4. 将挂起时间设置为0s(零秒),以便在条件满足时立即触发警报规则。

配置标签和通知

选择您想要接收警报通知的联系点。

  1. 联系点下,从下拉菜单中选择Webhook
  2. 单击右上角的保存规则并退出

触发警报规则

由于 Python 脚本将继续生成与警报规则条件匹配的日志数据,因此,一旦评估间隔结束,您应该在 Webhook 端点中收到警报通知。

Firing alert notification details
触发警报通知详细信息

提示

查看我们的高级警报教程,探索警报实例和通知路由等高级主题。