prometheus自定义record和alert

在 Prometheus 中,**报警规则(Alerting Rules)** 和 **聚合规则(Recording Rules)** 虽然都定义在规则文件中,但用途和行为有显著区别。以下是它们的核心差异,以及聚合规则是否支持添加标签的解答:

---

### **1. 报警规则 vs. 聚合规则的区别**
| **特性**               | **报警规则(Alerting Rules)**                          | **聚合规则(Recording Rules)**                        |
|------------------------|-------------------------------------------------------|-------------------------------------------------------|
| **目的**               | 定义触发告警的条件(如阈值突破、异常检测)。            | 预先计算并存储聚合指标,优化查询性能或简化复杂表达式。  |
| **结果存储**           | 不存储结果,仅触发告警事件(需配合 Alertmanager)。     | 生成新指标并存储到 Prometheus 时序数据库。             |
| **语法结构**           | 使用 `alert` 关键字,需定义 `annotations` 和 `labels`。 | 使用 `record` 关键字,直接定义表达式和指标名。         |
| **典型场景**           | CPU 使用率 > 90%、服务宕机、错误率突增。               | 合并多个指标、预计算耗时查询(如 `rate()` 或分位数)。 |
| **执行频率**           | 依赖 `evaluation_interval` 配置。                      | 可单独设置 `interval`(默认继承全局 `evaluation_interval`)。 |

#### **示例对比**
```yaml
# 报警规则示例
groups:
  - name: alert_rules
    rules:
      - alert: HighRequestLatency
        expr: avg(rate(http_request_duration_seconds[5m])) by (service) > 0.5
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "High latency on {{ $labels.service }}"

# 聚合规则示例
groups:
  - name: aggregation_rules
    rules:
      - record: service:request_latency_seconds:avg
        expr: avg(rate(http_request_duration_seconds[5m])) by (service)
```

---

### **2. 聚合规则是否可以添加标签?**
**可以!** 聚合规则生成的新指标支持通过以下方式添加或修改标签:

#### **(1) 在 `expr` 中使用 `label_replace` 函数**
```yaml
rules:
  - record: service:requests:total
    expr: |
      sum(http_requests_total) by (service)
      * on (service) group_left(environment)
      label_replace(up{job="web"}, "environment", "prod", "instance", ".*")
```
- 此例将 `environment="prod"` 标签添加到新指标中。

#### **(2) 直接继承原指标的标签**
聚合操作中的 `by` 或 `without` 子句会保留指定的标签:
```yaml
rules:
  - record: service:errors:rate
    expr: sum(rate(http_errors_total[5m])) by (service, environment)  # 保留 service 和 environment 标签
```

#### **(3) 通过算术运算合并标签**
若多个指标有相同标签,运算后标签会自动保留:
```yaml
rules:
  - record: service:total_operations
    expr: http_requests_total{job="web"} + api_calls_total{job="web"}  # 合并时保留共有的标签
```

---

### **3. 注意事项**
1. **标签冲突**:  
   - 如果被聚合的指标标签不一致,需明确使用 `by` 或 `without` 指定保留的标签。
   - 例如:`sum(metric1 + metric2) without (instance)` 忽略实例标签。

2. **性能影响**:  
   - 添加过多标签可能导致基数爆炸(高基数问题),尤其是使用 `label_replace` 动态生成标签时。

3. **与报警规则联动**:  
   - 通常先通过聚合规则生成精简指标,再基于这些指标定义报警规则,提升效率。

---

### **4. 完整示例(聚合规则 + 标签操作)**
```yaml
groups:
  - name: custom_metrics
    rules:
      # 聚合指标并添加静态标签
      - record: service:http_requests:total
        expr: sum(http_requests_total) by (service)
        labels:
          tier: "backend"  # 直接添加静态标签(需 Prometheus 2.0+ 支持)

      # 动态合并标签(通过 label_replace)
      - record: service:latency_with_env
        expr: |
          label_replace(
            avg(rate(http_request_duration_seconds[5m])) by (service),
            "environment",
            "production",
            "service",
            ".*"
          )
```

---

### **总结**
- **报警规则**:用于触发告警,不存储数据,需定义告警标签和注释。
- **聚合规则**:生成新指标,支持通过表达式继承、修改或添加标签。
- **最佳实践**:优先用聚合规则预处理复杂计算,再基于结果配置报警规则,兼顾性能与可维护性。

  

posted on 2025-05-22 00:12  吃草的青蛙  阅读(90)  评论(0)    收藏  举报

导航