1496 lines
81 KiB
Markdown
1496 lines
81 KiB
Markdown
# Prometheus 知识学习手册 · 第 1 篇:入门与架构
|
||
|
||
> 基于 [prometheus.io 官方文档](https://prometheus.io/docs/introduction/overview/) 整理
|
||
> 文档版本:Prometheus v3.15.0(最新稳定版,2026-10 发布)| 抓取日期:2026-10-08
|
||
> 数据来源:prometheus/prometheus@v3.15.0、prometheus/alertmanager、prometheus/docs 官方仓库源文件(与官网 latest 内容一致)
|
||
>
|
||
> **全册结构(共 4 篇)**
|
||
> - **第 1 篇:入门与架构** ← 本篇
|
||
> - 第 2 篇:PromQL 与查询
|
||
> - 第 3 篇:配置与运维
|
||
> - 第 4 篇:Alertmanager 与生态(告警、插桩、可视化、规范)
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [第 1 章 概述](#第-1-章-概述)
|
||
- [1.1 Prometheus 是什么](#11-prometheus-是什么)
|
||
- [1.2 解决什么问题](#12-解决什么问题)
|
||
- [1.3 核心特点](#13-核心特点)
|
||
- [1.4 适用场景:何时该用、何时不该用](#14-适用场景何时该用何时不该用)
|
||
- [1.5 竞品对比](#15-竞品对比)
|
||
- [第 2 章 快速上手](#第-2-章-快速上手)
|
||
- [2.1 环境要求](#21-环境要求)
|
||
- [2.2 下载与安装](#22-下载与安装)
|
||
- [2.3 5 分钟跑通](#23-5-分钟跑通)
|
||
- [2.4 官方 Hello World 教程完整步骤](#24-官方-hello-world-教程完整步骤)
|
||
- [2.5 验证安装成功](#25-验证安装成功)
|
||
- [2.6 常见启动问题](#26-常见启动问题)
|
||
- [第 3 章 核心概念](#第-3-章-核心概念)
|
||
- [3.1 数据模型详解](#31-数据模型详解)
|
||
- [3.2 四种指标类型](#32-四种指标类型)
|
||
- [3.3 Jobs 与 Instances](#33-jobs-与-instances)
|
||
- [3.4 术语表](#34-术语表)
|
||
- [第 4 章 架构与设计](#第-4-章-架构与设计)
|
||
- [4.1 设计哲学与动机](#41-设计哲学与动机)
|
||
- [4.2 整体架构与组件关系](#42-整体架构与组件关系)
|
||
- [4.3 Agent 模式(对比 Server 模式)](#43-agent-模式对比-server-模式)
|
||
- [4.4 API 稳定性承诺](#44-api-稳定性承诺)
|
||
- [第 5 章 生态与版本](#第-5-章-生态与版本)
|
||
- [5.1 路线图](#51-路线图)
|
||
- [5.2 发布周期与 LTS 策略](#52-发布周期与-lts-策略)
|
||
- [5.3 学习资源](#53-学习资源)
|
||
- [5.4 官方 FAQ 整理](#54-官方-faq-整理)
|
||
- [附录:本篇覆盖清单](#附录本篇覆盖清单)
|
||
|
||
---
|
||
|
||
## 第 1 章 概述
|
||
|
||
### 1.1 Prometheus 是什么
|
||
|
||
`Prometheus` 是一个开源的**系统监控与告警工具箱**(monitoring and alerting toolkit)。
|
||
|
||
- 最初由 `SoundCloud` 构建,**2012 年**启动。
|
||
- **2016 年**作为继 `Kubernetes` 之后**第二个**托管项目加入 `Cloud Native Computing Foundation`(CNCF,cncf.io)。
|
||
- 现为**独立开源项目**,独立于任何公司维护。
|
||
- 它是 `Kubernetes` 唯一直接支持的系统监控方案,也是云原生生态的事实标准。
|
||
|
||
其数据本质是:以**时间序列数据(time series data)**采集并存储指标——即每条指标信息都带记录时的时间戳,并附带可选的键值对 `labels`。
|
||
|
||
> 💡 补充:Prometheus 的“复数”在官方 FAQ 中经研究确定为 **Prometheis**;记不住时可直接用 “Prometheus instances”。
|
||
|
||
> 引自:[Overview](https://prometheus.io/docs/introduction/overview/) | [Frequently asked questions](https://prometheus.io/docs/introduction/faq/) | [Getting started with Prometheus](https://prometheus.io/docs/tutorials/getting_started/)
|
||
|
||
### 1.2 解决什么问题
|
||
|
||
要理解 Prometheus 解决什么问题,先理解 **metrics(指标)** 与 **time series(时间序列)**。
|
||
|
||
- **metrics**:通俗意义上的**数值测量**。
|
||
- **time series**:随时间变化的记录。
|
||
|
||
**为什么需要它**:不同应用关心的测量内容不同——
|
||
|
||
| 系统类型 | 典型关注指标 |
|
||
| --- | --- |
|
||
| Web 服务器 | 请求耗时(request times) |
|
||
| 数据库 | CPU 使用率、活跃连接数、活跃查询数 |
|
||
|
||
以“Web 服务器变慢”为例:请求计数(request count)指标显示请求量变高,据此即可判断“变慢是因为请求量高”,并据此扩容服务器。
|
||
|
||
官方教程给出的指标定义自问法(非常实用):
|
||
|
||
> **“what all information will be important for me to debug if any issue occurs in my application?”**
|
||
> (如果我的应用出了问题,哪些信息对调试重要?)
|
||
|
||
Prometheus 就是系统化地回答这个问题的工具:定义指标 → 暴露指标 → 抓取存储 → 查询告警。
|
||
|
||
> 引自:[Overview](https://prometheus.io/docs/introduction/overview/) | [Getting started with Prometheus](https://prometheus.io/docs/tutorials/getting_started/)
|
||
|
||
### 1.3 核心特点
|
||
|
||
官方 Overview 列出的核心特性(Features)逐条如下:
|
||
|
||
| # | 特性 | 说明 |
|
||
| --- | --- | --- |
|
||
| 1 | 多维数据模型(multi-dimensional data model) | 时间序列由 `metric name` 与 key/value pairs(即 labels)标识 |
|
||
| 2 | `PromQL` | 灵活查询语言,用于充分利用该多维性 |
|
||
| 3 | 单节点自治 | 不依赖分布式存储,single server nodes are autonomous |
|
||
| 4 | Pull 模型采集 | 时间序列采集通过 HTTP 上的 **pull model** 完成 |
|
||
| 5 | 支持 Push | 通过中间网关(**push gateway**)支持推送时间序列 |
|
||
| 6 | 服务发现 | targets 通过 **service discovery** 或静态配置(static configuration)发现 |
|
||
| 7 | 多种可视化 | 支持多种绘图(graphing)与仪表盘(dashboarding)模式 |
|
||
|
||
**可靠性定位**:Prometheus 的设计目标是**可靠性**——它是故障时快速诊断的首选系统。每个 Prometheus server 都是独立的,不依赖网络存储或其他远程服务,因此即使基础设施的其他部分损坏,Prometheus 仍可依赖,而且无需搭建大量基础设施。
|
||
|
||
> 💡 补充(来自官方 FAQ):Prometheus 的取舍是最看重“**可靠地把告警送达人类**”(reliably delivering alerts to humans)。这一点在第 1.4 节“何时不该用”中会看到其反面影响。
|
||
|
||
> 引自:[Overview](https://prometheus.io/docs/introduction/overview/)
|
||
|
||
### 1.4 适用场景:何时该用、何时不该用
|
||
|
||
#### 何时该用(When does it fit)
|
||
|
||
- **适合记录任何纯数值的时间序列**。
|
||
- 既适配**以机器为中心的监控**(machine-centric monitoring),也适配**高度动态的面向服务架构**(highly dynamic service-oriented architectures)。
|
||
- 在**微服务**场景下,多维数据采集与多维查询是显著优势。
|
||
- 需要**高可靠性、快速故障诊断**的场景——Prometheus server 独立自治,不依赖网络存储或远程服务。
|
||
|
||
#### 何时不该用(When does it not fit)
|
||
|
||
- Prometheus **重可靠性而非 100% 准确性**。
|
||
- 若需要 **100% 准确**(典型例子:**按请求计费 per-request billing**),**不适合**——因为采集的数据可能不够详尽、不够完整。
|
||
- 正确做法:**另用一个系统专门做计费数据采集**,Prometheus 负责其余监控。
|
||
|
||
#### 选择决策速查表
|
||
|
||
| 你的需求 | 是否适合 Prometheus | 说明 |
|
||
| --- | --- | --- |
|
||
| 记录纯数值时间序列 | ✅ 适合 | 核心用例 |
|
||
| 机器/主机监控 | ✅ 适合 | 配合 Node Exporter |
|
||
| 高度动态的云原生 / 微服务 | ✅ 适合 | 多维模型 + 服务发现 |
|
||
| 需要可靠的告警送达 | ✅ 适合 | 设计目标即“可靠地把告警送达人类” |
|
||
| 按请求计费(per-request billing) | ❌ 不适合 | 需 100% 准确,另建专用系统 |
|
||
| 日志/事件采集 | ❌ 不适合 | 见 FAQ:应改用 `Grafana Loki` 或 `OpenSearch` |
|
||
| 长期历史数据(超单节点容量) | ⚠️ 需外部方案 | 借助 remote write 到长期存储系统(如 Thanos 等) |
|
||
|
||
> 引自:[Overview](https://prometheus.io/docs/introduction/overview/) | [Frequently asked questions](https://prometheus.io/docs/introduction/faq/)
|
||
|
||
### 1.5 竞品对比
|
||
|
||
本节基于官方 [Comparison to alternatives](https://prometheus.io/docs/introduction/comparison/) 页面整理,对比 Prometheus 与 Graphite、InfluxDB、OpenTSDB、Nagios、Sensu 等系统。
|
||
|
||
#### 1.5.1 总览对比表
|
||
|
||
| 维度 | Prometheus | Graphite | InfluxDB | OpenTSDB | Nagios | Sensu |
|
||
| --- | --- | --- | --- | --- | --- | --- |
|
||
| 类型 | 完整监控与告警系统 | 被动时序数据库 + 查询 + 绘图 | 开源时序数据库(有商用集群版) | 基于 Hadoop/HBase 的分布式时序库 | 基于脚本 exit code 的告警系统 | 开源可观测性 pipeline |
|
||
| 主动抓取 | ✅ 内置 | ❌ 交给外部组件 | ❌ 需外部 | ❌ 需外部 | 主动 check(脚本) | ✅ 事件驱动 |
|
||
| 查询语言 | `PromQL`(强,支持聚合/切片/预测/join) | 有查询语言(弱于 PromQL) | 有(弱于 PromQL) | API 仅支持简单聚合与数学运算 | ❌ 无查询语言 | 有限 |
|
||
| 多维标签 | ✅ labels(key-value,显式) | ❌ 点分 metric name 隐式编码 | ✅ 称 `tags`(另有 `fields`) | ✅ 称 `tags`(同 Prometheus labels) | ❌ 无 labels 概念 | ✅ labels/annotations |
|
||
| 告警/通知 | ✅ Alertmanager(分组、去重、静默、限流) | ❌ 交给外部 | 需搭配 `Kapacitor` | ❌ | ✅ 但无分组/路由/去重 | ✅ 事件处理强 |
|
||
| 存储 | 本地 TSDB(block + WAL),接受任意间隔样本 | `Whisper`(RRD 风格,要求固定间隔,过期覆盖) | 时间分片 LSM tree + WAL | Hadoop/HBase 之上 | 除当前状态外无存储 | 嵌入式 `etcd` 或外部 `PostgreSQL` |
|
||
| 水平扩展 | 单节点自治,超容量需按边界显式分片 | 集群方案更成熟适合长历史 | 商用版分布式集群,易水平扩展 | 易水平扩展(需运维 Hadoop/HBase) | 单 server,文件配置 | 组件可集群 |
|
||
| 开源模式 | 完全开源、独立项目 | 开源 | open-core(单一商业公司) | 开源 | 开源 | open-core(单一商业公司) |
|
||
|
||
#### 1.5.2 vs. Graphite
|
||
|
||
- **Scope(范围)**:Graphite 侧重做被动的时序数据库 + 查询语言 + 绘图,其他关注点交给外部组件。Prometheus 是**全套监控与趋势系统**,内置主动抓取、存储、查询、绘图、基于时序数据的告警;它知道“世界应是什么样”(哪些端点应存在、哪些时序模式意味着异常)并主动找故障。
|
||
- **Data model(数据模型)**:Graphite 存的是命名时序的数值样本。Graphite 用点分隔的 metric name **隐式编码维度**;Prometheus 则用显式的 key-value pairs(`labels`)附加于 metric name,便于按标签过滤、分组、匹配。Graphite 搭配 StatsD 时常只存所有实例的**聚合数据**,不保留 instance 维度,**无法下钻到具体问题实例**。
|
||
|
||
编码示例对比:
|
||
|
||
```text
|
||
# Graphite/StatsD 编码(仅一个聚合值,丢失实例维度)
|
||
stats.api-server.tracks.post.500 -> 93
|
||
```
|
||
|
||
```text
|
||
# Prometheus 编码(假设三个 api-server 实例,可下钻到实例)
|
||
api_server_http_requests_total{method="POST",handler="/tracks",status="500",instance="<sample1>"} -> 34
|
||
api_server_http_requests_total{method="POST",handler="/tracks",status="500",instance="<sample2>"} -> 28
|
||
api_server_http_requests_total{method="POST",handler="/tracks",status="500",instance="<sample3>"} -> 31
|
||
```
|
||
|
||
- **Storage(存储)**:Graphite 用 `Whisper` 格式存本地磁盘,RRD 风格,**要求样本按固定间隔到达**;每个时序单独一个文件,过时后新样本覆盖旧样本。Prometheus 本地 TSDB 用**内存 head**(由 write-ahead log 保护)保存近期样本,再以**基于时间的 block 目录**持久化(含 chunks 目录、index 与 metadata),**接受任意间隔的样本**;保留期可配置,适合大量短生命周期、频繁变化的时序。
|
||
- **Summary**:Prometheus 数据模型与查询语言更丰富、更易运行集成;若需要**可长期持有历史数据的集群方案**,Graphite 可能更合适。
|
||
|
||
#### 1.5.3 vs. InfluxDB
|
||
|
||
- InfluxDB 是开源时序数据库,有商用扩展/集群选项;其项目**发布晚于 Prometheus 开发开始近一年**。公平比较需连同 `Kapacitor` 一起看(两者合计对应 Prometheus + Alertmanager 的问题域)。
|
||
- **功能对应关系**:
|
||
|
||
| InfluxDB 侧能力 | Prometheus 侧对应 |
|
||
| --- | --- |
|
||
| InfluxDB continuous queries | Prometheus recording rules |
|
||
| Kapacitor 全部范围 | Prometheus recording rules + alerting rules + Alertmanager 通知功能 |
|
||
|
||
Prometheus 查询语言更强;Alertmanager 另有分组、去重、静默。
|
||
- **Data model / storage**:InfluxDB 的 labels 称 `tags`,另有二级 labels 称 `fields`(用途更受限);支持最高**纳秒**分辨率时间戳,类型 float64、int64、bool、string。Prometheus 支持 **float64**(字符串支持有限)与**毫秒**分辨率时间戳。InfluxDB 用按时间分片的 log-structured merge tree + write ahead log,更适合事件日志;Prometheus 基于 block 的本地 TSDB **针对监控时序优化**。
|
||
- **Architecture**:Prometheus server 各自独立运行,核心功能(抓取、规则处理、告警)**仅依赖本地存储**;开源版 InfluxDB 类似。商用 InfluxDB 按设计是分布式存储集群(存储与查询由多节点处理),更易水平扩展但**需从一开始管理分布式存储复杂性**;Prometheus 更易运行,但超单节点容量后需按 scalability 边界(产品、服务、数据中心等)**显式分片**。独立 server(可并行冗余运行)带来更好可靠性与故障隔离。
|
||
- **Kapacitor**:开源版无内置 rules/alerting/notifications 的分布式/冗余选项,可由用户手动分片扩展;Influx 提供 Enterprise Kapacitor 支持 HA/冗余告警。Prometheus 与 Alertmanager 则通过**运行冗余 Prometheus 副本 + Alertmanager 高可用模式**,提供**完全开源**的冗余选项。
|
||
- **Summary**:
|
||
- 相似处:都用 labels(InfluxDB 称 `tags`)支持多维指标;都用基本相同的数据压缩算法;都有广泛集成(包括互相);都有扩展钩子。
|
||
- InfluxDB 更优:做事件日志时;商用版聚类更适合长期数据存储;副本间最终一致视图。
|
||
- Prometheus 更优:主要做 metrics 时;查询语言、告警、通知更强;绘图与告警的可用性与 uptime 更高。
|
||
- 维护模式:InfluxDB 由单一商业公司按 open-core 模式维护(闭源聚类、托管、支持等增值功能);Prometheus 是**完全开源独立项目**。
|
||
|
||
#### 1.5.4 vs. OpenTSDB
|
||
|
||
- 基于 `Hadoop` 与 `HBase` 的分布式时序数据库。Scope 差异同 Graphite 处。
|
||
- **Data model**:与 Prometheus **几乎相同**——时序由任意 key-value pairs 标识(OpenTSDB `tags` = Prometheus `labels`)。某 metric 的全部数据存于一起,**限制 metric 基数(cardinality)**。差异:Prometheus 允许 label value 使用任意字符,OpenTSDB 更受限;OpenTSDB **缺少完整查询语言**,API 仅支持简单聚合与数学运算。
|
||
- **Storage**:OpenTSDB 存储实现在 Hadoop/HBase 之上,易水平扩展,但需**从头接受运行 Hadoop/HBase 集群的复杂性**;Prometheus 初期更易运行,但超过单节点容量后需显式分片。
|
||
- **Summary**:Prometheus 查询语言丰富、可处理更高基数、是完整监控系统的一部分;若**已运行 Hadoop** 且更看重长期存储,OpenTSDB 是好选择。
|
||
|
||
#### 1.5.5 vs. Nagios
|
||
|
||
- 起源于 1990 年代(名为 **NetSaint**)。
|
||
- **Scope**:主要基于**脚本 exit codes** 告警,称为 "checks";可静默单个告警,但**无分组、路由或去重**。插件生态丰富(如将 perfData 管道到 Graphite 等时序库,或用 `NRPE` 在远程机器执行 checks)。
|
||
- **Data model**:以 **host** 为基础,每 host 可含一个或多个 services,每 service 执行一个 check;**无 labels 概念,无查询语言**。
|
||
- **Storage**:除当前 check 状态外**无存储**;有插件可存储数据用于可视化。
|
||
- **Architecture**:Nagios server 独立;所有 check 配置通过文件。
|
||
- **Summary**:适合**小型/静态系统**的基础监控(blackbox probing 足够时)。若做 **whitebox monitoring** 或环境**动态/基于云**,选 Prometheus。
|
||
|
||
#### 1.5.6 vs. Sensu
|
||
|
||
- 开源监控与可观测性 pipeline,有商用发行版提供扩展性功能,**可复用现有 Nagios 插件**。
|
||
- **Scope**:是 observability pipeline,侧重把可观测性数据作为 `Events` 流处理与告警,提供可扩展框架用于 event filtering、aggregation、transformation、processing(含向其他系统发告警、把事件存到第三方系统)。其事件处理能力范围类似 **Prometheus alerting rules + Alertmanager**。
|
||
- **Data model**:Sensu `Events` 以结构化格式表示服务健康与/或 metrics,由 `entity` 名(如 server、云实例、container 或 service)、event name 及可选 key-value metadata(称 "labels" 或 "annotations")标识。Event payload 可含一个或多个 metric `points`,以 JSON 对象表示,含 `name`、`tags`(key/value pairs)、`timestamp`、`value`(总是 float)。
|
||
- **Storage**:当前与近期事件状态信息及实时 inventory 存于嵌入式数据库(`etcd`)或外部 RDBMS(`PostgreSQL`)。
|
||
- **Architecture**:所有组件可集群,以实现高可用与更高事件处理吞吐。
|
||
- **Summary**:
|
||
- 共同点:都有可扩展的动态云环境发现机制;都支持通过 labels/annotations 收集多维指标;都有广泛集成;Sensu 原生支持从所有 Prometheus exporters 收集指标;都可转发可观测性数据到第三方平台。
|
||
- Sensu 更优:收集处理**混合**可观测性数据(metrics 与/或 events);整合多监控工具且需支持 metrics 与 Nagios 风格插件/check 脚本;事件处理平台更强。
|
||
- Prometheus 更优:主要**收集与评估 metrics**;监控**同构 Kubernetes 基础设施**(若 100% 工作负载在 K8s,Prometheus 的 K8s 集成更好);查询语言更强且内置历史数据分析支持。
|
||
- 维护模式:Sensu 由单一商业公司按 open-core 模式维护;Prometheus 是完全开源独立项目。
|
||
|
||
> 引自:[Comparison to alternatives](https://prometheus.io/docs/introduction/comparison/) | [Frequently asked questions](https://prometheus.io/docs/introduction/faq/)
|
||
|
||
---
|
||
|
||
## 第 2 章 快速上手
|
||
|
||
### 2.1 环境要求
|
||
|
||
- Prometheus 使用 **`Go`** 编写,**只需对应操作系统的编译二进制**即可运行。
|
||
- 运行只需两样东西:**二进制 + 配置文件**(配置文件使用 **YAML** 格式)。
|
||
- 官方为多数 Prometheus 组件提供**预编译二进制**(precompiled binaries)。
|
||
|
||
> 💡 补充(工程经验,非官方原文):Prometheus 官方只发布 Linux/macOS/Windows 的可执行文件,本身是静态编译的单一二进制,无需额外运行时依赖。生产环境建议运行在 Linux 服务器上,并为其预留独立的数据盘(TSDB 数据目录 `--storage.tsdb.path`,默认 `./data`)。
|
||
|
||
> 引自:[Installation](https://prometheus.io/docs/prometheus/latest/installation/) | [Getting started with Prometheus](https://prometheus.io/docs/tutorials/getting_started/) | [Getting started](https://prometheus.io/docs/prometheus/latest/getting_started/)
|
||
|
||
### 2.2 下载与安装
|
||
|
||
官方 Installation 页面给出的安装方式逐条如下。
|
||
|
||
#### 2.2.1 方式一:预编译二进制
|
||
|
||
- 为多数官方 Prometheus 组件提供预编译二进制,版本列表见 <https://prometheus.io/download>。
|
||
- 下载后解包:
|
||
|
||
```bash
|
||
tar xvfz prometheus-*.tar.gz
|
||
cd prometheus-*
|
||
```
|
||
|
||
- 服务器为**单一二进制** `prometheus`(Windows 下为 `prometheus.exe`)。用 `--help` 查看所有选项:
|
||
|
||
```bash
|
||
./prometheus --help
|
||
usage: prometheus [<flags>]
|
||
|
||
The Prometheus monitoring server
|
||
|
||
. . .
|
||
```
|
||
|
||
> 💡 补充(来自官方 Tutorials 教程):也可下载后把二进制目录加入系统 `PATH`,之后即可直接以 `prometheus --config.file=prometheus.yml` 启动。
|
||
|
||
#### 2.2.2 方式二:从源码构建
|
||
|
||
- 见各仓库的 `Makefile` targets(例如 prometheus/prometheus 仓库)。
|
||
|
||
#### 2.2.3 方式三:Docker
|
||
|
||
- 所有 Prometheus 服务提供 Docker 镜像,位于 [Quay.io](https://quay.io/repository/prometheus/prometheus) 或 [Docker Hub](https://hub.docker.com/r/prom/prometheus/)。
|
||
- 最简启动(以示例配置启动并暴露 9090 端口):
|
||
|
||
```bash
|
||
docker run -p 9090:9090 prom/prometheus
|
||
```
|
||
|
||
- **镜像使用 volume 存储实际 metrics**。生产部署**强烈建议使用 named volume**,以便升级时管理数据。
|
||
- **命令行参数注意**:镜像以若干默认命令行参数启动(可在 Dockerfile 中查看);若想追加参数,需**自行重新加上原有参数**,否则会被覆盖。
|
||
|
||
**挂载配置示例(二选一)**:
|
||
|
||
```bash
|
||
# 只挂载单个配置文件
|
||
docker run -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
|
||
|
||
# 挂载整个配置目录
|
||
docker run -p 9090:9090 -v /path/to/config:/etc/prometheus prom/prometheus
|
||
```
|
||
|
||
**保存数据(持久化)**:数据存于容器内 `/prometheus` 目录,**容器重启即清空**;需设置持久化存储:
|
||
|
||
```bash
|
||
docker volume create prometheus-data
|
||
docker run -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml -v prometheus-data:/prometheus prom/prometheus
|
||
```
|
||
|
||
**自定义镜像(把配置烤入镜像)**:
|
||
|
||
```Dockerfile
|
||
FROM prom/prometheus
|
||
ADD prometheus.yml /etc/prometheus/
|
||
```
|
||
|
||
```bash
|
||
docker build -t my-prometheus .
|
||
docker run -p 9090:9090 my-prometheus
|
||
```
|
||
|
||
- **更高级选项**:启动时用工具动态渲染配置,或由守护进程定期更新。
|
||
|
||
#### 2.2.4 方式四:配置管理系统(第三方贡献)
|
||
|
||
| 工具 | 项目地址 |
|
||
| --- | --- |
|
||
| Ansible | `prometheus-community/ansible` |
|
||
| Chef | `rayrod2030/chef-prometheus` |
|
||
| Puppet | `puppet/prometheus` |
|
||
| SaltStack | `saltstack-formulas/prometheus-formula` |
|
||
|
||
> 引自:[Installation](https://prometheus.io/docs/prometheus/latest/installation/)
|
||
|
||
### 2.3 5 分钟跑通
|
||
|
||
这一节把“下载 → 写配置 → 启动 → 首次查询 → 用 UI”串成一条最小可用路径,素材来自官方 [First steps with Prometheus](https://prometheus.io/docs/introduction/first_steps/)。
|
||
|
||
#### 2.3.1 配置文件详解
|
||
|
||
Prometheus 配置为 **YAML**,下载包自带示例配置 `prometheus.yml`,注释以 `#` 前缀。
|
||
|
||
```yaml
|
||
global:
|
||
scrape_interval: 15s
|
||
evaluation_interval: 15s
|
||
|
||
rule_files:
|
||
# - "first.rules"
|
||
# - "second.rules"
|
||
|
||
scrape_configs:
|
||
- job_name: prometheus
|
||
static_configs:
|
||
- targets: ['localhost:9090']
|
||
```
|
||
|
||
配置由**三个配置块**组成:
|
||
|
||
| 配置块 | 作用 | 关键字段说明 |
|
||
| --- | --- | --- |
|
||
| `global` | 全局默认 | `scrape_interval` 控制抓取频率(本例 15 秒,可**按 target 单独覆盖**);`evaluation_interval` 控制规则求值频率,规则用于创建新时间序列与生成告警 |
|
||
| `rule_files` | 规则文件位置 | 指定要加载的规则文件位置;示例中暂无规则 |
|
||
| `scrape_configs` | 监控哪些资源 | 默认单 job 名为 `prometheus`,抓取 Prometheus server 自身暴露的时间序列;含单个静态配置 target:`localhost` 的 `9090` 端口 |
|
||
|
||
- **默认抓取路径为 `/metrics`**,即完整 URL 为 <http://localhost:9090/metrics>。
|
||
|
||
#### 2.3.2 启动
|
||
|
||
```bash
|
||
./prometheus --config.file=prometheus.yml
|
||
```
|
||
|
||
启动后:
|
||
|
||
- 可在 <http://localhost:9090> 查看自身状态页;
|
||
- 约需 **30 秒**采集自身 HTTP 指标端点数据;
|
||
- 可在 <http://localhost:9090/metrics> 验证。
|
||
|
||
#### 2.3.3 首次查询(表达式浏览器)
|
||
|
||
访问 <http://localhost:9090/query>,选择 **"Table"** 标签页。
|
||
|
||
示例指标 `promhttp_metric_handler_requests_total`(Prometheus 自身已处理的 `/metrics` 请求总数):
|
||
|
||
```promql
|
||
promhttp_metric_handler_requests_total
|
||
```
|
||
|
||
返回若干时间序列(各带最新值):metric name 相同但 labels 不同,labels 用于标识不同请求状态。
|
||
|
||
只查看 HTTP `200`:
|
||
|
||
```promql
|
||
promhttp_metric_handler_requests_total{code="200"}
|
||
```
|
||
|
||
统计返回的时间序列数量:
|
||
|
||
```promql
|
||
count(promhttp_metric_handler_requests_total)
|
||
```
|
||
|
||
#### 2.3.4 UI 使用(绘图界面)
|
||
|
||
- 访问 <http://localhost:9090/query> 的 **"Graph"** 标签页。
|
||
- 示例(每秒 200 状态码请求速率):
|
||
|
||
```promql
|
||
rate(promhttp_metric_handler_requests_total{code="200"}[1m])
|
||
```
|
||
|
||
- 在 <http://localhost:9090/targets>(或 **Status → Target health**)查看各 target 健康状态。
|
||
|
||
#### 2.3.5 监控其他 target
|
||
|
||
- 建议参考其他 exporter 文档,起点为官方指南 **`Monitoring Linux or macOS host metrics using a node exporter`**(<https://prometheus.io/docs/guides/node-exporter/>)。
|
||
|
||
> 引自:[First steps with Prometheus](https://prometheus.io/docs/introduction/first_steps/)
|
||
|
||
### 2.4 官方 Hello World 教程完整步骤
|
||
|
||
本节按官方 [Getting started](https://prometheus.io/docs/prometheus/latest/getting_started/)(核心文档中的 “Hello World” 式教程)的完整流程展开:下载并在本地运行 Prometheus,配置其抓取自身与一个示例应用,再通过查询、规则、图表使用采集到的时序数据。
|
||
|
||
#### 2.4.1 步骤 1:下载并解包
|
||
|
||
```bash
|
||
tar xvfz prometheus-*.tar.gz
|
||
cd prometheus-*
|
||
```
|
||
|
||
#### 2.4.2 步骤 2:编写自监控配置
|
||
|
||
保存为 `prometheus.yml`:
|
||
|
||
```yaml
|
||
global:
|
||
scrape_interval: 15s # By default, scrape targets every 15 seconds.
|
||
external_labels:
|
||
monitor: 'codelab-monitor'
|
||
scrape_configs:
|
||
- job_name: 'prometheus'
|
||
scrape_interval: 5s
|
||
static_configs:
|
||
- targets: ['localhost:9090']
|
||
```
|
||
|
||
要点:`global.scrape_interval` 全局 15s;job 级 `scrape_interval: 5s` **覆盖**全局值;`external_labels` 添加 `monitor: 'codelab-monitor'`。
|
||
|
||
#### 2.4.3 步骤 3:启动
|
||
|
||
```bash
|
||
./prometheus --config.file=prometheus.yml
|
||
```
|
||
|
||
- 默认数据库存于 `./data`(flag `--storage.tsdb.path`)。
|
||
- 状态页:<http://localhost:9090>
|
||
- metrics 端点:<http://localhost:9090/metrics>
|
||
|
||
#### 2.4.4 步骤 4:用表达式浏览器探索数据
|
||
|
||
访问 <http://localhost:9090/query> 并选择 **"Graph"** 标签页:
|
||
|
||
```promql
|
||
prometheus_target_interval_length_seconds
|
||
```
|
||
|
||
```promql
|
||
prometheus_target_interval_length_seconds{quantile="0.99"}
|
||
```
|
||
|
||
```promql
|
||
count(prometheus_target_interval_length_seconds)
|
||
```
|
||
|
||
其中 `prometheus_target_interval_length_seconds` 表示 target 抓取之间的实际耗时。
|
||
|
||
绘图示例:
|
||
|
||
```promql
|
||
rate(prometheus_tsdb_head_chunks_created_total[1m])
|
||
```
|
||
|
||
#### 2.4.5 步骤 5:启动示例 target(Node Exporter)
|
||
|
||
```bash
|
||
tar -xzvf node_exporter-*.*.tar.gz
|
||
cd node_exporter-*.*
|
||
./node_exporter --web.listen-address 127.0.0.1:8080
|
||
./node_exporter --web.listen-address 127.0.0.1:8081
|
||
./node_exporter --web.listen-address 127.0.0.1:8082
|
||
```
|
||
|
||
#### 2.4.6 步骤 6:将多个端点归入一个 job 并分组
|
||
|
||
将三个端点归入一个名为 `node` 的 job,前两个为 production、第三个为 canary:
|
||
|
||
```yaml
|
||
scrape_configs:
|
||
- job_name: 'node'
|
||
scrape_interval: 5s
|
||
static_configs:
|
||
- targets: ['localhost:8080', 'localhost:8081']
|
||
labels:
|
||
group: 'production'
|
||
- targets: ['localhost:8082']
|
||
labels:
|
||
group: 'canary'
|
||
```
|
||
|
||
在 <http://localhost:9090/targets> 或 **Status → Target health** 查看:三个端点状态应为 `UP`;若为 `DOWN`,检查对应端口上 Node Exporter 是否仍在运行。
|
||
|
||
示例返回序列:
|
||
|
||
```promql
|
||
node_cpu_seconds_total{cpu="0",group="production",instance="localhost:8080",job="node",mode="idle"}
|
||
```
|
||
|
||
在查询选项菜单(表达式输入框右侧三点按钮)→ **Explore metrics** 可浏览全部 metric name。
|
||
|
||
#### 2.4.7 步骤 7:定义 Recording rule
|
||
|
||
将表达式 `avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))` 预录为 `job_instance_mode:node_cpu_seconds:avg_rate5m`,保存为 `prometheus.rules.yml`:
|
||
|
||
```yaml
|
||
groups:
|
||
- name: cpu-node
|
||
rules:
|
||
- record: job_instance_mode:node_cpu_seconds:avg_rate5m
|
||
expr: avg by (job, instance, mode) (rate(node_cpu_seconds_total[5m]))
|
||
```
|
||
|
||
在 `prometheus.yml` 中:
|
||
|
||
- 加入 `rule_files: ['prometheus.rules.yml']`;
|
||
- 在 `global` 中加入 `evaluation_interval: 15s`(Evaluate rules every 15 seconds)。
|
||
|
||
#### 2.4.8 步骤 8:重载配置与优雅关闭
|
||
|
||
**重载配置(无需重启)**:发送 `SIGHUP` 信号。
|
||
|
||
```bash
|
||
kill -s SIGHUP <PID>
|
||
```
|
||
|
||
**优雅关闭**(推荐用信号/中断):
|
||
|
||
- Linux 上发送 `SIGTERM` 或 `SIGINT`:
|
||
|
||
```bash
|
||
kill -s <SIGNAL> <PID>
|
||
```
|
||
|
||
- 或在控制终端按中断字符(默认 `^C`)。
|
||
|
||
> 💡 补充(来自官方 FAQ):除 `SIGHUP` 外,也可向 `/-/reload` 端点发 **HTTP POST** 重载配置;各组件会尽量**优雅处理失败的变更**。
|
||
|
||
> 引自:[Getting started](https://prometheus.io/docs/prometheus/latest/getting_started/) | [Frequently asked questions](https://prometheus.io/docs/introduction/faq/)
|
||
|
||
#### 2.4.9 Tutorials 版快速上手(含 node_exporter)
|
||
|
||
官方 [Tutorials → Getting started with Prometheus](https://prometheus.io/docs/tutorials/getting_started/) 给出了更精简的版本:
|
||
|
||
**第一步:只抓取自身。**
|
||
|
||
```yaml
|
||
global:
|
||
scrape_interval: 15s
|
||
|
||
scrape_configs:
|
||
- job_name: prometheus
|
||
static_configs:
|
||
- targets: ["localhost:9090"]
|
||
```
|
||
|
||
含义:`scrape_interval` 定义抓取频率;`scrape_configs` 含 job 名称与抓取目标。Prometheus 默认监听 **9090** 端口,故把 `localhost:9090` 加入 targets。
|
||
|
||
启动:
|
||
|
||
```bash
|
||
prometheus --config.file=prometheus.yml
|
||
```
|
||
|
||
此时 Prometheus 已运行并**每 15s 抓取自身指标**。
|
||
|
||
**第二步:接入 node exporter。** 先运行 exporter(机器指标 exporter,下载:<https://prometheus.io/download/#node_exporter>):
|
||
|
||
```bash
|
||
./node_exporter
|
||
```
|
||
|
||
再加入 `scrape_configs`:
|
||
|
||
```yaml
|
||
global:
|
||
scrape_interval: 15s
|
||
|
||
scrape_configs:
|
||
- job_name: prometheus
|
||
static_configs:
|
||
- targets: ["localhost:9090"]
|
||
- job_name: node_exporter
|
||
static_configs:
|
||
- targets: ["localhost:9100"]
|
||
```
|
||
|
||
**抓取原理示例**:以 web server 为例,用 Prometheus client library 添加 instrumentation 代码暴露指标;配置 Prometheus 从该 web server(监听 IP 端口 7500)按固定间隔(如每分钟)抓取:
|
||
|
||
| Time Stamp | Request Count (metric) |
|
||
| --- | --- |
|
||
| 11:00:00 | 0 |
|
||
| 11:01:00 | 1 |
|
||
| 11:02:00 | 3 |
|
||
|
||
- 11:00:00 首次抓取 request count 存为 `0`;
|
||
- 11:01:00 处理 1 个请求,count 增至 `1`;
|
||
- 11:02:00 再处理 2 个请求,count = 1 + 2 = `3`。
|
||
- 抓取频率由用户控制。
|
||
- 备注:该表仅用于理解,**Prometheus 并非以此确切格式存储值**。
|
||
|
||
**查询 API**:Prometheus 提供 API 查询已抓取并存储的指标,用于查询指标、创建 dashboard/chart 等,使用 `PromQL`。
|
||
|
||
> 引自:[Getting started with Prometheus](https://prometheus.io/docs/tutorials/getting_started/)
|
||
|
||
### 2.5 验证安装成功
|
||
|
||
| 检查项 | 方法 | 预期结果 |
|
||
| --- | --- | --- |
|
||
| 进程已启动 | 访问 <http://localhost:9090> | 能看到自身状态页 |
|
||
| metrics 端点正常 | 访问 <http://localhost:9090/metrics> | 返回文本格式指标(约启动 30 秒后有数据) |
|
||
| 目标健康 | <http://localhost:9090/targets> 或 **Status → Target health** | `prometheus` target 状态为 `UP` |
|
||
| 查询可用 | <http://localhost:9090/query> 选 Table,执行 `promhttp_metric_handler_requests_total` | 返回带不同 labels 的多条时间序列 |
|
||
| 规则已加载(配置规则后) | <http://localhost:9090/rules> | 能看到已定义的 record/alert 规则 |
|
||
| 告警可查(接入 Alertmanager 后) | <http://localhost:9090/alerts> | 能看到告警及状态 |
|
||
|
||
> 引自:[First steps with Prometheus](https://prometheus.io/docs/introduction/first_steps/) | [Getting started](https://prometheus.io/docs/prometheus/latest/getting_started/)
|
||
|
||
### 2.6 常见启动问题
|
||
|
||
> 💡 补充:以下内容为基于官方文档各处的**工程实践提示**,官方未单列“常见启动问题”章节,故以排错清单形式给出。
|
||
|
||
| 现象 | 可能原因 | 排查方向 |
|
||
| --- | --- | --- |
|
||
| 状态页打不开 | 端口被占用 / 监听地址不对 | 检查 `--web.listen-address`(默认 `0.0.0.0:9090`);用 `lsof -i :9090` 查占用 |
|
||
| target 状态 `DOWN` | 被监控进程未运行 / 端口错误 | 官方指引:检查对应端口上 exporter(如 Node Exporter)是否仍在运行 |
|
||
| 配置文件报错无法启动 | YAML 语法错误 / 字段拼写错误 | 用 `promtool check config prometheus.yml` 校验(见官方 promtool 文档) |
|
||
| 启动后查询无数据 | 抓取尚未完成 | 官方说明:约需 **30 秒**才开始采集到自身 HTTP 指标端点数据 |
|
||
| Docker 中数据丢失 | 数据存于容器内 `/prometheus`,容器重启即清空 | 使用 named volume:`-v prometheus-data:/prometheus` |
|
||
| Docker 中自定义参数不生效 | 镜像有默认命令行参数,追加参数会覆盖默认参数 | 需**自行重新加上**原有默认参数 |
|
||
| 配置改了不生效 | 未重载 | 发送 `SIGHUP`,或向 `/-/reload` 发 HTTP POST |
|
||
| 关闭时数据/状态异常 | 直接 kill 未优雅退出 | 使用 `SIGTERM`/`SIGINT` 优雅关闭 |
|
||
|
||
> 引自:[First steps with Prometheus](https://prometheus.io/docs/introduction/first_steps/) | [Installation](https://prometheus.io/docs/prometheus/latest/installation/) | [Getting started](https://prometheus.io/docs/prometheus/latest/getting_started/) | [Frequently asked questions](https://prometheus.io/docs/introduction/faq/)
|
||
|
||
---
|
||
|
||
## 第 3 章 核心概念
|
||
|
||
### 3.1 数据模型详解
|
||
|
||
#### 3.1.1 时间序列(Time Series)
|
||
|
||
- Prometheus 把**所有数据**都存储为 **_time series_(时间序列)**:属于**同一 metric** 且**同一组 labeled dimensions** 的、带时间戳的值的流。
|
||
- 除已存储的序列外,Prometheus 还可能**因查询生成临时派生序列**。
|
||
- 每条时间序列由 **metric name** 和**可选的键值对 labels** 唯一标识。
|
||
|
||
#### 3.1.2 样本(Sample)
|
||
|
||
- 每个 **sample** 由两部分组成:
|
||
|
||
| 组成 | 说明 |
|
||
| --- | --- |
|
||
| 值 | 一个 `float64` 值,或一个 **native histogram** 值 |
|
||
| 时间戳 | **毫秒精度**时间戳 |
|
||
|
||
> 💡 补充(来自官方 FAQ 的 Implementation 一节):之所以样本值都是 **64 位浮点**,是为了简化设计。`IEEE 754` 双精度二进制浮点格式支持整数精度至 **2^53**。原生 64 位整数仅在需要 2^53 以上、2^63 以下整数精度时才有帮助。原则上可实现不同样本值类型(含大整数,超过 64 位),但目前非优先。即便 counter 每秒递增一百万次,也需超过 **285 年**才会遇到精度问题。
|
||
|
||
#### 3.1.3 Metric name(指标名)
|
||
|
||
命名规则:
|
||
|
||
- **SHOULD** 描述被测量系统的通用特征(如 `http_requests_total` 表示收到的 HTTP 请求总数);
|
||
- **MAY** 使用任意 UTF-8 字符;
|
||
- **SHOULD** 匹配正则 `[a-zA-Z_:][a-zA-Z0-9_:]*`,否则在 PromQL 中使用时需**加引号**;
|
||
- 冒号 `:` **保留给用户自定义 recording rules**,exporters 或直接插桩 **SHOULD NOT** 使用。
|
||
|
||
#### 3.1.4 Metric labels(指标标签)
|
||
|
||
- 用于捕获同一 metric name 的不同实例(如所有用 `POST` 方法访问 `/api/tracks` 的 HTTP 请求),这种模型称为 **"dimensional data model"(维度化数据模型)**。
|
||
- **任何 label 值变化(含增删 label)都会创建新的时间序列。**
|
||
- 命名规则:
|
||
|
||
| 对象 | 规则 |
|
||
| --- | --- |
|
||
| label name | **MAY** 任意 UTF-8;以 `__`(双下划线)开头 **MUST** 保留给 Prometheus 内部使用;**SHOULD** 匹配 `[a-zA-Z_][a-zA-Z0-9_]*` |
|
||
| label value | **MAY** 含任意 UTF-8 |
|
||
| 空 label value | **等价于该 label 不存在** |
|
||
|
||
#### 3.1.5 命名规则速查表
|
||
|
||
| 对象 | SHOULD 匹配的正则 | 备注 |
|
||
| --- | --- | --- |
|
||
| metric name | `[a-zA-Z_:][a-zA-Z0-9_:]*` | `:` 保留给 recording rules;不匹配则 PromQL 中需加引号 |
|
||
| label name | `[a-zA-Z_][a-zA-Z0-9_]*` | `__` 前缀为 Prometheus 内部保留 |
|
||
| label value | 无字符集限制 | 可为任意 UTF-8;空值等于 label 不存在 |
|
||
|
||
#### 3.1.6 UTF-8 说明(重要警示)
|
||
|
||
> **WARNING**:metric/label name 的 UTF-8 支持在 **Prometheus v3.0.0** 才加入。生态(下游 PromQL 兼容项目、工具、第三方插桩、collectors)**可能尚未跟进**。为兼容性,建议沿用上文 **SHOULD** 字符集。
|
||
|
||
#### 3.1.7 Notation(记法)
|
||
|
||
标准记法:
|
||
|
||
```text
|
||
<metric name>{<label name>="<label value>", ...}
|
||
```
|
||
|
||
示例(与 OpenTSDB 记法相同):
|
||
|
||
```text
|
||
api_http_requests_total{method="POST", handler="/messages"}
|
||
```
|
||
|
||
**UTF-8 字符(超出推荐集)需加引号**:
|
||
|
||
```text
|
||
{"<metric name>", <label name>="<label value>", ...}
|
||
```
|
||
|
||
因 metric name 内部表示为特殊 label `__name__`,也可写作:
|
||
|
||
```text
|
||
{__name__="<metric name>", <label name>="<label value>", ...}
|
||
```
|
||
|
||
> 引自:[Data model](https://prometheus.io/docs/concepts/data_model/) | [Frequently asked questions](https://prometheus.io/docs/introduction/faq/)
|
||
|
||
### 3.2 四种指标类型
|
||
|
||
Prometheus 插桩库提供**四种核心 metric type**:**Counter、Gauge、Histogram、Summary**。
|
||
|
||
**关键前提**:除 **native histogram** 外,这些类型目前**只在插桩库 API 与 exposition 协议中区分**;**Prometheus server 尚不使用类型信息**,除 native histogram 外全部**扁平化为浮点值 untyped time series**。native histogram 则以特殊的**复合 histogram sample** 的时间序列被摄入。
|
||
|
||
#### 3.2.1 四种类型对比总表
|
||
|
||
| 类型 | 语义 | 单调性 | 典型用途 | 常用 PromQL |
|
||
| --- | --- | --- | --- | --- |
|
||
| **Counter** | 累积型(cumulative)、单调递增计数器 | 只增,重启时可重置为 0 | 请求数、完成任务数、错误数 | `rate()`、`increase()` |
|
||
| **Gauge** | 可任意上下浮动的单个数值 | 可升可降 | 温度、当前内存占用、并发请求数、队列中事件数、集群 pod 数 | `max_over_time`、`min_over_time`、`avg_over_time` |
|
||
| **Histogram** | 按可配置 buckets 对观测值计数 + 观测值之和(本质是 bucketed counter) | 累积 | 请求耗时(latency)、响应大小等分布 | `histogram_quantile()`、`histogram_fraction()`、`rate()` |
|
||
| **Summary** | 类似 histogram,另在滑动时间窗上计算可配置分位数 | 累积 | 请求时长、响应大小 | 直接读取 `{quantile="φ"}` |
|
||
|
||
#### 3.2.2 Counter(计数器)
|
||
|
||
- **是什么**:累积型(cumulative)metric,表示**只增不减**的单调递增计数器(monotonically increasing counter),值**只能在重启时被重置为 0**。
|
||
- **怎么用**:适合表示请求数、完成任务数、错误数。
|
||
- **不该用在哪**:**不可用于可能下降的值**(如当前运行进程数——应改用 gauge)。
|
||
- **注意**:`rate()` 函数**仅适用于 counter 值**。
|
||
- 教程中的示例查询:
|
||
|
||
```promql
|
||
go_gc_duration_seconds_count
|
||
```
|
||
|
||
`rate()` 取某时间窗内指标历史,计算每秒增长速度:
|
||
|
||
```promql
|
||
rate(go_gc_duration_seconds_count[5m])
|
||
```
|
||
|
||
#### 3.2.3 Gauge(仪表盘)
|
||
|
||
- **是什么**:表示**可任意上下浮动**的单个数值。
|
||
- **怎么用**:用于温度、当前内存占用,或可升可降的“计数”如并发请求数。
|
||
- 教程中的示例查询:
|
||
|
||
```promql
|
||
go_memstats_heap_alloc_bytes
|
||
```
|
||
|
||
可用 PromQL 函数(作用于 gauge 指标):`max_over_time`、`min_over_time`、`avg_over_time`。
|
||
|
||
#### 3.2.4 Histogram(直方图)
|
||
|
||
**是什么**:按**可配置的 buckets** 对观测值计数,并提供**所有观测值之和**,本质是 bucketed counter。它也可表示分布的当前状态,此时称为 **_gauge histogram_**(例如 `rate` 函数作用于 counter histogram 的结果)。
|
||
|
||
**版本分类**:histogram 有两种版本——较新的 **_native histograms_** 与较旧的 **_classic histograms_**。
|
||
|
||
**classic histogram 产生的序列**(base name 为 `<basename>`):
|
||
|
||
| 序列 | 含义 |
|
||
| --- | --- |
|
||
| `<basename>_bucket{le="<upper inclusive bound>"}` | 观测 bucket 的**累积**计数器 |
|
||
| `<basename>_sum` | 所有观测值**总和** |
|
||
| `<basename>_count` | 观测事件**计数**(等同于 `<basename>_bucket{le="+Inf"}`) |
|
||
|
||
**native histogram 的优势**:
|
||
|
||
- 以 **composite samples** 暴露与摄入,每个 sample 表示观测的计数与总和,并带一组**动态 bucket**;
|
||
- 更高效、分辨率更高;
|
||
- 插桩时**无需显式配置 bucket 边界**;
|
||
- 网络传输(如 remote write)具备**原子性**(classic histogram 因各组成序列独立传输可能**部分传输**);
|
||
- 其 bucketing schema **保证总可互相聚合**。
|
||
|
||
**支持情况**:当前支持 native histogram 的插桩库为 **Go 和 Java**,**建议优先使用 native histogram**。若只能用 classic,可配置 Prometheus 将其摄入为 **Native Histograms with Custom Bucket boundaries(NHCB)**——存储为相同 composite samples,但 bucket 布局与 classic 一致、分辨率与可聚合性受限。
|
||
|
||
**分位数计算**:用 `histogram_quantile()` 从 histogram(或 histogram 聚合)计算分位数,**classic 与 native 均适用**但语法略有不同;也可算 **Apdex score**。classic bucket 是**累积**的(每个 bucket 统计小于等于该 label 上界的所有观测);native histogram 可用 `histogram_fraction()` 计算落在给定边界内的观测比例,并用 **trim operators** 过滤波段。
|
||
|
||
**教程中的分桶示例**:以“观察处理 API 请求耗时”为例。不存储每个请求的时间,而是分桶存储。定义耗时 bucket:`le 0.3`、`le 0.5`、`le 0.7`、`le 1`、`le 1.2`。请求耗时计算后,被加到**所有 bucket 边界高于该测量值**的 bucket 计数中。
|
||
|
||
- Request 1,端点 `/ping` 耗时 **0.25 s**:
|
||
|
||
| Bucket | Count |
|
||
| --- | --- |
|
||
| 0 - 0.3 | 1 |
|
||
| 0 - 0.5 | 1 |
|
||
| 0 - 0.7 | 1 |
|
||
| 0 - 1 | 1 |
|
||
| 0 - 1.2 | 1 |
|
||
| 0 - +Inf | 1 |
|
||
|
||
备注:`+Inf` bucket 是**默认添加**的。由于 histogram 是累积频率(cumulative frequency),所有大于该值的 bucket 计数都加 1。
|
||
|
||
- Request 2,端点 `/ping` 耗时 **0.4 s**:
|
||
|
||
| Bucket | Count |
|
||
| --- | --- |
|
||
| 0 - 0.3 | 1 |
|
||
| 0 - 0.5 | 2 |
|
||
| 0 - 0.7 | 2 |
|
||
| 0 - 1 | 2 |
|
||
| 0 - 1.2 | 2 |
|
||
| 0 - +Inf | 2 |
|
||
|
||
因为 0.4 低于 0.5,所有直到该边界的 bucket 计数增加。
|
||
|
||
**在 UI 中探索 histogram 指标**:
|
||
|
||
```promql
|
||
prometheus_http_request_duration_seconds_bucket{handler="/graph"}
|
||
```
|
||
|
||
`histogram_quantile()` 计算分位数:
|
||
|
||
```promql
|
||
histogram_quantile(0.9,prometheus_http_request_duration_seconds_bucket{handler="/graph"})
|
||
```
|
||
|
||
图中显示第 90 百分位数为 **0.09**。计算最近 **5m** 的 `histogram_quantile`,使用 `rate()` 与时间窗:
|
||
|
||
```promql
|
||
histogram_quantile(0.9, rate(prometheus_http_request_duration_seconds_bucket{handler="/graph"}[5m]))
|
||
```
|
||
|
||
> **NOTE**:自 **Prometheus v3.0** 起,classic histogram 的 `le` label 值在摄入时按 **OpenMetrics Canonical Numbers** 格式归一化。
|
||
|
||
#### 3.2.5 Summary(摘要)
|
||
|
||
- **是什么**:类似 histogram,采样观测值(通常是请求时长、响应大小),提供观测总数与所有观测值之和,并**在滑动时间窗口上计算可配置的分位数**。
|
||
- **暴露的序列**(base name 为 `<basename>`,在抓取时暴露多条序列):
|
||
|
||
| 序列 | 含义 |
|
||
| --- | --- |
|
||
| `<basename>{quantile="<φ>"}` | 流式 **φ-quantiles**(0 ≤ φ ≤ 1) |
|
||
| `<basename>_sum` | 总和 |
|
||
| `<basename>_count` | 计数 |
|
||
|
||
- **优缺点**:是 histogram 的替代方案;更省资源(cheaper)但**丢失更多数据**。**在应用层计算**,因此**无法聚合同一进程多个实例的指标**。
|
||
- **适用**:指标 bucket **事先未知**的场景;但**强烈建议尽可能优先使用 histograms 而非 summaries**。
|
||
|
||
> **NOTE**:自 **Prometheus v3.0** 起,`quantile` label 值在摄入时按 **OpenMetrics Canonical Numbers** 格式归一化。
|
||
|
||
#### 3.2.6 类型选型决策指南
|
||
|
||
| 你要测量的东西 | 推荐类型 | 理由 |
|
||
| --- | --- | --- |
|
||
| 请求数 / 错误数 / 完成任务数 | **Counter** | 只增不减,可配 `rate()` 看速率 |
|
||
| 当前进程数 / 并发数 / 温度 / 内存占用 | **Gauge** | 可升可降 |
|
||
| 请求耗时/响应大小的分布、需算分位数 | **Histogram(优先 native)** | 可跨实例聚合;native 无需预设桶、可原子传输 |
|
||
| bucket 边界事先未知、且无需跨实例聚合 | **Summary** | 应用层算分位数;但**优先选 histogram** |
|
||
| 已有的 classic histogram 不想改造 | 配置 **NHCB** | 摄入为 native 形态,但桶布局与 classic 一致 |
|
||
|
||
> 引自:[Metric types](https://prometheus.io/docs/concepts/metric_types/) | [Understanding metric types](https://prometheus.io/docs/tutorials/understanding_metric_types/)
|
||
|
||
### 3.3 Jobs 与 Instances
|
||
|
||
#### 3.3.1 术语定义
|
||
|
||
- **_instance_(实例)**:可被抓取的 **endpoint**,通常对应**单个进程**。
|
||
- **_job_(作业)**:一组**用途相同**的 instance(例如为可扩展性或可靠性而复制的进程)。
|
||
|
||
**示例**:一个 `api-server` job 有四个复制 instance:
|
||
|
||
| instance | 地址 |
|
||
| --- | --- |
|
||
| instance 1 | `1.2.3.4:5670` |
|
||
| instance 2 | `1.2.3.4:5671` |
|
||
| instance 3 | `5.6.7.8:5670` |
|
||
| instance 4 | `5.6.7.8:5671` |
|
||
|
||
#### 3.3.2 自动附加的标签
|
||
|
||
抓取 target 时,Prometheus **自动附加两个 label** 用于标识被抓取 target:
|
||
|
||
| Label | 值 |
|
||
| --- | --- |
|
||
| `job` | target 所属的**已配置 job 名** |
|
||
| `instance` | 被抓取 target URL 的 **`<host>:<port>`** 部分 |
|
||
|
||
> 若被抓取的数据中**已存在**这两个 label,行为取决于配置项 `honor_labels`(详见 scrape_config 文档)。
|
||
|
||
#### 3.3.3 每次抓取自动写入的时间序列
|
||
|
||
每次 instance 抓取,Prometheus 会在以下时间序列中存一个 sample:
|
||
|
||
| 指标 | 含义 |
|
||
| --- | --- |
|
||
| `up{job="<job-name>", instance="<instance-id>"}` | 健康(可达)为 `1`,抓取失败为 `0`;**用于实例可用性监控** |
|
||
| `scrape_duration_seconds{job, instance}` | 抓取耗时 |
|
||
| `scrape_samples_post_metric_relabeling{job, instance}` | 应用 metric relabeling 后剩余的 sample 数 |
|
||
| `scrape_samples_scraped{job, instance}` | target 暴露的 sample 数 |
|
||
| `scrape_series_added{job, instance}` | 本次抓取新增序列的**近似**数量(*New in v2.10*) |
|
||
|
||
启用 [`extra-scrape-metrics` feature flag](https://prometheus.io/docs/prometheus/latest/feature_flags/#extra-scrape-metrics) 后**额外提供**:
|
||
|
||
| 指标 | 含义 |
|
||
| --- | --- |
|
||
| `scrape_timeout_seconds{job, instance}` | target 配置的 `scrape_timeout` |
|
||
| `scrape_sample_limit{job, instance}` | target 配置的 `sample_limit`;**未配置限制时返回 0** |
|
||
| `scrape_body_size_bytes{job, instance}` | 最近一次成功抓取响应的**未压缩**大小;因超出 `body_size_limit` 导致的抓取失败报 **-1**,其他抓取失败报 **0** |
|
||
|
||
> 引自:[Jobs and instances](https://prometheus.io/docs/concepts/jobs_instances/)
|
||
|
||
### 3.4 术语表
|
||
|
||
以下术语定义**逐条**来自官方 [Glossary](https://prometheus.io/docs/introduction/glossary/)。
|
||
|
||
| 术语 | 定义 |
|
||
| --- | --- |
|
||
| **Alert** | Prometheus 中告警规则的产物,且处于**正在触发(actively firing)**状态;告警从 Prometheus 发送到 Alertmanager。 |
|
||
| **Alertmanager** | 接收 alerts,**聚合成 groups**,**去重(de-duplicates)**,应用 **silences**,**限流(throttles)**,再向 email、Pagerduty、Slack 等发送通知。 |
|
||
| **Bridge** | 从 client library 取样本并**暴露给非 Prometheus 监控系统**的组件;例如 Python、Go、Java 客户端可导出指标到 Graphite。 |
|
||
| **Client library** | 某语言(如 Go、Java、Python、Ruby)的库,便于直接对代码埋点、编写自定义 collectors 从其他系统拉取指标并暴露给 Prometheus。 |
|
||
| **Collector** | exporter 中**代表一组指标**的部分;直接埋点时可能是单个指标,从其他系统拉取时可能是多个指标。 |
|
||
| **Direct instrumentation** | 作为程序源码**内联添加**的埋点,使用 client library。 |
|
||
| **Endpoint** | 可被抓取的**指标来源**,通常对应单个进程。 |
|
||
| **Exporter** | 与目标应用**并行运行**的二进制,暴露 Prometheus 指标,通常是**把非 Prometheus 格式的指标转换为 Prometheus 支持的格式**。 |
|
||
| **Instance** | 唯一标识 job 中某个 target 的 label。 |
|
||
| **Job** | 具有**相同目的**的一组 targets 的集合,例如监控为扩展性或可靠性而复制的同类进程组。 |
|
||
| **Mixin** | 面向特定组件或系统的**可复用、可扩展的 Prometheus alerts、recording rules 与 Grafana dashboards 集合**;通常用 `Jsonnet` 打包,可组合以构建完整监控配置,实现同类基础设施组件的标准化监控。 |
|
||
| **Notification** | 代表**一组一个或多个 alerts**,由 Alertmanager 发送至 email、Pagerduty、Slack 等。 |
|
||
| **Promdash** | 曾是 Prometheus 的**原生 dashboard builder,已弃用**,被 Grafana 取代。 |
|
||
| **Prometheus** | 通常指 Prometheus 系统的核心二进制;也可指整个 Prometheus 监控系统。 |
|
||
| **PromQL** | Prometheus Query Language,支持聚合、切片切块(slicing and dicing)、预测与 joins 等广泛操作。 |
|
||
| **Pushgateway** | **持久化 batch jobs 最近一次推送**的指标,使 Prometheus 可在其终止后再抓取这些指标。 |
|
||
| **Recording Rules** | **预计算**高频需要或计算昂贵的表达式,并把结果保存为**新的时间序列集合**。 |
|
||
| **Remote Read** | Prometheus 特性,允许在查询中**透明读取其他系统**(如长期存储)的时间序列。 |
|
||
| **Remote Read Adapter** | 并非所有系统直接支持 remote read;适配器位于 Prometheus 与另一系统之间,**转换双方的时间序列请求与响应**。 |
|
||
| **Remote Read Endpoint** | 做 remote read 时 Prometheus 通信的目标端点。 |
|
||
| **Remote Write** | Prometheus 特性,允许将摄入样本**实时发送到其他系统**(如长期存储)。 |
|
||
| **Remote Write Adapter** | 并非所有系统直接支持 remote write;适配器位于 Prometheus 与另一系统之间,**将 remote write 中的样本转换为对方可理解的格式**。 |
|
||
| **Remote Write Endpoint** | 做 remote write 时 Prometheus 通信的目标端点。 |
|
||
| **Sample** | 时间序列中某一时间点的**单个值**;在 Prometheus 中每个 sample 由一个 `float64` 值与**毫秒精度时间戳**组成。 |
|
||
| **Silence** | Alertmanager 中的**静默**,阻止 labels 匹配该 silence 的 alerts 进入通知。 |
|
||
| **Target** | 要抓取对象的**定义**,例如应用哪些 labels、连接所需认证信息,以及其他定义抓取如何发生的信息。 |
|
||
| **Time Series** | 属于**同一 metric 与同一组 labeled 维度**的时间戳值流;Prometheus 把所有数据都存为时间序列。 |
|
||
|
||
#### 术语分类速记
|
||
|
||
| 分类 | 术语 |
|
||
| --- | --- |
|
||
| 采集侧 | Target、Endpoint、Exporter、Collector、Bridge、Client library、Direct instrumentation、Instance、Job |
|
||
| 数据侧 | Time Series、Sample、Metric types(Counter/Gauge/Histogram/Summary)、PromQL |
|
||
| 告警侧 | Alert、Alertmanager、Notification、Silence、Recording Rules |
|
||
| 远程/扩展侧 | Remote Read / Remote Write(+ Adapter / Endpoint)、Pushgateway、Mixin、Promdash |
|
||
|
||
> 引自:[Glossary](https://prometheus.io/docs/introduction/glossary/)
|
||
|
||
---
|
||
|
||
## 第 4 章 架构与设计
|
||
|
||
### 4.1 设计哲学与动机
|
||
|
||
#### 4.1.1 设计文档入口(Design documents)
|
||
|
||
- 官方设计文档指向仓库 **`github.com/prometheus/proposals`**,其中可见 Prometheus 生态**过去与当前的全部提案(proposals)**。
|
||
- 若想创建新提案,阅读该仓库的 **`proposal process`**(<https://github.com/prometheus/proposals#proposal-process>)。
|
||
|
||
**Problem statements and exploratory documents(问题陈述与探索性文档)**:有时会看向更远的潜在未来。此节文档多为**探索性**,应作为“**影响集体思考**”之物,而非具体或确定内容。
|
||
|
||
| 探索性文档 | 初始日期 |
|
||
| --- | --- |
|
||
| `Prometheus is not feature complete` | 2020-05 |
|
||
| `Thoughts about timestamps and durations in PromQL` | 2020-10 |
|
||
| `Prometheus, OpenMetrics & OTLP` | 2021-03 |
|
||
| `Prometheus Sparse Histograms and PromQL` | 2021-10 |
|
||
| `Quoting Prometheus names` | 2023-01 |
|
||
|
||
(每项均链接到对应 Google Docs 文档。)
|
||
|
||
#### 4.1.2 核心设计动机
|
||
|
||
综合官方 Overview 与 FAQ,Prometheus 的设计动机可归纳为以下几点:
|
||
|
||
| 动机 | 具体体现 |
|
||
| --- | --- |
|
||
| **可靠性优先** | 作为故障时快速诊断的**首选系统**;每个 server 独立、不依赖网络存储或远程服务,基础设施其他部分损坏时仍可依赖;无需搭建大量基础设施 |
|
||
| **可靠地把告警送达人类** | 这是 Prometheus 最看重的取舍(出自 FAQ);代价是放弃 100% 准确性 |
|
||
| **多维数据模型** | 显式 key-value labels,而非把维度隐式编码进 metric name;便于过滤、分组、匹配、下钻 |
|
||
| **单节点自治,易于运行** | 主 server 以单个单体二进制独立运行,无外部依赖;单实例可扩展至数千万活跃序列 |
|
||
| **Pull 优先** | HTTP pull 便于定位 target 是否 down、便于手动用浏览器检查健康;push 场景由 Pushgateway 兜底 |
|
||
| **面向动态环境** | service discovery 适配高度动态的云原生/微服务架构 |
|
||
|
||
**为什么选择 pull 而非 push**(官方 FAQ 的完整理由):
|
||
|
||
| 理由 | 说明 |
|
||
| --- | --- |
|
||
| 灵活部署 | 可按需启动额外监控实例(如开发时在笔记本上) |
|
||
| 判断 down 更可靠 | 更易且更可靠地判断 target 是否 down |
|
||
| 便于人工排查 | 可手动用浏览器访问 target 检查健康 |
|
||
|
||
官方结论:整体上 pull 略优于 push,但**不应作为选型的主要原因**。必须 push 时,官方提供 **Pushgateway**。
|
||
|
||
> 💡 补充:Pull 模型的代价是“短生命周期任务”难以被抓到——这正是官方提供 Pushgateway 的原因(见术语表 Pushgateway)。
|
||
|
||
> 引自:[Design documents](https://prometheus.io/docs/introduction/design-doc/) | [Overview](https://prometheus.io/docs/introduction/overview/) | [Frequently asked questions](https://prometheus.io/docs/introduction/faq/)
|
||
|
||
### 4.2 整体架构与组件关系
|
||
|
||
#### 4.2.1 数据流架构
|
||
|
||
官方 Overview 对架构的描述如下:
|
||
|
||
- Prometheus 从**被埋点的 jobs** 抓取指标,**可直接抓取**;**短生命周期任务**则经中间 **push gateway**。
|
||
- 所有抓取样本**本地存储**,并在该数据上运行 **rules**——用于**聚合/记录新的时间序列**,或**生成告警**。
|
||
- 可用 **Grafana** 或其他 **API 消费者**可视化已采集的数据。
|
||
- 官方架构配图:`/assets/docs/architecture.svg`。
|
||
|
||
Tutorials 教程给出的基本架构组件(更精简的视角):
|
||
|
||
| 组件 | 职责 |
|
||
| --- | --- |
|
||
| **Prometheus Server** | 抓取并存储指标数据的服务端 |
|
||
| **Targets to be scraped** | 被抓取目标,例如**暴露自身指标的 instrumented application**,或**暴露其他应用指标的 exporter** |
|
||
| **Alertmanager** | 基于预设规则触发告警 |
|
||
| (另有 `push_gateway`) | 该教程未涉及,见术语表与第 4.2.3 节 |
|
||
|
||
#### 4.2.2 组件清单(多数可选)
|
||
|
||
| 组件 | 仓库 / 说明 |
|
||
| --- | --- |
|
||
| 主 **Prometheus server** | `github.com/prometheus/prometheus`,抓取并存储时间序列数据 |
|
||
| **Client libraries** | 用于给应用代码**埋点** |
|
||
| **Pushgateway** | `github.com/prometheus/pushgateway`,支持**短生命周期任务(short-lived jobs)** |
|
||
| 专用 **Exporters** | 面向 HAProxy、StatsD、Graphite 等服务的指标导出器 |
|
||
| **Alertmanager** | `github.com/prometheus/alertmanager`,处理告警 |
|
||
| 各类支持工具 | — |
|
||
|
||
**实现语言**:多数组件用 **`Go`** 编写,便于以**静态二进制**构建与部署(部分组件用 Java、Python、Ruby,见 FAQ)。
|
||
|
||
#### 4.2.3 端到端数据流示意
|
||
|
||
```text
|
||
┌──────────────────────────────┐
|
||
│ Prometheus Server │
|
||
┌──────────┐ pull │ ┌────────┐ ┌───────────┐ │
|
||
│ 埋点应用 │ ◄───────┼──│ Scrape │──►│ 本地 TSDB │ │
|
||
│ /metrics │ │ └────────┘ └───────────┘ │
|
||
└──────────┘ │ │ ▲ │
|
||
┌──────────┐ pull │ ▼ │ │
|
||
│ Exporter │ ◄───────┼── Rules(recording / alerting)│
|
||
└──────────┘ │ │ │
|
||
┌──────────┐ push │ ▼ │
|
||
│ 短生命周期│ ──────► │ ┌──────────────┐ │
|
||
│ job │ Pushgateway│ Alertmanager │ │
|
||
└──────────┘ │ └──────┬───────┘ │
|
||
└─────────┼────────────────────┘
|
||
▼
|
||
email / PagerDuty / Slack / webhook ...
|
||
▲
|
||
┌──────────┐ PromQL │
|
||
│ Grafana │──────────┘ 或其它 API 消费者
|
||
└──────────┘
|
||
```
|
||
|
||
> 💡 补充:上图为依据官方文字描述绘制的**示意关系图**,非官方原图;官方原图见 `/assets/docs/architecture.svg`。
|
||
|
||
> 引自:[Overview](https://prometheus.io/docs/introduction/overview/) | [Getting started with Prometheus](https://prometheus.io/docs/tutorials/getting_started/)
|
||
|
||
### 4.3 Agent 模式(对比 Server 模式)
|
||
|
||
#### 4.3.1 是什么
|
||
|
||
**Prometheus Agent** 是内置于 Prometheus 二进制中的一种**运行模式**,具有与 server 模式**相同的 scraping APIs、语义、配置与发现机制**。该模式:
|
||
|
||
- **禁用** Prometheus 的一些常规功能:**TSDB、alerting、rule evaluations**;
|
||
- 将二进制**针对抓取与向远端 remote write 做优化**;
|
||
- 用一个**定制化的 TSDB WAL** 替代本地存储。
|
||
|
||
**Remote Write 的角色**:Prometheus Remote Write 协议把 Prometheus 采集到的**全部或子集** metrics **转发(流式)**到远端位置;你可以配置 Prometheus 把部分指标(如需,还可包含**全部 metadata 和 exemplars**)转发到一个或多个支持 Remote Write API 的位置。
|
||
|
||
**为什么用 Pull + Remote Write**:即便使用 Remote Write,Prometheus 仍用 **pull 模型**从应用采集指标,从而**理解这些不同的失败模式**。之后再把 samples 与 series 批量导出、复制(push)到 Remote Write endpoints,**限制中心侧“监控未知量”的数量**。
|
||
|
||
**Global View 用例**:从这样的 scraper 流式发送数据,使得把指标数据集中存于一处成为可能,从而支持 **Global View** 用例,实现**关注点分离**——当管理应用的团队与负责可观测性/监控 pipeline 的团队不同时尤为有用。
|
||
|
||
**本质**:Agent 模式为 remote write 用例优化 Prometheus,**禁用查询、告警与本地存储**,代之以定制 TSDB WAL。**其余全部相同**:scraping 逻辑、service discovery 与相关配置。如果你只想把数据转发到远端 Prometheus server 或任何兼容 Remote-Write 的项目,它可**作为 Prometheus 的 drop-in replacement(直接替换)**。
|
||
|
||
官方配图:`./images/prometheus_agent.png`。
|
||
|
||
#### 4.3.2 Server 模式 vs Agent 模式对比
|
||
|
||
| 维度 | Server 模式(默认) | Agent 模式 |
|
||
| --- | --- | --- |
|
||
| 本地查询 | ✅ 支持 | ❌ **不支持**(无法查询本地实例) |
|
||
| Recording rules | ✅ 支持 | ❌ **不支持**(规则必须在远端做) |
|
||
| 告警(Alerting) | ✅ 支持 | ❌ **不支持**(全部告警由远端系统完成) |
|
||
| 本地存储 | 完整 TSDB | 定制 TSDB WAL(成功后立即删除数据) |
|
||
| Scraping / SD / 配置 | ✅ | ✅ **完全相同** |
|
||
| Remote Write | ✅ | ✅ 核心用途 |
|
||
| Web UI 端口 | 9090 | **9095**(禁用查询能力,但展示 build info、configuration、targets、service discovery 信息) |
|
||
| 资源占用 | 常规 | **约为常规 server 的一小部分** |
|
||
| 存储路径 flag | `--storage.tsdb.path`(默认 `data/`,仅 server 模式) | `--storage.agent.path`(默认 `data-agent/`,仅 agent 模式) |
|
||
|
||
#### 4.3.3 Agent 模式的收益(Benefits)
|
||
|
||
| 收益 | 说明 |
|
||
| --- | --- |
|
||
| **更高效率** | 定制的 Agent TSDB WAL 在写入成功后**立即移除数据**。若无法到达远端 endpoint,则**临时持久化到磁盘**,直到远端恢复。目前**仅限两小时缓冲**,与非 agent 版 Prometheus 类似。这意味着**无需在内存中构建 chunks、也无需维护用于查询的完整 index**;Agent 模式使用的资源只是常规 Prometheus server 在类似情形下的**一小部分** |
|
||
| **更易水平扩展摄入** | Agent 模式使**摄取的水平扩展(horizontal scalability for ingestion)**更简单(见官方博客《The dream: auto-scalable metric ingestion》) |
|
||
|
||
#### 4.3.4 Agent 模式的代价(Downsides)
|
||
|
||
- **No local queries**:你无法查询本地 Prometheus 实例。
|
||
- **Recording rules are not possible**:无法为发送到 remote write 的数据做预聚合总结;规则必须在远端完成。
|
||
- **No alerting**:全部告警都必须由远端系统完成。
|
||
|
||
#### 4.3.5 怎么用
|
||
|
||
用 **`--agent`** flag 运行 Agent 模式。`--help` 输出中可见相关 flag:
|
||
|
||
```text
|
||
usage: prometheus [<flags>]
|
||
|
||
The Prometheus monitoring server
|
||
|
||
Flags:
|
||
-h, --help Show context-sensitive help (also try --help-long and --help-man).
|
||
(... other flags)
|
||
--storage.tsdb.path="data/"
|
||
Base path for metrics storage. Use with server mode only.
|
||
--storage.agent.path="data-agent/"
|
||
Base path for metrics storage. Use with agent mode only.
|
||
(... other flags)
|
||
--[no-]agent Run Prometheus in 'Agent mode'.
|
||
```
|
||
|
||
**如何判断某 flag 属于哪个模式**:其余 flag 要么两类模式共用,要么只属于某一模式。看该 flag 帮助字符串的**最后一句**即可:“Use with server mode only” 表示仅 server 模式;**若没有任何此类说明,则该 flag 是共用的**。
|
||
|
||
Agent 模式**接受相同的 scrape 配置**(含相同的 discovery 选项与 remote write 选项),并暴露 **9095 端口**的 Web UI——禁用查询能力,但展示 build info、configuration、targets 与 service discovery 信息,与常规 Prometheus server 一致。
|
||
|
||
> 引自:[Prometheus Agent Mode](https://prometheus.io/docs/prometheus/latest/prometheus_agent/)
|
||
|
||
### 4.4 API 稳定性承诺
|
||
|
||
Prometheus **承诺在一个主版本内保持 API 稳定**,并努力避免对关键特性做破坏性变更。部分特性(纯装饰性的、仍在开发中的、或依赖第三方服务的)**不在此承诺范围内**。
|
||
|
||
#### 4.4.1 3.x 中被视为稳定的内容(Stable for 3.x)
|
||
|
||
| # | 稳定项 |
|
||
| --- | --- |
|
||
| 1 | 查询语言与数据模型(The query language and data model) |
|
||
| 2 | 告警与 recording 规则(Alerting and recording rules) |
|
||
| 3 | 摄入的 exposition 格式(The ingestion exposition format) |
|
||
| 4 | v1 HTTP API(被 dashboards 与 UIs 使用),**不含显式标记为 experimental 的 endpoint** |
|
||
| 5 | 配置文件格式(减去 service discovery 的 remote read/write,见下) |
|
||
| 6 | 规则/告警文件格式(Rule/alert file format) |
|
||
| 7 | Console template 语法与语义 |
|
||
| 8 | Remote write 发送(依据 [1.0 规范](https://prometheus.io/docs/concepts/remote_write_spec/))与接收 |
|
||
| 9 | Agent 模式 |
|
||
| 10 | OTLP receiver endpoint |
|
||
|
||
#### 4.4.2 3.x 中被视为不稳定的内容(Unstable for 3.x)
|
||
|
||
任何被标记为 **experimental 或 subject to change** 的特性,包括:
|
||
|
||
- `double_exponential_smoothing` PromQL 函数(见 <https://github.com/prometheus/prometheus/issues/2458>);
|
||
- Remote read 与 remote read endpoint;
|
||
- Server-side HTTPS 与 basic authentication;
|
||
- Service discovery 集成,**例外**为 `static_configs`、`file_sd_configs` 和 `http_sd_config`;
|
||
- 属于 server 一部分的包的 **Go APIs**;
|
||
- Web UI 生成的 **HTML**;
|
||
- Prometheus 自身 `/metrics` endpoint 中的 **metrics**;
|
||
- 精确的**磁盘格式**(on-disk format)——潜在变更将**向前兼容**并由 Prometheus 透明处理;
|
||
- **日志格式**(The format of the logs)。
|
||
|
||
#### 4.4.3 升级含义
|
||
|
||
- Prometheus 2.x 的稳定性保证见 [2.x 文档](https://prometheus.io/docs/prometheus/2.55/stability/)。
|
||
- 只要你**不使用**标记为 experimental/unstable 的特性,**在同一主版本内升级通常无需任何运维调整**,破坏风险极低。
|
||
- 任何破坏性变更都会在 release notes 中标记为 **`CHANGE`**。
|
||
|
||
#### 4.4.4 稳定性等级速查
|
||
|
||
| 等级 | 含义 | 典型对象 |
|
||
| --- | --- | --- |
|
||
| **Stable** | 主版本内保证稳定 | 查询语言、数据模型、规则格式、v1 HTTP API(非 experimental)、exposition 格式、remote write 1.0、Agent 模式、OTLP receiver |
|
||
| **Experimental / Unstable** | 可能随时变更,**不提供稳定保证** | `double_exponential_smoothing`、remote read、server-side HTTPS/basic auth、多数 SD 集成、Go APIs、Web UI HTML、自身 `/metrics`、磁盘格式、日志格式 |
|
||
|
||
> 💡 补充:LTS 支持范围明确**排除**了上述不稳定特性(Unstable features)、实验性特性(Experimental features,见 feature_flags)以及 OpenBSD 支持。详见第 5.2 节。
|
||
|
||
> 引自:[API stability guarantees](https://prometheus.io/docs/prometheus/latest/stability/) | [Long-term support](https://prometheus.io/docs/introduction/release-cycle/)
|
||
|
||
---
|
||
|
||
## 第 5 章 生态与版本
|
||
|
||
### 5.1 路线图
|
||
|
||
官方 [Roadmap](https://prometheus.io/docs/introduction/roadmap/) 说明:以下仅为**近期计划实现的部分主要特性**;更完整的计划与当前工作见各仓库 issue tracker(如 Prometheus server)。
|
||
|
||
| 计划特性 | 说明 |
|
||
| --- | --- |
|
||
| **Server-side metric metadata support** | 目前 metric types 及其他 metadata **仅在 client libraries 与 exposition format 中使用**,未在 Prometheus server 持久化或利用。计划未来利用这些 metadata;**第一步**是在 Prometheus **内存中聚合**该数据,并通过**实验性 API 端点**提供 |
|
||
| **Adopt OpenMetrics** | OpenMetrics 工作组正在制定**新的指标暴露标准**;计划在 client libraries 与 Prometheus 自身支持该格式 |
|
||
| **Retroactive rule evaluations** | 增加对**回溯规则求值**的支持,利用 **backfill** |
|
||
| **TLS and authentication in HTTP serving endpoints** | TLS 与认证正逐步推广到 Prometheus、Alertmanager 与官方 exporters;该支持可让用户**安全部署 Prometheus 组件而无需反向代理**提供外部附加这些能力 |
|
||
| **Support the Ecosystem** | Prometheus 有一系列 client libraries 与 exporters,总有更多语言可支持、更多系统值得导出指标;将持续支持生态创建与扩展这些 |
|
||
|
||
> 引自:[Roadmap](https://prometheus.io/docs/introduction/roadmap/)
|
||
|
||
### 5.2 发布周期与 LTS 策略
|
||
|
||
#### 5.2.1 LTS 定义
|
||
|
||
**Prometheus LTS(Long-term support)** 是经挑选的发布版本,在**一年**延长期内接收经过挑选的 bug 修复。
|
||
|
||
#### 5.2.2 发布节奏
|
||
|
||
- 每 **6 周**开启一个新的 minor release 周期;
|
||
- **6 周后**,某个 minor release **通常不再接收 bug 修复**;
|
||
- 因此,用户受某 minor release 的 bug 影响时,**往往需升级到最新 Prometheus release**。
|
||
|
||
#### 5.2.3 升级
|
||
|
||
- 得益于 **API 稳定性保证**,升级通常**直接简单**;
|
||
- 但**新特性与增强也可能带来回归**,从而需要再次升级。
|
||
|
||
#### 5.2.4 支持范围
|
||
|
||
| 项 | 规则 |
|
||
| --- | --- |
|
||
| 修复级别 | LTS 版本**仅接收高严重度问题**的修复,即 **CVSS 评分 7.0 或更高** |
|
||
| 可追加 | 可能追加 bug 修复或文档修复 |
|
||
| 工具链 | 构建工具链也会**保持最新** |
|
||
| 承诺性质 | 此承诺为**社区尽力而为(best effort)**,欢迎贡献 |
|
||
|
||
#### 5.2.5 支持周期重叠
|
||
|
||
- 两个相邻 LTS 版本的**支持期应至少重叠一个月**;
|
||
- 目的:使依赖 Prometheus 的用户**既限制升级风险,又有社区维护的 server**。
|
||
|
||
#### 5.2.6 LTS 发布列表
|
||
|
||
- LTS 发布列表由占位符 `<!-- LTS_RELEASES_TABLE -->` **动态生成**(源文件中无具体版本数据)。
|
||
|
||
#### 5.2.7 LTS 支持的排除项(Limitations)
|
||
|
||
LTS 支持**不覆盖**:
|
||
|
||
| 排除项 | 说明 |
|
||
| --- | --- |
|
||
| API 稳定性保证中列出的**不稳定特性**(Unstable features) | 见第 4.4.2 节 |
|
||
| **实验性特性**(Experimental features) | 见 feature_flags |
|
||
| **OpenBSD 支持** | — |
|
||
|
||
**参考链接**:
|
||
|
||
- API 稳定性:<https://prometheus.io/docs/prometheus/latest/stability/>
|
||
- 特性开关:<https://prometheus.io/docs/prometheus/latest/feature_flags/>
|
||
|
||
> 引自:[Long-term support](https://prometheus.io/docs/introduction/release-cycle/) | [API stability guarantees](https://prometheus.io/docs/prometheus/latest/stability/)
|
||
|
||
### 5.3 学习资源
|
||
|
||
官方 [Media](https://prometheus.io/docs/introduction/media/) 页面汇总的学习资源如下。
|
||
|
||
#### 5.3.1 社区与聚合资源
|
||
|
||
| 资源 | 说明 |
|
||
| --- | --- |
|
||
| 专门 subreddit | <https://reddit.com/r/prometheusmonitoring>,汇集全网 Prometheus 相关资源 |
|
||
| `Awesome Prometheus` | <https://github.com/roaldnefs/awesome-prometheus>,更全面的社区维护资源列表 |
|
||
|
||
#### 5.3.2 Blogs
|
||
|
||
- 本站 blog(<https://prometheus.io/blog/>);
|
||
- **SoundCloud 宣布 Prometheus 的博文**(比本站更详尽);
|
||
- **Robust Perception** 博客的 Prometheus 相关文章。
|
||
|
||
#### 5.3.3 Tutorials
|
||
|
||
- **Prometheus workshop** 的说明与示例代码(<https://github.com/juliusv/prometheus_workshop>);
|
||
- **How To Install Prometheus using Docker on Ubuntu 14.04**(DigitalOcean)。
|
||
|
||
#### 5.3.4 Podcasts and interviews
|
||
|
||
- `Prometheus on FLOSS Weekly 357`(Julius Volz);
|
||
- `Prometheus and Service Monitoring`(Changelog podcast,Julius Volz)。
|
||
|
||
#### 5.3.5 Recorded talks
|
||
|
||
| 主题 | 讲者 / 场合 |
|
||
| --- | --- |
|
||
| `Prometheus: A Next-Generation Monitoring System` | Julius Volz 与 Björn Rabenstein,SREcon15 Europe, Dublin |
|
||
| 同名演讲 | Brian Brazil,FOSDEM 2016 |
|
||
| `What is your application doing right now?` | Matthias Gruter, Transmode |
|
||
| `Prometheus workshop` | Jamie Wilkinson,Monitorama PDX 2015 |
|
||
| `Monitoring Hadoop with Prometheus` | Brian Brazil |
|
||
| `Monitoring mit Prometheus`(德语) | Michael Stapelberg, Easterhegg 2016 |
|
||
| `Prometheus in der Praxis`(德语) | Jonas Große Sundrup, MRMCD 2016 |
|
||
|
||
#### 5.3.6 Presentation slides
|
||
|
||
| 分组 | 标题 / 讲者 |
|
||
| --- | --- |
|
||
| General | `Prometheus Overview`(Brian Brazil) |
|
||
| General | `Systems Monitoring with Prometheus`(Brian Brazil,Devops Ireland Meetup) |
|
||
| General | `OMG! Prometheus`(Benjamin Staffin, Fitbit Site Operations) |
|
||
| Docker | `Prometheus and Docker`(Brian Brazil,Docker Galway) |
|
||
| Python | `Better Monitoring for Python`(Brian Brazil,Pycon Ireland) |
|
||
| Python | `Monitoring your Python with Prometheus`(Brian Brazil,Python Ireland Meetup) |
|
||
|
||
> 引自:[Media](https://prometheus.io/docs/introduction/media/)
|
||
|
||
### 5.4 官方 FAQ 整理
|
||
|
||
以下按官方 [Frequently asked questions](https://prometheus.io/docs/introduction/faq/) 的三大分组(**General / Instrumentation / Implementation**)逐条整理,采用“**问题(现象)→ 解答**”的形式。
|
||
|
||
#### 5.4.1 General(通用)
|
||
|
||
**Q:什么是 Prometheus?**
|
||
A:开源系统监控与告警工具箱,生态活跃;是 `Kubernetes` 唯一直接支持的系统,也是云原生生态事实标准。
|
||
|
||
**Q:与其他监控系统如何比较?**
|
||
A:见 [comparison 页](https://prometheus.io/docs/introduction/comparison/)(本篇第 1.5 节已完整整理)。
|
||
|
||
**Q:依赖什么?是否云原生?**
|
||
A:
|
||
|
||
- 主 server 以**单个单体二进制**独立运行,**无外部依赖**;
|
||
- 是云原生;
|
||
- 服务发现集成多数工具与云;
|
||
- 多维数据模型**可扩展至数千万活跃序列(tens of millions of active series)**,可监控大型云原生部署;
|
||
- 取舍上,Prometheus 最看重“**可靠地把告警送达人类**”。
|
||
|
||
**Q:是否支持高可用(High availability)?**
|
||
A:是。在两台或多台**独立机器**上运行**完全相同的** Prometheus server。`Thanos` 等系统可去重,许多支持 remote write 的外部系统也能去重;完全相同的告警会由 **Alertmanager 去重**;Alertmanager 通过**互联多个实例构成集群**支持高可用。
|
||
|
||
**Q:“Prometheus 不扩展”(Prometheus doesn't scale)?**
|
||
A:常属**营销说法**。单实例可优于某些自称长期存储的方案;可靠运行**数千万活跃序列**没问题。若需更多,可参考 **Scaling and Federating Prometheus** 博客与 integrations 页的长期存储系统。
|
||
|
||
**Q:用什么语言写的?**
|
||
A:多数组件用 `Go`,部分用 Java、Python、Ruby。
|
||
|
||
**Q:稳定性承诺如何?**
|
||
A:
|
||
|
||
- GitHub org 中达 **1.0.0 的仓库**大体遵循**语义化版本(semantic versioning)**,破坏性变更以**主版本递增**表示;**实验性组件例外**,会在公告中明确标注;
|
||
- **未达 1.0.0 的仓库**通常也相当稳定;
|
||
- 破坏性变更会在 release notes 标注 **`[CHANGE]`**;无正式发布的组件会明确沟通。
|
||
|
||
**Q:为什么用 pull 而非 push?**
|
||
A:HTTP pull 的优势——① 可按需启动额外监控实例(如开发时在笔记本上);② 更易且更可靠地判断 target 是否 down;③ 可手动用浏览器访问 target 检查健康。整体上 pull 略优于 push,但**不应作为选型主要原因**。必须 push 时提供 **Pushgateway**。
|
||
|
||
**Q:如何把日志喂给 Prometheus?**
|
||
A:
|
||
|
||
- **短答**——别这么做,改用 `Grafana Loki` 或 `OpenSearch`;
|
||
- **长答**——Prometheus 收集处理 **metrics**,**不是事件日志系统**;若想从应用日志提取 Prometheus 指标,**Loki 正是为此设计**(见其 metric queries 文档)。
|
||
|
||
**Q:作者是谁?**
|
||
A:最初由 `Matt T. Proud` 与 `Julius Volz` **私下发起**,主要初期开发由 `SoundCloud` 资助;现由众多公司与个人维护扩展。
|
||
|
||
**Q:许可证?**
|
||
A:`Apache 2.0`。
|
||
|
||
**Q:Prometheus 的复数形式?**
|
||
A:经研究确定为 **'Prometheis'**;记不住时可用 "Prometheus instances"。
|
||
|
||
**Q:能否重载配置?**
|
||
A:可以。向进程发送 `SIGHUP`,或向 **`/-/reload`** 端点发 HTTP POST,即可重载并应用配置;各组件会**尽量优雅处理失败的变更**。
|
||
|
||
**Q:能否发送告警?**
|
||
A:可以,用 **Alertmanager**;支持 email、多种原生集成,以及任何人都可添加集成的 **webhook** 系统。
|
||
|
||
**Q:能否创建仪表盘?**
|
||
A:可以,生产环境**推荐 Grafana**;也有 **Console templates**。
|
||
|
||
**Q:能否改时区?为何全用 UTC?**
|
||
A:为避免**时区混淆**(尤其涉及 daylight saving time,夏令时),内部**独占使用 Unix time**,所有组件**展示用 UTC**。UI 时区选择需谨慎设计,欢迎贡献(见 issue #500)。
|
||
|
||
#### 5.4.2 Instrumentation(埋点)
|
||
|
||
**Q:哪些语言有埋点库?**
|
||
A:有多种 client libraries,详见文档;想为新语言贡献客户端,见 exposition formats。
|
||
|
||
**Q:能否监控机器?**
|
||
A:可以。**`Node Exporter`** 在 Linux 及其他 Unix 系统暴露大量机器级指标,如 CPU 使用率、内存、磁盘利用率、文件系统占用、网络带宽。
|
||
|
||
**Q:能否监控网络设备?**
|
||
A:可以。**`SNMP Exporter`** 支持 SNMP 设备;工业网络还有 **`Modbus exporter`**。
|
||
|
||
**Q:能否监控 batch jobs?**
|
||
A:可以,用 **Pushgateway**;另见 batch jobs 最佳实践。
|
||
|
||
**Q:开箱即用可监控哪些应用?**
|
||
A:见 **exporters and integrations** 列表。
|
||
|
||
**Q:能否通过 JMX 监控 JVM 应用?**
|
||
A:可以。对无法直接用 Java client 埋点的应用,可用 **`JMX Exporter`**,**独立运行或作为 Java Agent**。
|
||
|
||
**Q:埋点的性能影响有多大?**
|
||
A:各客户端与语言不一。**Java 基准显示**:Java client 递增 counter/gauge 需 **`12-17ns`**(取决于竞争);除对延迟极敏感的代码外**可忽略**。
|
||
|
||
#### 5.4.3 Implementation(实现)
|
||
|
||
**Q:为何样本值都是 64 位浮点?**
|
||
|
||
A:
|
||
|
||
- 为**简化设计**限定为 64 位浮点;
|
||
- `IEEE 754` 双精度二进制浮点格式支持**整数精度至 2^53**;
|
||
- **原生 64 位整数**仅在需要 **2^53 以上、2^63 以下**整数精度时才有帮助;
|
||
- 原则上可实现不同样本值类型(含大整数,超过 64 位),但**目前非优先**;
|
||
- 即便 counter **每秒递增一百万次**,也需超过 **285 年**才会遇到精度问题。
|
||
|
||
#### 5.4.4 FAQ 速查索引
|
||
|
||
| 分组 | 问题 | 一句话结论 |
|
||
| --- | --- | --- |
|
||
| General | 什么是 Prometheus | 开源监控与告警工具箱,云原生事实标准 |
|
||
| General | 依赖 / 云原生 | 单体二进制、无外部依赖、云原生 |
|
||
| General | 高可用 | 多台独立机器跑相同 server + Alertmanager 集群去重 |
|
||
| General | 不扩展? | 营销说法;单实例可跑数千万活跃序列 |
|
||
| General | pull vs push | pull 略优,但不作为选型主因;需 push 用 Pushgateway |
|
||
| General | 日志 | 别喂日志,用 Grafana Loki 或 OpenSearch |
|
||
| General | 许可证 | Apache 2.0 |
|
||
| General | 重载配置 | `SIGHUP` 或 POST `/-/reload` |
|
||
| General | 时区 | 内部 Unix time,展示统一 UTC |
|
||
| Instrumentation | 监控机器 | Node Exporter |
|
||
| Instrumentation | 网络设备 | SNMP Exporter / Modbus exporter |
|
||
| Instrumentation | batch jobs | Pushgateway |
|
||
| Instrumentation | JVM | JMX Exporter(独立或 Java Agent) |
|
||
| Instrumentation | 埋点开销 | Java 约 12-17ns,通常可忽略 |
|
||
| Implementation | 为何 64 位浮点 | 简化设计;2^53 内整数精确;极端场景 285 年才出问题 |
|
||
|
||
> 引自:[Frequently asked questions](https://prometheus.io/docs/introduction/faq/)
|
||
|
||
---
|
||
|
||
## 附录:本篇覆盖清单
|
||
|
||
本篇内容来源与章节对照表(“无正文(导航页)”的小节不产出正文,仅在此备案)。
|
||
|
||
| # | 官网页面 URL | 页面标题 | 类目 | 对应本篇章节目 |
|
||
| --- | --- | --- | --- | --- |
|
||
| 1 | <https://prometheus.io/docs/introduction/overview/> | Overview | docs | 1.1 / 1.3 / 1.4 / 4.2 |
|
||
| 2 | <https://prometheus.io/docs/introduction/first_steps/> | First steps with Prometheus | docs | 2.3 / 2.5 / 2.6 |
|
||
| 3 | <https://prometheus.io/docs/introduction/index/> | Introduction | docs | —(导航页,无正文) |
|
||
| 4 | <https://prometheus.io/docs/introduction/glossary/> | Glossary | docs | 3.4 |
|
||
| 5 | <https://prometheus.io/docs/introduction/faq/> | Frequently asked questions | docs | 5.4(并散见于 1.1 / 2.6 / 3.1 / 4.1) |
|
||
| 6 | <https://prometheus.io/docs/introduction/comparison/> | Comparison to alternatives | docs | 1.5 |
|
||
| 7 | <https://prometheus.io/docs/introduction/roadmap/> | Roadmap | docs | 5.1 |
|
||
| 8 | <https://prometheus.io/docs/introduction/release-cycle/> | Long-term support | docs | 5.2 / 4.4.4 |
|
||
| 9 | <https://prometheus.io/docs/introduction/media/> | Media | docs | 5.3 |
|
||
| 10 | <https://prometheus.io/docs/introduction/design-doc/> | Design documents | docs | 4.1 |
|
||
| 11 | <https://prometheus.io/docs/concepts/data_model/> | Data model | docs | 3.1 |
|
||
| 12 | <https://prometheus.io/docs/concepts/metric_types/> | Metric types | docs | 3.2 |
|
||
| 13 | <https://prometheus.io/docs/concepts/jobs_instances/> | Jobs and instances | docs | 3.3 |
|
||
| 14 | <https://prometheus.io/docs/concepts/index/> | Concepts | docs | —(导航页,无正文) |
|
||
| 15 | <https://prometheus.io/docs/prometheus/latest/getting_started/> | Getting started | core | 2.4 / 2.5 / 2.6 |
|
||
| 16 | <https://prometheus.io/docs/prometheus/latest/installation/> | Installation | core | 2.1 / 2.2 / 2.6 |
|
||
| 17 | <https://prometheus.io/docs/prometheus/> | Prometheus(server 文档入口) | core | —(导航页,无正文) |
|
||
| 18 | <https://prometheus.io/docs/prometheus/latest/prometheus_agent/> | Prometheus Agent Mode | core | 4.3 |
|
||
| 19 | <https://prometheus.io/docs/prometheus/latest/stability/> | API stability guarantees | core | 4.4 / 5.2.7 |
|
||
| 20 | <https://prometheus.io/docs/tutorials/getting_started/> | Getting started with Prometheus | docs | 1.1 / 2.1 / 2.4.9 / 4.2.1 |
|
||
| 21 | <https://prometheus.io/docs/tutorials/understanding_metric_types/> | Understanding metric types | docs | 3.2 |
|
||
| 22 | <https://prometheus.io/docs/tutorials/> | Tutorials | docs | —(导航页,无正文) |
|
||
| 23 | <https://prometheus.io/docs/guides/> | Guides | docs | —(导航页,无正文) |
|
||
| 24 | <https://prometheus.io/docs/alerting/> | Alertmanager | docs | —(导航页,无正文) |
|
||
|
||
**说明**:
|
||
|
||
- 第 18、19 项(Agent Mode、API stability)为完成本篇第 4 章所需的补充素材,直接取自 `handbook-src/raw/core/prometheus_agent.md` 与 `handbook-src/raw/core/stability.md`。
|
||
- 第 3、14、17、22、23、24 项以及 batch 中的 `Concepts`、`Tutorials`、`Guides`、`Prometheus Server`、`Alertmanager` 索引页均为**导航/落地页,正文为空**,无概念、命令、配置项或示例可提炼,故不产出正文内容。
|
||
|
||
---
|
||
|
||
> **第 1 篇结束。** 下一篇《第 2 篇:PromQL 与查询》将展开查询基础、操作符、查询函数、示例、HTTP API 与 Remote Read API。
|