Prometheus 核心概念详解:时间序列、样本、指标类型与任务实例

发布时间:2026/7/7 7:43:14
Prometheus 核心概念详解:时间序列、样本、指标类型与任务实例 前言Prometheus 作为云原生时代最核心的监控系统之一凭借其强大的多维数据模型和灵活的查询语言 PromQL已成为 Kubernetes 生态中监控方案的事实标准。本文将从零开始系统介绍 Prometheus 的核心概念——时间序列、样本、指标类型、以及 Job 与 Instance帮助读者建立扎实的理论基础。一、什么是 PrometheusPrometheus 是一套开源的系统监控和告警工具包由 SoundCloud 于 2012 年开源。2016 年它加入云原生计算基金会CNCF成为继 Kubernetes 之后第二个从 CNCF 毕业的项目。与传统监控系统不同Prometheus 采用Pull拉取模型即 Prometheus 服务器主动从被监控的目标服务中拉取指标数据。这种设计使得服务发现和动态配置更加灵活特别适合云原生和微服务架构。Prometheus 从根本上存储的所有数据都是时间序列数据Time Series Data。正是这个简单而强大的数据模型赋予了 Prometheus 卓越的查询和分析能力。二、时间序列Time Series2.1 什么是时间序列在 Prometheus 中时间序列是指属于相同指标名称和相同标签维度的一组带时间戳的值流。简单来说时间序列就是一个随时间不断更新的数据流。每个时间序列都由以下两部分共同唯一标识指标名称Metric Name描述被监控事物的整体特征标签Labels一组键值对用于进一步细分数据维度例如下面就是一个完整的时间序列标识texthttp_requests_total{jobapi-server, instance10.0.0.1:443, methodGET}指标名称http_requests_totalHTTP 请求总数标签jobapi-server、instance10.0.0.1:443、methodGET重要原则标签的组合直接决定了时间序列的数量。每一组唯一的标签组合都会创建一个新的时间序列。因此在设计标签时应谨慎避免使用无界标签如用户 ID、请求 ID否则会导致时间序列数量爆炸严重影响 Prometheus 性能。2.2 时间序列的组成从数据结构上看每个时间序列由三部分组成组成部分说明指标名称标识被监控的对象如http_requests_total、cpu_usage标签集一组键值对用于多维度的细分和过滤样本序列按时间排序的多个样本值见下文Prometheus 会将所有采集到的样本数据以时间序列的方式保存在内存数据库 TSDB 中并定期持久化到硬盘。三、样本Sample3.1 什么是样本样本Sample是时间序列的基本数据单位。如果把时间序列比作一条随时间延伸的线那么样本就是这条线上的一个个数据点。Prometheus 每次从目标抓取数据得到的结果就是一个或多个样本。每个样本由三部分组成text样本 度量名称 标签集 值 时间戳具体来说每个样本包含时间戳Timestamp精确到毫秒的 Unix 时间戳表示数据采集的时间点度量名称Metric Name该样本所属的指标名称标签Labels一组键值对用于区分不同的数据维度度量值Value一个 float64 类型的浮点数3.2 样本示例下面是一个完整的 Prometheus 样本texthttp_requests_total{methodGET, status200, jobapi-server, instanceserver1} 10234 1617902462000这个样本的含义是组成部分值说明度量名称http_requests_totalHTTP 请求总数标签methodGETHTTP 方法为 GET标签status200响应状态码为 200标签jobapi-server属于 api-server 任务标签instanceserver1来自 server1 实例值10234累计请求数为 10234时间戳1617902462000采集时间毫秒级 Unix 时间戳注意job和instance这两个标签是由 Prometheus 在抓取时自动生成并附加到样本上的用于标识数据的来源。四、指标的四种类型Prometheus 的客户端库提供了四种核心指标类型。需要特别说明的是Prometheus 服务端本身并不区分这些类型而是将所有指标统一视为无类型的时间序列。这些类型主要服务于客户端库的 API 设计和在线传输协议帮助开发者选择合适的接口上报数据。4.1 Counter计数器Counter是一种单调递增的指标类型它的值只能增加或在进程重启时重置为 0。核心特点只增不减除非重启重置适合统计发生了多少次典型使用场景HTTP 请求总数错误发生次数消息队列处理的消息数磁盘 I/O 操作次数命名惯例Counter 类型指标通常以_total结尾。示例text# HELP http_requests_total Total number of HTTP API requests # TYPE http_requests_total counter http_requests_total{apiadd_product, status200} 4633433 http_requests_total{apiadd_product, status500} 12345PromQL 查询技巧Counter 的绝对值本身意义有限通常结合rate()或increase()函数计算速率或增量promql# 过去5分钟内每秒的平均请求数 rate(http_requests_total{apiadd_product}[5m])4.2 Gauge仪表盘Gauge是一种可以任意增减的指标类型用于表示可以上下波动的瞬时值。核心特点可增可减反映当前状态而非累计值典型使用场景CPU 使用率内存占用量当前在线用户数队列长度温度示例text# HELP node_memory_MemFree_bytes Memory free in bytes # TYPE node_memory_MemFree_bytes gauge node_memory_MemFree_bytes 24567889924.3 Histogram直方图Histogram用于观察和分析样本值的分布情况。它通过将数据计入可配置的存储桶bucket中来统计分布。核心特点将观察值按预设的桶边界进行分组计数同时提供所有样本的总和sum和总数count适合分析请求延迟、响应大小等典型使用场景API 响应时间分布请求大小分布任何需要了解值落在哪个区间的指标工作原理Histogram 会生成多个时间序列basename_bucket{le上边界}值 ≤ 上边界的样本数量basename_sum所有样本值的总和basename_count样本总数长尾问题平均值往往会掩盖极端值。例如大多数请求响应都在 100ms 以内但个别请求需要 5 秒平均值可能仍然看起来不错。Histogram 通过分桶统计可以精准定位这类长尾问题。4.4 Summary摘要Summary与 Histogram 类似也用于分析样本分布。但两者的实现方式有本质区别对比维度HistogramSummary分位数计算位置服务端Prometheus 服务器客户端被监控的应用分位数精度估算值基于桶精确值是否可聚合✅ 可聚合多个实例的数据❌ 不可跨实例聚合灵活性桶边界可配置分位数可配置典型使用场景需要精确分位数的场景如 SLO 监控不需要跨实例聚合分位数的场景选择建议需要聚合多个实例的分位数 → 选择Histogram需要精确分位数且不跨实例聚合 → 选择Summary4.5 四种指标类型速查表类型变化特性典型场景关键操作Counter只增不减重启归零请求总数、错误次数Inc()Gauge可增可减CPU 使用率、内存占用、在线人数Set()、Inc()、Dec()Histogram分桶计数 总和API 响应时间分布Observe()Summary客户端分位数精确分位数统计Observe()五、Job 与 Instance5.1 基本概念在 Prometheus 的术语中Instance实例一个可以被抓取的目标端点Endpoint通常对应一个单独的进程Job任务一组具有相同用途的 Instance 的集合例如为了可扩展性或可靠性而复制的进程简单来说Instance 是抓取的目标Job 是目标的集合。5.2 举例说明假设我们有一个 API 服务器服务为了高可用部署了 4 个副本实例textJob任务api-server ├── Instance 11.2.3.4:5670 ├── Instance 21.2.3.4:5671 ├── Instance 35.6.7.8:5670 └── Instance 45.6.7.8:5671在这个例子中api-server是一个Job代表API 服务器这个服务4 个不同 IP 和端口的进程是Instance代表该服务的具体运行实例5.3 Prometheus 自动生成的标签当 Prometheus 抓取一个目标时会自动附加两个关键标签到所有采集的时间序列上标签来源说明job配置文件中的job_name目标所属的任务名称instance目标 URL 的host:port部分具体被抓取的实例地址例如抓取配置为yamlscrape_configs: - job_name: api-server static_configs: - targets: [1.2.3.4:5670, 1.2.3.4:5671]所有从这些目标采集的样本都会自动带上jobapi-server和对应的instance1.2.3.4:5670等标签。5.4 自动生成的运维指标对于每一次实例抓取Prometheus 还会自动存储以下时间序列指标名称说明up{job..., instance...}实例是否健康可达1正常0失败scrape_duration_seconds{...}本次抓取的耗时scrape_samples_scraped{...}目标暴露的样本数量scrape_series_added{...}本次抓取新增的时间序列数量其中up指标最为常用可用于监控所有实例的可用性状态。5.5 Job 与 Instance 的关系图解text┌─────────────────────────────────────────────────────┐ │ Job: api-server │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Instance 1 │ │ Instance 2 │ ── 自动添加 │ │ │1.2.3.4:5670│ │1.2.3.4:5671│ jobapi-server │ │ └─────────────┘ └─────────────┘ instance... │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ Instance 3 │ │ Instance 4 │ │ │ │5.6.7.8:5670│ │5.6.7.8:5671│ │ │ └─────────────┘ └─────────────┘ │ └─────────────────────────────────────────────────────┘总结本文系统介绍了 Prometheus 的五大核心概念时间序列Time Series由指标名称和标签共同唯一标识的数据流是 Prometheus 数据模型的基础。样本Sample时间序列中的单个数据点由时间戳和 float64 数值组成是 Prometheus 存储的基本单位。四种指标类型Counter只增不减适合计数Gauge可增可减适合反映瞬时状态Histogram分桶统计分布服务端计算分位数Summary客户端计算分位数精确但不可聚合Instance实例被抓取的目标端点通常对应一个进程。Job任务一组相同用途的 Instance 集合。理解这些概念是掌握 Prometheus 监控体系的基石。无论是配置抓取任务、编写 PromQL 查询还是设计自定义监控指标都离不开对这些核心概念的深刻理解。后续的文章中我们将进一步深入 Prometheus 的安装部署、配置详解和 PromQL 查询实战。