2. Prometheus 核心概念速通:指标模型、四种指标类型与标签设计原则
在深入 Prometheus 监控体系之前,必须牢固掌握其核心数据模型。Prometheus 将所有采集到的数据统一抽象为时间序列,每个序列由指标名称、一组标签键值对以及随时间推移的样本点组成。理解这一模型,是设计高效监控、编写精准告警规则和进行故障排查的基础。
2.1 指标模型:时间序列
Prometheus 的指标模型本质上是一个多维数据模型。一个时间序列由以下三部分唯一标识:
- 指标名称 (Metric Name):描述被监控对象的一般含义,例如
http_requests_total、node_cpu_seconds_total。 - 标签 (Labels):一组键值对,用于对同一个指标进行多维度的细分。例如
method="GET"、status="200"、instance="192.168.1.1:9090"。 - 样本 (Sample):一个具体的时间戳和对应的数值。
核心公式:
<metric_name>{<label_name>="<label_value>", ...} <value> <timestamp>
例如:http_requests_total{method="POST", handler="/api/v1/login", instance="web-01"} 1024 1700000000
2.2 四种核心指标类型
Prometheus 客户端库提供了四种核心指标类型,用于描述不同的监控场景。理解它们的语义差异,是正确采集和解读数据的前提。
| 类型 | 英文名 | 核心特征 | 典型用途 | 常见操作 |
|---|---|---|---|---|
| Counter | 计数器 | 只增不减(重启时归零) | 请求总数、错误总数、任务完成数 | rate(), increase() |
| Gauge | 仪表盘 | 可增可减,反映当前状态 | CPU 使用率、内存使用量、当前连接数 | avg(), max(), min() |
| Histogram | 直方图 | 对观测值进行分桶计数,可计算分位数 | 请求延迟、响应大小 | histogram_quantile() |
| Summary | 摘要 | 在客户端直接计算分位数,上报预定义的分位数结果 | 请求延迟(已知分位数需求) | 直接使用 _quantile 标签 |
重要区别:Histogram vs Summary
- Histogram:在服务端计算分位数,可以灵活聚合多个实例的数据,但计算精度受限于桶的划分。
- Summary:在客户端计算分位数,直接上报计算结果,无法跨实例聚合,但计算精度更高。
- 选型建议:需要聚合多个实例的分位数时用 Histogram;对单个实例的精确分位数有要求时用 Summary。
2.3 标签设计原则
标签是 Prometheus 实现多维监控的基石。设计不当的标签会导致基数爆炸、查询性能下降和存储成本激增。以下是经过生产环境验证的标签设计原则:
| 原则 | 说明 | 正确示例 | 错误示例 |
|---|---|---|---|
| 1. 高基数标签谨慎使用 | 避免将用户 ID、请求 ID、Session ID 等取值无上限的字段作为标签。 | status_code (取值有限) |
user_id (取值无限) |
| 2. 标签值保持稳定 | 标签值不应频繁变动,否则会导致大量新时间序列产生。 | host, region |
pod_name (频繁重建) |
| 3. 标签名具有可读性 | 使用清晰、一致的命名规范,便于团队理解和维护。 | http_method, db_name |
m, db |
| 4. 避免冗余标签 | 不要存储可以从其他标签推导出的信息。 | 仅使用 instance |
同时使用 instance 和 ip |
| 5. 统一标签命名规范 | 全团队使用相同的标签命名风格,例如蛇形命名法。 | error_type, request_size |
errorType, request-size |
实战建议:在压测场景中,务必为压测流量添加
test_id 或 load_test_name 标签,以便在巡检和故障排查时快速区分压测流量与真实业务流量,避免误告警。
2.4 标签设计实战:压测场景下的标签规划
结合本课程“容量压测”的背景,以下是一个推荐的标签设计模板,用于区分不同维度的压测数据:
# 压测指标示例
load_test_requests_total{
test_name="capacity_test_v1", # 压测任务名称
test_scenario="spike", # 压测场景:spike, ramp-up, steady
target_service="user-service", # 目标服务
target_host="10.0.1.100:8080", # 目标主机
status_code="200" # 响应状态码
}
# 巡检指标示例
health_check_duration_seconds{
check_type="tcp", # 巡检类型:tcp, http, dns
target="redis-cluster", # 巡检目标
result="success" # 巡检结果:success, failure
}
通过上述标签设计,可以在 PromQL 中灵活地进行多维聚合分析:
- 查询特定压测场景的总请求量:
sum(load_test_requests_total{test_scenario="spike"}) - 对比不同压测任务的错误率:
sum(rate(load_test_requests_total{status_code=~"5.."}[5m])) by (test_name) - 巡检故障排查:
avg(health_check_duration_seconds{result="failure"}) by (target)