指标监控以Prometheus采集加Grafana展示的组合成为云原生可观测性的事实标准。介绍PromQL查询语法、Service Discovery自动发现与远程存储方案,探讨高基数指标治理与告警规则最佳实践。内容兼顾理论推导、工程实践与生产案例复盘,帮助架构师在高并发与高可用场景下的设计决策与故障排查中做出正确判断。
需要学习指标监控(Prometheus+Grafana),指标监控以Prometheus采集加Grafana展示的组合成为云原生可观测性的事实标准。指标监控(Prometheus+Grafana)属于微服务与云原生深度 > 32.4.2 可观测性体系的关键内容,掌握后可更好地衔接后续章节。
目录
可视化演示
演示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 演示
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)
class Counter:定义 Counter 指标类,表示单调递增的累计计数器def inc(self, amount=1.0):Counter 的 inc 方法用于增加计数值,默认加一self.value += amount累加计数,体现 Counter 只增不减的语义class Gauge:定义 Gauge 指标类,表示可增可减的瞬时值def set(self, value):Gauge 的 set 方法直接覆盖当前值class Histogram:定义 Histogram 指标类,用于观测值分布def __init__(self, name, buckets=初始化直方图并设定分桶边界self.counts = [0] * (len(self.buckets) + 1)为每个桶及 +Inf 桶初始化计数数组def observe(self, value):observe 方法记录一次观测值for i, bound in enumerate(self.buckets):遍历桶边界寻找观测值所属桶self.counts[i] += 1命中边界则对应桶计数加一self.counts[-1] += 1超出所有边界则记入 +Inf 桶def register(metric):注册函数将指标加入全局注册表REGISTRY[metric.name] = metric以指标名为键存入注册表,模拟 Prometheus 暴露def collect():collect 模拟 Prometheus 抓取时遍历输出指标
常见问答
Prometheus 默认采用哪种采集模型?
Prometheus 的四种指标类型分别是什么?
为什么延迟分位数通常推荐用 Histogram 而非 Summary?
rate() 与 increase() 的区别是什么?
Prometheus 如何解决高基数标签问题?
Alertmanager 的核心功能有哪些?
Prometheus 如何实现长期存储与水平扩展?
常见误区
误区Prometheus 适合存储所有历史数据,可永久保留
正解
误区监控要把 user_id、trace_id 等放进标签便于排查
正解
误区Summary 比 Histogram 更高级,延迟分位数都该用 Summary
正解
误区Grafana 可以替代 Prometheus 采集和存储指标
正解
误区Counter 值可以直接拿来当 QPS 看
正解
参考来源
- docPrometheus Overview - Official DocumentationPrometheus官方文档,介绍监控系统的架构、核心概念和组件交互
- docPrometheus Metric Types - Counter/Gauge/Histogram/SummaryPrometheus四种指标类型的官方文档,详细说明Counter/Gauge/Histogram/Summary的定义和使用场景
- docPromQL Basics - Prometheus Query LanguagePromQL查询语言基础文档,介绍时序数据查询语法和聚合函数
- docGrafana Documentation - Data Visualization and DashboardsGrafana官方文档,介绍数据源配置、仪表盘创建和告警规则设置
- webpageGrafana Blog - Observability Best PracticesGrafana官方博客,分享可观测性最佳实践和案例研究