跳到主要内容

告警表达式编写

Prometheus 是一个强大的监控和告警系统,而告警表达式是 Prometheus 告警系统的核心。通过编写告警表达式,您可以定义在什么条件下触发告警。本文将详细介绍如何编写 Prometheus 告警表达式,并通过实际案例帮助您理解其应用。

什么是告警表达式?

告警表达式是一种基于 PromQL(Prometheus Query Language)的查询语句,用于定义触发告警的条件。当表达式的结果满足特定条件时,Prometheus 会触发告警并将其发送到配置的告警管理器(如 Alertmanager)。

告警表达式通常用于监控系统的健康状态,例如 CPU 使用率过高、内存不足或服务不可用等。

基本语法

Prometheus 告警表达式的基本语法如下:

promql
<metric_name>{<label_filter>} <operator> <value>
  • <metric_name>:指标名称,例如 cpu_usage
  • <label_filter>:标签过滤器,用于筛选特定的时间序列。
  • <operator>:比较运算符,例如 ><== 等。
  • <value>:阈值,用于判断是否触发告警。

示例 1:简单的告警表达式

假设我们有一个指标 http_requests_total,表示 HTTP 请求的总数。我们希望当请求数超过 1000 时触发告警,表达式可以写成:

promql
http_requests_total > 1000

示例 2:带标签过滤的告警表达式

如果我们只想监控特定服务的 HTTP 请求数,可以使用标签过滤器。例如,监控服务名为 webapp 的请求数:

promql
http_requests_total{service="webapp"} > 1000

逐步讲解

1. 选择指标

首先,您需要选择要监控的指标。Prometheus 提供了丰富的内置指标,您也可以自定义指标。例如,cpu_usage 表示 CPU 使用率,memory_usage 表示内存使用率。

2. 使用标签过滤器

标签过滤器可以帮助您筛选特定的时间序列。例如,如果您有多个服务,可以使用 service 标签来区分它们:

promql
cpu_usage{service="webapp"}

3. 设置阈值

阈值是触发告警的关键。您需要根据业务需求设置合理的阈值。例如,如果 CPU 使用率超过 80% 时需要告警,可以写成:

promql
cpu_usage{service="webapp"} > 80

4. 使用聚合函数

PromQL 提供了丰富的聚合函数,例如 sum()avg()max() 等。您可以使用这些函数对指标进行聚合计算。例如,计算所有服务的平均 CPU 使用率:

promql
avg(cpu_usage) > 80

5. 设置告警持续时间

有时,您可能希望指标在持续一段时间内超过阈值时才触发告警。可以使用 for 关键字来设置持续时间。例如,CPU 使用率超过 80% 持续 5 分钟时触发告警:

promql
cpu_usage{service="webapp"} > 80 for 5m

实际案例

案例 1:监控服务响应时间

假设我们有一个服务 api_service,我们希望监控其响应时间。如果响应时间超过 500 毫秒,并且持续 2 分钟,则触发告警。表达式可以写成:

promql
api_response_time{service="api_service"} > 500 for 2m

案例 2:监控错误率

假设我们有一个指标 http_errors_total,表示 HTTP 错误的总数。我们希望当错误率超过 5% 时触发告警。可以使用以下表达式:

promql
rate(http_errors_total[5m]) / rate(http_requests_total[5m]) * 100 > 5

总结

通过本文,您已经学习了如何编写 Prometheus 告警表达式。告警表达式是 Prometheus 告警系统的核心,掌握其编写方法对于构建可靠的监控系统至关重要。希望本文能帮助您更好地理解和使用 Prometheus 告警系统。

附加资源

练习

  1. 编写一个告警表达式,监控内存使用率超过 90% 的情况。
  2. 编写一个告警表达式,监控某个服务的请求延迟超过 1 秒的情况,并且持续 3 分钟。
  3. 使用聚合函数 sum(),编写一个告警表达式,监控所有服务的总请求数超过 10000 的情况。

通过完成这些练习,您将更深入地理解 Prometheus 告警表达式的编写和应用。