03.5Prometheus数据模型

分类: 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_total
,但是有不同的标签组合。通过标签,我们可以区分不同的指标实例。

Label 使用场景:

  • 第一个场景:区分不同的指标实例。 同一个指标,不同的标签组合,表示不同的实例。
  • 第二个场景:分组和过滤指标。 可以通过标签分组和过滤指标。例如,查询所有 GET 请求的指标,查询所有状态码为 200 的指标。
  • 第三个场景:多维数据分析。 可以按多个维度分析数据。例如,按服务、环境、区域分析。

Label 设计原则:

  1. 使用有意义的标签名。 标签名应该有意义。例如
    method
    status
    path
    ,而不是
    label1
    label2
  2. 标签值应该是有限的。 标签值应该是有限的、预定义的。例如
    method
    的值应该是
    GET
    POST
    PUT
    DELETE
    这些,而不是随意的字符串。
  3. 避免高基数的标签。 避免高基数的标签,例如用户 ID、订单 ID。这些标签会导致大量的时间序列。
  4. 遵循命名规范。 遵循命名规范,例如使用小写字母和下划线。

这就是 Label 的作用。它是 Prometheus 数据模型的重要组成部分。

指标命名规范

指标命名有什么规则呢?

第一个规则:使用小写字母。 指标名应该使用小写字母。不要使用大写字母。

第二个规则:使用下划线分隔单词。 使用下划线分隔单词,而不是驼峰命名或连字符。例如,

http_requests_total
,而不是
httpRequestsTotal
http-requests-total

第三个规则:使用有意义的名称。 指标名应该有意义。例如

http_requests_total
,而不是
metric1
metric2

第四个规则:遵循语义约定。 遵循 OpenTelemetry 或 Prometheus 的语义约定。这样可以保证一致性。

命名示例:

✅ 正确示例:

  • http_requests_total
    :HTTP 请求总数
  • cpu_usage_percent
    :CPU 使用率
  • 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
    :秒

后缀约定:

  • _total
    :Counter 类型
  • _count
    :Histogram/Summary 总数
  • _sum
    :Histogram/Summary 总和
  • _bucket
    :Histogram bucket
  • _gauge
    :Gauge 类型(通常省略)

这就是指标命名规范。遵循这些规范,可以保证指标命名的一致性。

本节小结

在本节中,我们学习了 Prometheus 数据模型:

第一个是时间序列数据。 包含时间戳和值的数据点序列。这是 Prometheus 的基础数据模型。

第二个是指标类型。 Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。每种类型有不同的特点和用途。

第三个是 Label 作用。 区分和分组指标,多维数据分析。Label 是 Prometheus 数据模型的重要组成部分。

第四个是命名规范。 小写字母、下划线分隔、有意义名称、遵循语义约定。遵循这些规范,可以保证指标命名的一致性。

指标类型总结: Counter 只能递增,Gauge 可增可减,Histogram 统计数据分布,Summary 计算分位数。选择适合你的指标类型。

这就是 Prometheus 数据模型。理解这些基础知识,是掌握 Prometheus 的关键。

在下一节,我们将学习 PromQL 查询语言基础。学习如何查询和分析数据,如何使用 PromQL 来获取我们需要的信息。