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

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

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

在本教程中,您将了解如何

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

提示

Grafana 警报入门 - 第 2 部分中,您可以通过探索警报实例和通知路由来提升技能。

开始之前

您可以通过不同的方式来学习本教程。

设置 Grafana Stack

为了演示如何使用 Grafana stack 观测数据,请下载并运行以下文件。

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

    bash
    wget https://raw.githubusercontent.com/grafana/loki/refs/heads/main/production/docker-compose.yaml -O docker-compose.yaml
  2. 运行 Grafana stack。

    bash
    docker compose up -d

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

注意

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

生成示例日志

为了演示如何基于日志创建警报规则,您将使用一个生成逼真日志条目的脚本,以模拟 Grafana 中的典型监控数据。运行此脚本会持续输出日志,每条日志都包含时间戳、HTTP 方法(GET 或 POST)、状态码(200 表示成功,500 表示失败)以及请求持续时间(毫秒)。

  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 集成接收警报。我们可以使用 Webhook.site 快速设置该测试端点。这样可以确保我们的警报实际上正在向某个地方发送通知。

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

    OSS 用户:要登录,请导航至 https://: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 Alerting 中建立一个警报规则,以便在警报规则被触发和解决时通知我们。

  1. 在 Grafana 中,导航至 警报 > 警报规则
  2. 点击 新建警报规则
  3. 为您的警报规则输入警报规则名称。名称应简短且具有描述性,因为这会出现在您的警报通知中。例如:web-requests-logs

定义查询和警报条件

在此部分中,我们使用 Grafana 管理的警报规则创建的默认选项。默认选项允许我们定义查询、表达式(用于操作数据 – UI 中的 WHEN 字段)以及触发警报必须满足的条件(在默认模式下是阈值)。

  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 文档了解 pattern parser

  4. 警报条件 部分

    • 将聚合函数(WHEN)的值保留为 Last,并将阈值设置为 0。这是警报规则应该触发的阈值之上的值。
  5. 点击 预览警报规则条件 以运行查询。

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

    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
触发中警报通知详情

提示

Grafana 警报入门 - 第 2 部分中,您可以通过探索警报实例和通知路由来提升技能。