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

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

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

在本教程中,您将

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

提示

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

开始之前

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

  • Grafana OSS

    要在本地运行 Grafana Stack,请确保已安装以下应用程序

  • 交互式学习环境

    • 或者,您可以在我们的交互式学习环境中试用此示例。这是一个完全配置好的环境,已安装所有依赖项。

设置 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 集成。此联系点使用 webhooks 集成。为了使之生效,我们还需要一个 webhook 集成接收告警的端点。我们可以使用Webhook.site快速设置该测试端点。这样我们就可以确保我们的告警确实发送了通知到某个地方。

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

    OSS 用户:要登录,请导航到 https://:3000,Grafana 应该在此处运行。

  2. 在另一个标签页中,访问 Webhook.site

  3. 复制您的唯一 URL。

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

接下来,我们将在 Grafana 的 Alerting 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 中创建了一个新的 Alerting 联系点。现在,我们可以创建一个告警规则并将其链接到这个新的集成。

创建告警规则

接下来,我们将在 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 pattern parser 添加一个名为 message 的新标签,该标签包含日志行中的 level、method、url 和 status 信息。

    您可以使用 explain query 开关按钮查看查询语法的完整解释。可选的日志生成脚本会创建类似以下的示例日志行

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

    注意

    如果您使用自己的日志,请修改 LogQL 查询以匹配您自己的日志消息。请参阅 Loki 文档以了解pattern parser

  4. 告警条件部分

    • Last 作为归约函数 (WHEN) 的值,将 0 作为阈值。这是告警规则应该触发的上限值。
  5. 点击预览告警规则条件以运行查询。

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

    Preview of a firing alert instances
    Firing 告警实例预览

设置评估行为

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

  • 评估组:告警规则的评估频率。
  • 评估间隔:条件必须满足多久才能开始触发。这使得您的数据有时间稳定下来,然后再触发告警,有助于减少不必要的通知频率。

设置评估

  1. 文件夹中,点击 + 新建文件夹并输入名称。例如:web-server-alerts。此文件夹将包含我们的告警。
  2. 评估组中,重复上述步骤创建一个新的评估组。将其命名为 1m-evaluation
  3. 选择一个评估间隔(告警评估的频率)。例如,每 1m(1 分钟)。
  4. 将待处理周期设置为 0s(零秒),这样一旦条件满足,告警规则就会立即触发。

配置标签和通知

选择您希望接收告警通知的联系点。

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

触发告警规则

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

Firing alert notification details
Firing 告警通知详情

提示

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