3、Prometheus监控体系基础:Prometheus架构、数据模型、指标类型、PromQL入门

在深入存储组件拓扑与租户配额校准之前,必须建立对Prometheus监控体系的系统性认知。本章将围绕Prometheus的核心架构、数据模型、指标类型以及PromQL查询语言展开,为后续的存储组件接入与配额计算打下坚实基础。

3.1 Prometheus整体架构

Prometheus采用拉取(Pull)模式采集指标,通过服务发现或静态配置确定目标端点。其核心组件包括:

  • Prometheus Server:负责指标抓取、存储与查询。
  • Exporters:将非原生支持Prometheus的应用指标转换为标准格式。
  • Pushgateway:用于短期或批处理任务的指标推送。
  • Alertmanager:处理告警路由、去重与通知。
  • Service Discovery:动态发现Kubernetes、Consul等环境中的目标。
架构要点:Prometheus不依赖分布式存储,每个Server节点独立工作,通过联邦(Federation)实现跨集群监控。
Prometheus核心架构图 服务发现 Prometheus Server 抓取 · 存储 · 查询 Exporters Pushgateway Alertmanager 告警通知 本地存储 (TSDB) PromQL / Grafana 说明:Prometheus通过Pull模式从Exporters或Pushgateway获取指标, 存储于本地TSDB,并通过PromQL对外提供查询,同时支持告警路由。

3.2 数据模型

Prometheus将所有采集到的数据存储为时间序列(Time Series),每个时间序列由以下三部分唯一标识:

组成部分 说明 示例
指标名称(Metric Name) 描述被监控对象的一般含义 node_cpu_seconds_total
标签(Labels) 键值对,用于区分同一指标的不同维度 {instance="10.0.0.1:9100", cpu="0", mode="idle"}
样本(Sample) 包含时间戳(Timestamp)和值(Value) @1620000000 12345.67
标签设计原则:标签是Prometheus数据模型的灵魂。在Kubernetes存储场景中,建议将namespace、persistentvolumeclaim、storageclass等作为标签,以便后续按租户进行配额聚合。

3.3 指标类型

Prometheus客户端库提供四种核心指标类型,理解其语义对于编写正确的PromQL至关重要:

指标类型 行为特征 典型用途 存储场景示例
Counter 只增不减,重启归零 请求总数、错误计数 PVC总写入字节数
Gauge 可增可减,反映当前状态 内存使用量、连接数 PV当前已用容量
Histogram 对观测值进行分桶统计 请求延迟分布、响应大小 存储IO延迟分布
Summary 类似Histogram,但计算分位数 请求延迟的p99 存储IO延迟的p99
常见误区:Counter类型不能直接用于计算当前速率,必须配合rate()或increase()函数使用。Gauge类型则可以直接用于当前值查询。

3.4 PromQL入门

PromQL(Prometheus Query Language)是Prometheus内置的函数式查询语言。以下为最常用的查询模式:

3.4.1 基础查询

# 查询所有node_cpu_seconds_total指标
node_cpu_seconds_total

# 带标签过滤
node_cpu_seconds_total{cpu="0", mode="idle"}

# 正则匹配
node_cpu_seconds_total{instance=~"10.0.0.*"}

3.4.2 常用函数

函数 作用 示例
rate() 计算Counter在指定时间窗口内的每秒平均增长率 rate(node_cpu_seconds_total[5m])
increase() 计算Counter在指定时间窗口内的增量 increase(node_network_receive_bytes_total[1h])
avg_over_time() 计算Gauge在指定时间窗口内的平均值 avg_over_time(node_memory_MemAvailable_bytes[10m])
topk() 返回排名前k的时间序列 topk(3, node_filesystem_size_bytes)

3.4.3 存储场景PromQL示例

# 查询每个PVC的当前已用容量(Gauge)
kubelet_volume_stats_used_bytes{namespace="tenant-a"}

# 计算每个PVC在过去1小时内的写入流量(Counter增量)
increase(ceph_pool_wr_bytes[1h])

# 按StorageClass聚合PV总容量
sum by (storage_class) (kube_persistentvolume_capacity_bytes)

# 计算租户配额使用率(假设配额为100Gi)
(
  sum(kubelet_volume_stats_used_bytes{namespace="tenant-a"})
  /
  100 * 1024 * 1024 * 1024
) * 100
实战要点:在租户配额校准场景中,rate()和increase()用于计算存储消耗速率,sum by (namespace)用于按租户聚合,/运算符结合配额常量计算使用率。
PromQL查询处理流程 用户输入PromQL 词法/语法解析 查询执行引擎 TSDB 存储 返回时间序列结果 说明:PromQL经过解析后,由执行引擎从TSDB中读取对应时间序列, 并在内存中完成聚合、运算后返回最终结果。

3.5 本章小结

本章建立了Prometheus监控体系的基础认知:

  • 架构:Pull模式、Server、Exporter、Alertmanager各司其职。
  • 数据模型:指标名称+标签唯一确定时间序列,标签是聚合的关键。
  • 指标类型:Counter用于累计量,Gauge用于当前状态,Histogram/Summary用于分布统计。
  • PromQL:rate()、increase()、sum by是存储配额计算的核心工具。