指标监控以Prometheus采集加Grafana展示的组合成为云原生可观测性的事实标准。介绍PromQL查询语法、Service Discovery自动发现与远程存储方案,探讨高基数指标治理与告警规则最佳实践。内容兼顾理论推导、工程实践与生产案例复盘,帮助架构师在高并发与高可用场景下的设计决策与故障排查中做出正确判断。

岗位关联

需要学习指标监控(Prometheus+Grafana),指标监控以Prometheus采集加Grafana展示的组合成为云原生可观测性的事实标准。指标监控(Prometheus+Grafana)属于微服务与云原生深度 > 32.4.2 可观测性体系的关键内容,掌握后可更好地衔接后续章节。

目录
  1. 可视化演示
  2. 一、Prometheus 与 Grafana 基础概念
  3. 二、架构与工作流:Pull 采集、TSDB 存储与 PromQL 查询
  4. 三、四种核心指标类型:Counter、Gauge、Histogram、Summary
  5. 四、典型部署场景
  6. 五、优缺点与同类工具对比
  7. 六、发展趋势:OpenTelemetry 集成与长期存储
  8. 七、监控最佳实践
  9. AI 应用场景
  10. Python 演示
  11. 常见问答
  12. 常见误区
  13. 参考来源

可视化演示

演示Prometheus以Pull模型采集指标、四类核心指标类型、PromQL查询与高基数治理,步进切换查看采集、类型、查询与标签治理,理解云原生可观测性。

本节配有交互动效(进入视口后自动加载,约 3KB)。

Prometheus 指标监控 服务端主动Pull抓取 /metrics Counter/Gauge/Histogram/Summary PromQL 多维查询+rate() 指标 = 标签×值 控制标签基数防序列爆炸

一、Prometheus 与 Grafana 基础概念

Prometheus 是一个开源的时序监控与告警系统,最初由 SoundCloud 开发,现归属 CNCF。它以指标(metrics)为核心,结合多维标签模型对系统状态进行持续观测。

Grafana 是一个开源的可视化与仪表盘平台,常作为 Prometheus 的展示前端,将时序数据渲染为折线图、热力图、告警面板等,帮助团队直观理解系统运行状况。

二者组合形成了“采集—存储—查询—可视化—告警”的完整可观测性闭环,是云原生时代事实上的监控标准。

二、架构与工作流:Pull 采集、TSDB 存储与 PromQL 查询

Prometheus 采用 Pull(拉取)模型:服务端主动周期性地访问目标暴露的 /metrics 端点抓取指标。这种模式让采集方掌握节奏,便于调试、批处理与目标健康检查。

抓取到的数据写入内置的 TSDB(Time Series Database),按时间分块(block)存储并使用类似 Gorilla 的 XOR 编码压缩,兼顾写入吞吐与存储效率。

查询层提供 PromQL,支持即时查询(instant query)、区间查询(range query)与聚合运算,如 rate()、histogram_quantile()、sum by() 等,为告警与可视化提供数据基础。

三、四种核心指标类型:Counter、Gauge、Histogram、Summary

Counter(计数器):单调递增,只能增加不能减少,适用于请求数、错误数、处理字节数等累计量,配合 rate()/increase() 得到速率。

Gauge(仪表盘):可增可减的瞬时值,适用于温度、内存占用、队列深度、并发连接数等会上下波动的指标。

Histogram(直方图):将观测值落入预设桶(bucket)并累计计数,同时记录 _sum 与 _count,适合延迟分布分析,可跨实例聚合后用 histogram_quantile() 计算分位数。

Summary(摘要):在客户端直接计算分位数(如 p50/p90/p99),精度高但分位数无法跨实例聚合,因此分布式场景更推荐 Histogram。

四、典型部署场景

单机/小规模:单 Prometheus 实例 + node_exporter + Grafana 即可覆盖主机与应用指标监控。

多机房/高可用:通过联邦(Federation)分层抓取,或结合 Thanos/Cortex/Mimir 实现全局查询与长期存储。

云原生:在 Kubernetes 中以 ServiceMonitor/PodMonitor(Prometheus Operator)声明式管理抓取目标,结合 kube-state-metrics 与各组件 exporter 实现全栈监控。

五、优缺点与同类工具对比

优点:多维标签模型强大、PromQL 表达力强、生态丰富(大量 exporter)、Pull 模型易调试、社区活跃。

缺点:默认仅适合短期存储(约 15 天)、对高基数标签敏感、原生不擅长日志与链路追踪、水平扩展需借助外部组件。

相比 InfluxDB 更侧重多维指标与告警;相比 StatsD+Graphite 提供 Pull 与更强查询;相比 Datadog 等商业方案,开源免费但需自运维。

六、发展趋势:OpenTelemetry 集成与长期存储

OpenTelemetry(OTel)正成为可观测性数据采集的统一标准,Prometheus 已支持接收 OTLP 协议,并与 remote write 互通,推动指标、日志、链路三支柱统一。

长期存储方面,Thanos、Cortex、Mimir、VictoriaMetrics 等方案基于对象存储提供水平扩展与长期保留,弥补原生 Prometheus 的容量限制。

Native Histograms(原生直方图)以动态稀疏桶显著降低高基数延迟分布的存储成本,是近年重要的能力演进。

七、监控最佳实践

控制标签基数:避免将 user_id、request_id 等高基数字段作为标签,防止时间序列爆炸。

优先 Histogram 而非 Summary 做延迟分位数,以便跨实例聚合;用 USE/RED 方法论体系化关键指标。

善用 Recording Rule 预计算高频表达式、合理设置抓取间隔与超时、为告警配置多级阈值与 Alertmanager 分组/抑制/路由,避免告警风暴。

AI 应用场景

模型训练 GPU 指标监控

阶段:模型训练

解决的问题:训练任务 GPU 利用率、显存、温度等指标难以集中观测,无法及时发现资源瓶颈与异常中断。

具体案例:通过 dcgm-exporter 暴露 GPU 利用率与显存占用,Prometheus 抓取后在 Grafana 为每个训练作业构建 GPU 利用率面板,并在显存接近上限时触发告警通知算法工程师排查 OOM 风险。

推理服务 SLA 监控

阶段:模型推理/服务化

解决的问题:推理接口延迟与可用性波动难以量化,无法保障线上 SLA 与快速定位性能退化。

具体案例:推理网关以 Histogram 记录每次请求延迟,Prometheus 计算 p99 延迟与错误率,Grafana 仪表盘展示 SLA 达成率,当 p99 超过 300ms 持续 5 分钟时由 Alertmanager 推送告警。

数据管道可观测性

阶段:数据处理/特征工程

解决的问题:数据管道各阶段吞吐、积压与失败率缺乏统一视图,问题定位依赖人工逐环排查。

具体案例:为 Airflow/DolphinScheduler 任务以 Counter 暴露成功与失败数、以 Gauge 暴露队列积压,Prometheus 聚合后在 Grafana 构建端到端数据管道健康大盘,实现异常自动告警。

Python 演示

python53 行
class Counter:    def __init__(self, name):        self.name = name        self.value = 0.0     def inc(self, amount=1.0):        self.value += amount  class Gauge:    def __init__(self, name):        self.name = name        self.value = 0.0     def set(self, value):        self.value = float(value)  class Histogram:    def __init__(self, name, buckets=(0.005, 0.01, 0.05, 0.1, 0.5, 1.0)):        self.name = name        self.buckets = sorted(buckets)        self.counts = [0] * (len(self.buckets) + 1)        self.sum = 0.0     def observe(self, value):        self.sum += value        for i, bound in enumerate(self.buckets):            if value <= bound:                self.counts[i] += 1                return        self.counts[-1] += 1  REGISTRY = {}  def register(metric):    REGISTRY[metric.name] = metric    return metric  def collect():    out = []    for name, m in REGISTRY.items():        if isinstance(m, Counter):            out.append(f"{name} {m.value}")        elif isinstance(m, Gauge):            out.append(f"{name} {m.value}")        elif isinstance(m, Histogram):            out.append(f"{name}_sum {m.sum}")            out.append(f"{name}_count {sum(m.counts)}")    return "\n".join(out)
目的:用一个轻量的注册表模式模拟 Prometheus 的 Counter、Gauge、Histogram 三类核心指标及其暴露方式,帮助理解指标语义。
  1. class Counter:定义 Counter 指标类,表示单调递增的累计计数器
  2. def inc(self, amount=1.0):Counter 的 inc 方法用于增加计数值,默认加一
  3. self.value += amount累加计数,体现 Counter 只增不减的语义
  4. class Gauge:定义 Gauge 指标类,表示可增可减的瞬时值
  5. def set(self, value):Gauge 的 set 方法直接覆盖当前值
  6. class Histogram:定义 Histogram 指标类,用于观测值分布
  7. def __init__(self, name, buckets=初始化直方图并设定分桶边界
  8. self.counts = [0] * (len(self.buckets) + 1)为每个桶及 +Inf 桶初始化计数数组
  9. def observe(self, value):observe 方法记录一次观测值
  10. for i, bound in enumerate(self.buckets):遍历桶边界寻找观测值所属桶
  11. self.counts[i] += 1命中边界则对应桶计数加一
  12. self.counts[-1] += 1超出所有边界则记入 +Inf 桶
  13. def register(metric):注册函数将指标加入全局注册表
  14. REGISTRY[metric.name] = metric以指标名为键存入注册表,模拟 Prometheus 暴露
  15. def collect():collect 模拟 Prometheus 抓取时遍历输出指标

常见问答

Prometheus 默认采用哪种采集模型?
Pull(拉取)模型,Prometheus 服务端主动周期性地抓取目标 /metrics 端点暴露的指标。
Prometheus 的四种指标类型分别是什么?
Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)。
为什么延迟分位数通常推荐用 Histogram 而非 Summary?
Histogram 把观测值分桶存储,可在服务端用 histogram_quantile() 跨实例聚合计算分位数;Summary 在客户端算分位数,无法跨实例聚合。
rate() 与 increase() 的区别是什么?
rate() 返回区间内每秒平均速率,increase() 返回区间内总增长量;二者都自动处理 Counter 重置。
Prometheus 如何解决高基数标签问题?
应避免把 user_id、request_id 等高基数字段作为标签,必要时用日志/链路系统承载细节,监控只保留低基数维度。
Alertmanager 的核心功能有哪些?
去重(dedup)、分组(grouping)、抑制(inhibition)、路由(routing)与多种通知渠道(邮件、Slack、Webhook 等)。
Prometheus 如何实现长期存储与水平扩展?
通过 Thanos、Cortex、Mimir、VictoriaMetrics 等方案,结合对象存储与 remote write/read 实现长期保留与全局查询。

常见误区

误区Prometheus 适合存储所有历史数据,可永久保留

正解

误区监控要把 user_id、trace_id 等放进标签便于排查

正解

误区Summary 比 Histogram 更高级,延迟分位数都该用 Summary

正解

误区Grafana 可以替代 Prometheus 采集和存储指标

正解

误区Counter 值可以直接拿来当 QPS 看

正解

参考来源