03.5、Prometheus数据模型
Prometheus 数据模型
本节将学习:时间序列数据模型、四种指标类型(Counter、Gauge、Histogram、Summary)、Label 的作用,以及指标命名规范。这些是理解 Prometheus 的基础。
时间序列数据
时间序列数据是什么? 时间序列数据是一系列按时间顺序排列的数据点。
每个数据点包含什么? 每个数据点包含时间戳(timestamp)和值(value)。
时间序列示例:
指标名称:http_requests_total 标签:{method="GET", status="200"} 数据点: 2026-01-15 10:00:00 → 1000 2026-01-15 10:00:15 → 1050 2026-01-15 10:00:30 → 1100 2026-01-15 10:00:45 → 1150
这个示例展示了 http_requests_total 指标的时间序列数据。每个时间点都有一个值。
时间序列的组成: 时间序列数据由指标名称、标签、时间戳、值组成。
- 指标名称(metric name):标识指标的类型,例如
http_requests_total - 标签(labels):区分和分组指标,例如
{method="GET", status="200"} - 时间戳(timestamp):数据点的时间,例如
2026-01-15 10:00:00 - 值(value):数据点的值,例如
1000
这就是时间序列数据。Prometheus 就是基于时间序列数据模型的。
指标类型:Counter(计数器)
Counter 是什么? Counter 只能递增的累积指标。
Counter 有什么特点?
- 只能递增,不能递减。 Counter 的值只能增加,不能减少。
- 值随时间单调递增。 Counter 的值会随着时间单调递增。它会一直增长,不会下降。
- 重启后可能重置为 0。 如果服务重启,Counter 可能会重置为 0。但这是正常的。
Counter 适用于哪些场景呢?
第一个场景:请求总数。
http_requests_total{method="GET", status="200"} = 10000
这个指标表示总共处理了 10000 个 GET 请求,状态码是 200。
第二个场景:错误总数。
http_requests_errors_total{method="POST"} = 50
这个指标表示总共处理了 50 个 POST 请求错误。
第三个场景:处理的总数据量。
bytes_processed_total{service="api"} = 1000000
这个指标表示总共处理了 1000000 字节的数据。
这就是 Counter。它用于统计累计值,例如请求总数、错误总数。
指标类型:Gauge(仪表盘)
Gauge 是什么? Gauge 可以增加或减少的指标。
Gauge 有什么特点?
- 可以增加或减少。 Gauge 的值可以增加,也可以减少。不像 Counter 只能增加。
- 值会上下波动。 Gauge 的值会上下波动。它反映当前状态,不是累计值。
- 反映当前状态。 Gauge 反映当前状态,而不是累计值。例如当前 CPU 使用率、当前内存使用量。
Gauge 适用于哪些场景呢?
第一个场景:CPU 使用率。
cpu_usage_percent = 75.5
这个指标表示当前 CPU 使用率是 75.5%。它会上下波动。
第二个场景:内存使用量。
memory_usage_bytes = 8589934592
这个指标表示当前内存使用量是 8589934592 字节。它会增加或减少。
第三个场景:当前连接数。
active_connections{service="api"} = 150
这个指标表示当前有 150 个活跃连接。它会增加或减少。
第四个场景:队列长度。
queue_length{queue="orders"} = 25
这个指标表示当前队列长度是 25。它会增加或减少。
这就是 Gauge。它用于反映当前状态,例如 CPU 使用率、内存使用量。
指标类型:Histogram 和 Summary
Histogram(直方图)是什么? Histogram 用于统计数据分布。
Histogram 有什么特点?
- 统计数据分布。 Histogram 统计数据的分布情况。例如请求延迟的分布。
- 使用 bucket(桶)分组。 Histogram 使用 bucket 分组数据。例如 0-0.1s、0.1-0.5s、0.5-1.0s 这些桶。
- 计算分位数。 Histogram 可以计算分位数,例如 P50、P95、P99。但是分位数是在服务端计算的。
Histogram 示例:
http_request_duration_seconds_bucket{le="0.1"} = 8000 http_request_duration_seconds_bucket{le="0.5"} = 9500 http_request_duration_seconds_bucket{le="1.0"} = 10000
这个示例展示了请求延迟的分布。有 8000 个请求延迟小于 0.1 秒,有 9500 个请求延迟小于 0.5 秒,有 10000 个请求延迟小于 1.0 秒。
Summary(摘要)是什么? Summary 用于计算分位数。
Summary 有什么特点?
- 计算分位数。 Summary 计算分位数,例如 P50、P95、P99。
- 客户端计算。 Summary 的分位数是在客户端计算的。不是在服务端计算的。
- 更精确但成本更高。 Summary 的分位数更精确,但是成本更高。因为需要在客户端计算。
Summary 示例:
http_request_duration_seconds{quantile="0.5"} = 0.2 http_request_duration_seconds{quantile="0.95"} = 0.5 http_request_duration_seconds{quantile="0.99"} = 1.0
这个示例展示了请求延迟的分位数。P50 是 0.2 秒,P95 是 0.5 秒,P99 是 1.0 秒。
对比: Histogram 和 Summary 都用于分析数据分布。Histogram 在服务端计算分位数,Summary 在客户端计算分位数。选择适合你的方式。
Label(标签)的作用
Label 是什么? Label 用于区分和分组指标。
Label 有什么作用呢?
- 区分不同的指标实例。 同一个指标,不同的标签组合,表示不同的实例。例如,和
http_requests_total{method="GET"}是不同的实例。http_requests_total{method="POST"} - 分组和过滤指标。 可以通过标签分组和过滤指标。例如,按 method、status、path 分组。
- 多维数据分析。 可以按多个维度分析数据。例如,按服务、环境、区域分析。
Label 示例:
http_requests_total{method="GET", status="200", path="/api/orders"} = 1000 http_requests_total{method="GET", status="200", path="/api/users"} = 500 http_requests_total{method="POST", status="200", path="/api/orders"} = 200
这个示例展示了同一个指标
http_requests_totalLabel 使用场景:
- 第一个场景:区分不同的指标实例。 同一个指标,不同的标签组合,表示不同的实例。
- 第二个场景:分组和过滤指标。 可以通过标签分组和过滤指标。例如,查询所有 GET 请求的指标,查询所有状态码为 200 的指标。
- 第三个场景:多维数据分析。 可以按多个维度分析数据。例如,按服务、环境、区域分析。
Label 设计原则:
- 使用有意义的标签名。 标签名应该有意义。例如 、
method、status,而不是path、label1。label2 - 标签值应该是有限的。 标签值应该是有限的、预定义的。例如 的值应该是
method、GET、POST、PUT这些,而不是随意的字符串。DELETE - 避免高基数的标签。 避免高基数的标签,例如用户 ID、订单 ID。这些标签会导致大量的时间序列。
- 遵循命名规范。 遵循命名规范,例如使用小写字母和下划线。
这就是 Label 的作用。它是 Prometheus 数据模型的重要组成部分。
指标命名规范
指标命名有什么规则呢?
第一个规则:使用小写字母。 指标名应该使用小写字母。不要使用大写字母。
第二个规则:使用下划线分隔单词。 使用下划线分隔单词,而不是驼峰命名或连字符。例如,
http_requests_totalhttpRequestsTotalhttp-requests-total第三个规则:使用有意义的名称。 指标名应该有意义。例如
http_requests_totalmetric1metric2第四个规则:遵循语义约定。 遵循 OpenTelemetry 或 Prometheus 的语义约定。这样可以保证一致性。
命名示例:
✅ 正确示例:
- :HTTP 请求总数
http_requests_total - :CPU 使用率
cpu_usage_percent - :内存使用量
memory_usage_bytes - :活跃数据库连接数
database_connections_active
❌ 错误示例:
- :驼峰命名,不对
httpRequestsTotal - :连字符,不对
cpu-usage-percent - :大写开头,不对
MemoryUsage - :点分隔,不对
db.conn
命名模式:
<metric_name>_<unit>_<type>例如:
- :总数
http_requests_total - :百分比
cpu_usage_percent - :字节
memory_usage_bytes - :秒
request_duration_seconds
后缀约定:
- :Counter 类型
_total - :Histogram/Summary 总数
_count - :Histogram/Summary 总和
_sum - :Histogram bucket
_bucket - :Gauge 类型(通常省略)
_gauge
这就是指标命名规范。遵循这些规范,可以保证指标命名的一致性。
本节小结
在本节中,我们学习了 Prometheus 数据模型:
第一个是时间序列数据。 包含时间戳和值的数据点序列。这是 Prometheus 的基础数据模型。
第二个是指标类型。 Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。每种类型有不同的特点和用途。
第三个是 Label 作用。 区分和分组指标,多维数据分析。Label 是 Prometheus 数据模型的重要组成部分。
第四个是命名规范。 小写字母、下划线分隔、有意义名称、遵循语义约定。遵循这些规范,可以保证指标命名的一致性。
指标类型总结: Counter 只能递增,Gauge 可增可减,Histogram 统计数据分布,Summary 计算分位数。选择适合你的指标类型。
这就是 Prometheus 数据模型。理解这些基础知识,是掌握 Prometheus 的关键。
在下一节,我们将学习 PromQL 查询语言基础。学习如何查询和分析数据,如何使用 PromQL 来获取我们需要的信息。