📈 第01章 · Prometheus 概述
抓取模型/时序数据库
Prometheus 概述¶
服务器坏了才会被投诉,这话对一半。更糟的是"快坏了"你不知道,直到用户先发现。监控的本质是把机器的沉默翻译成人能看懂的信号,并让它在出事的下一秒就提醒你。这一章介绍 Prometheus 是什么、怎么工作、在这台服务器上已经跑成了一个什么样子——后面所有章节都在它的骨架上搭建。
监控解决什么问题¶
一台服务器最老实的指标是"现在还活着",但"活着"不保证"健康"。比如:
uptime # 开机时长与平均负载
free -h # 内存还剩多少
df -h / # 根分区用了多少
systemctl status prometheus # 服务是否 active
这些命令只能看"当下这一刻"。你半夜不在电脑前,磁盘悄无声息地涨到 97%,第二天用户才来骂。真正的监控要解决三件事:
| 诉求 | 含义 | 反面例子 |
|---|---|---|
| 看得见 | 历史趋势能回放,能看变化 | 只看到"现在 42%",不知道昨天多少 |
| 看得准 | 数字可量化、可对比 | 靠人肉记 date 和 df,记不齐 |
| 先一步 | 出问题前给信号,出事立刻知道 | 用户先发现,你后知道 |
Prometheus 是什么¶
Prometheus 是 CNCF(the Cloud Native Computing Foundation)旗下的开源监控系统,核心两个身份:抓取器和时序数据库(TSDB)。
- 抓取器(pull 模型):它主动、定时去"拉"各目标的监控指标,而不是等一方"推"过来;
- 时序数据库:每一条记录都是"某时刻的某个值",按时间轴组织,方便做趋势和聚合。
在这台服务器上已经跑着一个 Prometheus 2.45.3(由 systemd 托管),命令和端口如下:
prometheus --version
# prometheus, version 2.45.3+ds (branch: debian/sid, revision: 2.45.3+ds-2ubuntu0.3)
ss -ltnp | grep 9090 # 9090 是 Prometheus 自身 HTTP 服务端口
systemctl status prometheus
# Active: active (running); Main PID: 15583 (prometheus); Memory: 90.9M
核心概念:指标 / 标签 / 时序¶
Prometheus 的数据是"指标 + 标签"的序列。看一个真实的抓取结果:
node_cpu_seconds_total{cpu="0", mode="idle"} 54291.1
node_cpu_seconds_total{cpu="0", mode="iowait"} 10.4
node_memory_MemTotal_bytes 33653807104
| 概念 | 定义 | 例子中的体现 |
|---|---|---|
| 指标名 (metric) | 描述"量的是什么",通常加单位 | node_cpu_seconds_total、node_memory_MemTotal_bytes |
| 标签 (label) | 键值对,用来做维度区分 | cpu="0"、mode="idle" |
| 时序 (time series) | 同一组标签下随时间变化的值序列 | mode="idle" 这一条在每分钟都有一个值 |
标签是重中之重:同一个指标靠不同标签区分维度。后面 PromQL 里用 mode="idle" 挑出空闲态,就是用标签做筛选。
抓取模型:Pull vs Push¶
| 模型 | 特点 | 适用 | 例如 |
|---|---|---|---|
| Pull(拉) | Prometheus 主动来取 | 自建、需要明确控制采集节奏 | Prometheus 抓 node-exporter |
| Push(推) | 目标主动上报 | 短生命周期任务、数不清的实例 | 云厂商聚合、日志/计数字段上报 |
Prometheus 主打 Pull:好处是目标活着才能被抓——一个节点挂了,up 指标立刻为 0,天然具备存活探测能力。代价是它必须能网络直达目标,防火墙要多开一个端口(9100)。
主要组件与数据流¶
┌──────────────┐ 15s 定时抓取 ┌──────────────────┐
│ prometheus │ ───────────────► │ node-exporter │
│ (TSDB+采集) │ localhost:9100 │ (暴露 /metrics) │
└──────────────┘ └──────────────────┘
│ 9090
├─► HTTP API(查询/抓取状态)
├─► 内置 Web UI(浏览器访问 localhost:9090)
└─► rule_files 评估规则 → 触发告警 → Alertmanager
一个 "scrape"(抓取)指 Prometheus 定时去某目标抓一次 /metrics,抓回来的数据写进本地时序数据库。抓取频率由 scrape_interval 控制,后面章节详讲。
数据类型:Counter / Gauge / Histogram / Summary¶
指标值不是只有一种含义,分四类:
| 类型 | 含义 | 典型例子 | 常见疑问 |
|---|---|---|---|
| Counter(计数器) | 只增不减,累计总量 | node_cpu_seconds_total(CPU 累计秒数) |
要"速率"得配 rate() 转一下 |
| Gauge(仪表) | 可增可减,当前快照 | node_memory_MemAvailable_bytes |
直接用,还能 + - 计算 |
| Histogram(直方图) | 把观测值分桶计数 | 请求耗时分布 | 用来算分位数(histogram_quantile) |
| Summary(摘要) | 预聚合了分位数 | 耗时摘要 | 由目标自身算好 |
提示 这四类的分辨直接决定查询写法。
node_exporter里的指标名结尾_total的函数几乎都是 Counter,算比例、算速率前必须先rate或irate,直接用_total只会增长不归零。
存储与保留¶
Prometheus 默认把数据写到 --storage.tsdb.path 指向的目录(通常是 --storage.tsdb.path=/var/lib/prometheus/,默认保留 15 天)。你可以通过启动参数调整保留时长,但别把保留期设成无限大——单机磁盘会被时序慢慢吃满。
# 查看数据目录
ls /var/lib/prometheus/ 2>/dev/null
# 查看存储与保留参数
prometheus --help 2>/dev/null | grep -i 'storage.tsdb'
这一章结束时,你已经能¶
- 说清 Prometheus 是 pull 模型 + 时序数据库;
- 分清指标名、标签、时序三个概念;
- 知道 Counter 和 Gauge 在查询时的差别;
- 在你服务器上确认 Prometheus 版本、端口、systemd 服务状态。
易错点¶
- 把
node_cpu_seconds_total当 CPU 使用率:它是累计秒数,永远在涨;要先rate或irate变成"每秒增量",才是百分比的基础。 - 内存单位是字节:
node_memory_MemTotal_bytes是 33GB 级别的字节数,不换算就不要直接当 GB 看。 - 防火墙只放行 9090 忘了 9100:Prometheus 自己通,但抓不到 node 数据,目标一直
down。 - 抓取失败 ≠ 进程死:目标
down也可能是端口没通、超时(默认 10s)或防火墙拦截,先ss -ltnp确认到底谁挂了。
相关命令¶
systemctl status prometheus、prometheus --version、ss -ltnp | grep 9090、curl localhost:9090/api/v1/status/buildinfo、promtool check config(校验配置,后续章节用)。