通过 Prometheus Rule 代码化管理告警规则

阿里云 Prometheus Promtoolruleup 命令用于读取、验证和管理 PrometheusRule 配置文件。它支持从本地目录加载规则文件,验证规则的有效性,以及将规则上传到阿里云 Prometheus 实例。

本方案适用于:

  • 希望通过 IaC 方式管理所有告警规则的用户。

  • 希望搭建 CI 流水线来发布告警规则的用户。

准备工作

  1. 下载 promtool 工具

    curl -fsSL "https://o11y-addon-hangzhou-public.oss-cn-hangzhou.aliyuncs.com/share/promtool/install.sh" | bash
  2. 了解规则文件格式

    PrometheusRule规则文件必须符合以下格式:

    # 扩展字段,数据源配置(必需)
    datasources:
      - type: aliyun_prometheus #
        instance: <prometheus-instance-id>
        regionId: <region-id>
    
    # 规则组
    groups:
      - name: <group-name>
        interval: <evaluation-interval>  # 可选,如 "30s"
        rules:
          - alert: <alert-name>
            expr: <promql-expression>
            for: <duration>  # 可选,如 "5m"
            labels:
              severity: <severity-level>  # warning, critical, info 等
              # 其他标签...
            annotations:
              summary: <summary-text>
              description: <description-text>
              # 其他注解...

    数据源配置说明

    • type: 数据源类型,目前支持 aliyun_prometheus

    • instance: 阿里云 Prometheus 实例 ID

    • regionId: 阿里云区域 ID,如 cn-hangzhoucn-beijing

    规则级别映射

    规则中的 labels.severity 字段会被映射到阿里云 Prometheus 告警规则的 level 字段,映射规则如下:

    • warningwarning

    • criticalcritical

    • infoinfo

    • 其他值 → warning(默认)

注意事项

  1. 安全性

    • 不要在命令行中直接输入敏感信息(Access Key、Secret)。

    • 建议使用环境变量或配置文件管理凭证。

    • 确保规则文件不包含敏感信息。

  2. 数据源配置

    • 上传和删除操作会作用于规则文件中配置的所有数据源。

    • 确保数据源配置正确,避免误操作。

  3. 规则覆盖

    • 上传操作会覆盖目标数据源中同名的规则组。

    • 删除操作会删除指定规则组中的所有规则。

  4. 网络要求

    • 上传和删除操作需要能够访问阿里云 API。

    • 确保网络连接正常,且有相应的访问权限。

  5. 并发操作

    • 避免同时对同一规则组进行上传和删除操作。

    • 建议在操作完成后等待一段时间再进行下一次操作。

  6. 退出码

    • 0: 成功执行。

    • 1: 执行失败(验证失败、上传失败、删除失败等)。

最佳实践

上传规则

  1. 验证规则文件:检查规则文件的有效性,包括 PromQL 表达式语法、规则配置完整性等。

    promtool ruleup --dir /path/to/rules --check

    输出示例(验证通过):

    Found 1 rule file(s) in directory: /path/to/rules
    
    File: /path/to/rules/prometheus-rules.yml
    Type: prometheus
    Validation: OK

    输出示例(验证失败):

    Found 1 rule file(s) in directory: /path/to/rules
    
    File: /path/to/rules/prometheus-rules.yml
    Type: prometheus
    Validation errors:
      - group "system_resources": rule "HighCPUUsage": invalid PromQL expression: syntax error
      - group "application_services": rule "HighHTTPErrorRate": missing 'for' duration

    如果验证失败,命令会以退出码 1 退出。

  2. 上传规则:验证通过后再上传规则到阿里云 Prometheus。

    promtool ruleup --dir /path/to/rules --upload --access-key-id YOUR_ACCESS_KEY_ID --access-key-secret YOUR_ACCESS_KEY_SECRET --user-id YOUR_USER_ID

    交互式确认:命令会显示上传配置信息并要求确认:

    === Upload Configuration ===
    User ID: 123456789
    Rule groups to upload: 5
      [1] system_resources (4 rules)
      [2] application_services (4 rules)
      [3] database (3 rules)
      [4] kubernetes (3 rules)
      [5] business_metrics (2 rules)
    Total rules to upload: 16
    Datasources: 2
      [1] Region: cn-hangzhou, Instance: rw-dfaa8e87409285b4b422b3c862ee
      [2] Region: cn-beijing, Instance: rw-abc123456789
    Workspace: will be automatically retrieved from instance
    
    Do you want to proceed with the upload? (yes/no): 

    输入 yesy 继续,其他任何输入将取消上传。

    上传结果示例:

    === Upload Result ===
    Total uploads: 10 (rule groups × datasources)
    Success: 10, Failed: 0
    
    Datasource [1]: Region=cn-hangzhou, Instance=rw-dfaa8e87409285b4b422b3c862ee
      Group: system_resources, Request ID: 12345678-1234-1234-1234-123456789abc
        Uploaded rules: 4
          - HighCPUUsage (ID: rule-001, Status: enabled, Level: warning)
          - HighMemoryUsage (ID: rule-002, Status: enabled, Level: warning)
          - HighDiskUsage (ID: rule-003, Status: enabled, Level: critical)
          - HighDiskIO (ID: rule-004, Status: enabled, Level: warning)
    
    Upload completed! 10 datasource(s) succeeded.

删除阿里云 Prometheus 中的规则

从阿里云 Prometheus 实例中删除指定的规则组。删除前会进行与上传相同的验证。

promtool ruleup \
  --dir /path/to/rules \
  --delete \
  --access-key-id YOUR_ACCESS_KEY_ID \
  --access-key-secret YOUR_ACCESS_KEY_SECRET \
  --user-id YOUR_USER_ID

交互式确认:命令会显示删除配置信息并要求确认。

=== Delete Configuration ===
User ID: 123456789
Rule groups to delete: 5
  [1] system_resources
  [2] application_services
  [3] database
  [4] kubernetes
  [5] business_metrics
Datasources: 2
  [1] Region: cn-hangzhou, Instance: rw-dfaa8e87409285b4b422b3c862ee
  [2] Region: cn-beijing, Instance: rw-abc123456789

WARNING: This will delete all rules in the specified groups from the datasources!
Do you want to proceed with the deletion? (yes/no): 

删除结果示例:

=== Delete Result ===
Total deletions: 10 (rule groups × datasources)
Success: 10, Failed: 0

Datasource [1]: Region=cn-hangzhou, Instance=rw-dfaa8e87409285b4b422b3c862ee
  Group: system_resources deleted, Request ID: 12345678-1234-1234-1234-123456789abc
  All rules in group deleted successfully

Deletion completed! 10 deletion(s) succeeded.

查看规则文件基本信息

显示指定目录中所有规则文件的基本信息,包括文件类型、规则组数量、数据源数量等。

promtool ruleup --dir /path/to/rules

输出示例:

Found 2 rule file(s) in directory: /path/to/rules

File: /path/to/rules/prometheus-rules.yml
Type: prometheus
  PrometheusRule: 5 group(s), 2 datasource(s)
  Total rules: 15

File: /path/to/rules/alertmanager.yml
Type: alertmanager
  AlertManagerRule: 3 receiver(s)
  Route configured: yes

完整工作流程示例

  1. 先验证规则再上传。

  2. 使用版本控制:

    • 将规则文件纳入版本控制系统(如 Git)。

    • 在修改规则前先备份现有配置。

  3. 分环境管理:

    • 为不同环境(开发、测试、生产)使用不同的规则文件目录。

    • 使用不同的数据源配置区分环境。

  4. 规则命名规范:

    • 使用有意义的规则组名称,如 system_resourcesapplication_services

    • 告警名称应清晰描述告警内容,如 HighCPUUsageServiceInstanceDown

  5. 数据源配置:

    • 确保数据源配置中的 instanceregionId 准确无误。

    • 验证实例 ID 是否存在且可访问。

  6. 批量操作前确认:

    • 上传或删除操作会影响多个数据源,操作前仔细检查配置信息。

    • 在生产环境操作前,先在测试环境验证。

完整工作流程示例

# 1. 查看规则文件基本信息
promtool ruleup --dir ./example/rule

# 2. 验证规则文件
promtool ruleup --dir ./example/rule --check

# 3. 上传规则到阿里云(需要交互确认)
promtool ruleup \
  --dir ./example/rule \
  --upload \
  --access-key-id $ALIYUN_ACCESS_KEY_ID \
  --access-key-secret $ALIYUN_ACCESS_KEY_SECRET \
  --user-id $ALIYUN_USER_ID

# 4. 删除规则(需要交互确认)
promtool ruleup \
  --dir ./example/rule \
  --delete \
  --access-key-id $ALIYUN_ACCESS_KEY_ID \
  --access-key-secret $ALIYUN_ACCESS_KEY_SECRET \
  --user-id $ALIYUN_USER_ID
环境变量
export ALIYUN_ACCESS_KEY_ID="your-access-key-id"
export ALIYUN_ACCESS_KEY_SECRET="your-access-key-secret"
export ALIYUN_USER_ID="your-user-id"

常见错误

No rule files found in directory

  • 原因:指定目录中没有找到规则文件。

  • 解决:检查目录路径是否正确,确保目录中包含有效的 YAML 规则文件。

No PrometheusRule file found

  • 原因:目录中没有找到 PrometheusRule 类型的文件。

  • 解决:确保至少有一个文件包含 PrometheusRule 配置。

No rule groups found in PrometheusRule

  • 原因:PrometheusRule 文件中没有配置规则组。

  • 解决:在规则文件中添加至少一个 groups 配置。

No datasources configured in PrometheusRule

  • 原因:规则文件中没有配置数据源。

  • 解决:在规则文件顶部添加 datasources 配置。

Datasource [N] missing 'instance' field

  • 原因:数据源配置中缺少 instance 字段或值为空。

  • 解决:为每个数据源配置有效的 instance 值。

Datasource [N] missing 'regionId' field

  • 原因:数据源配置中缺少 regionId 字段或值为空。

  • 解决:为每个数据源配置有效的 regionId 值。

Rule validation failed

  • 原因:规则验证失败,可能是 PromQL 表达式语法错误、缺少必需字段等。

  • 解决:使用 --check 参数查看详细的验证错误信息,修复后重试。

--access-key-id is required when --upload is set

  • 原因:使用 --upload 时未提供 Access Key ID。

  • 解决:添加 --access-key-id 参数。

--user-id is required when --upload is set

  • 原因:使用 --upload 时未提供 User ID。

  • 解决:添加 --user-id 参数。

相关参考

ruleup 命令帮助

执行promtool ruleup --help,返回的参数说明如下:

参数

类型

默认值

说明

--dir

string

""

包含规则 YAML 文件的目录路径

--check

bool

false

检查配置是否有效,如果发现错误会以非零状态码退出

--upload

bool

false

上传 PrometheusRule 到阿里云 Prometheus 实例

--delete

bool

false

从阿里云 Prometheus 实例删除 PrometheusRule

--access-key-id

string

-

阿里云 Access Key ID(上传或删除时必需)

--access-key-secret

string

-

阿里云 Access Key Secret(上传或删除时必需)

--user-id

string

-

阿里云 User ID(上传或删除时必需)