监控系统需要持续采集、保存、查询、可视化和告警。
但这些命令主要解决“现在发生了什么”,而监控系统需要进一步解决“持续采集、保存、查询、可视化和告警”。
Prometheus 负责采集和存储指标,PromQL 负责查询,Grafana 负责把这些数据展示出来,并进一步形成 Dashboard 与告警。
一、Prometheus 与 Grafana 概述
1.1 为什么需要监控系统
在 Linux 主机上,可以先用以下命令查看当前状态:
topfree -hdf -hss -lntpsystemctl status nginx查看当前系统状态。
但是这些工具存在一个问题:
需要人工执行例如:
CPU = 30%只能说明:
现在 CPU 大约是 30%如果希望知道:
过去 24 小时 CPU 怎么变化?什么时候开始升高?部署之后有没有明显变化?什么时候超过阈值?就需要持续采集并保存数据。
因此监控系统的基本流程是:
目标主机 │ ▼指标暴露 │ ▼Prometheus │ ├── 采集 ├── 存储 └── 查询 │ ▼ PromQL │ ▼ Grafana │ ├── Dashboard └── Alerting1.2 Prometheus 是什么
Prometheus 是开源的监控与告警工具,同时具备时间序列数据库能力。
它最核心的数据模型是:
Metric+Labels+Timestamp+Value例如:
http_requests_total{ job="api", method="GET", status="200"}在某一个时间点可能对应:
15320随着时间变化:
1000011000125001380015320...这些数据就组成了一条时间序列。
Prometheus 官方将自己的核心特点概括为:
- 多维度时间序列数据模型
- PromQL 查询语言
- HTTP Pull 模型
- Service Discovery
- 本地时间序列存储
- 告警规则与 Alertmanager
官方文档: Prometheus Overview
1.3 Grafana 是什么
Grafana 更偏向:
查询+可视化+Dashboard+告警它本身不是 Prometheus 的替代品。
典型关系:
Prometheus │ │ PromQL ▼ Grafana │ ├── Graph ├── Gauge ├── Table ├── Stat └── AlertGrafana 通过 Data Source 连接外部数据系统。
除了 Prometheus,还可以连接:
LokiElasticsearchMySQLPostgreSQLInfluxDBCloudWatch...也就是说:
Prometheus→ 保存和提供 Metrics
Grafana→ 查询和展示 MetricsGrafana 官方: Grafana Data Sources
二、Prometheus 的核心数据模型
2.1 Metric
Metric 就是需要观察的指标。
例如:
CPU 使用率内存使用量磁盘空间HTTP 请求数HTTP 错误数数据库连接数可以用:
node_cpu_seconds_totalnode_memory_MemAvailable_bytesnode_filesystem_avail_bytes等指标表示。
2.2 Labels
Prometheus 最大的特点之一就是:
Labels例如:
http_requests_total{ method="GET", status="200", instance="10.0.0.10:8080"}同一个 Metric:
http_requests_total通过不同的 Label 可以形成不同的时间序列:
method=GETstatus=200
method=GETstatus=500
method=POSTstatus=200因此:
Metric Name+Labels共同确定一条具体的时间序列。
Prometheus 官方数据模型: Data model
2.3 Label Cardinality
Label 虽然非常强大,但不能无限制地增加。
例如:
user_idrequest_idsession_id如果每个请求都产生不同的 Label 值:
request_id=abc001request_id=abc002request_id=abc003...就会产生大量时间序列。
这就是:
High Cardinality可能导致:
内存增加磁盘增加查询变慢因此 Prometheus 中需要谨慎设计 Label。
一般来说:
服务名实例HTTP MethodHTTP Status环境这类有限集合更适合作为 Label。
而:
用户 ID订单 ID请求 IDUUID通常不适合直接作为高频 Metric Label。
三、Prometheus 的 Pull 模型
3.1 Prometheus 如何获取指标
Prometheus 最典型的工作方式是:
Exporter / Application │ │ HTTP /metrics ▼ PrometheusPrometheus 主动去目标地址抓取:
GET /metrics这就是:
Pull模型。
官方文档明确说明,Prometheus 默认通过 HTTP Pull 模型采集时间序列。
3.2 /metrics
很多 Prometheus Exporter 会提供:
/metrics例如:
http://10.0.0.10:9100/metrics内容通常类似:
# HELP node_cpu_seconds_total ...# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{ cpu="0", mode="idle"} 12345因此:
/metrics→ 向 Prometheus 暴露可采集指标3.3 Push 与 Pull
Prometheus 主要采用:
Pull但也支持某些特殊场景下通过 Pushgateway 接收短生命周期任务推送的数据。
不过应该注意:
Pushgateway≠Prometheus 默认采集方式对于长期运行的服务,通常优先使用:
Prometheus → Pull → Target四、Exporter
4.1 Exporter 是什么
Exporter 可以理解为:
把某个系统的数据转换成 Prometheus Metrics例如:
Linux │ ▼node_exporter │ ▼/metrics │ ▼Prometheus不同系统可能使用不同 Exporter:
Linux→ node_exporter
MySQL→ mysqld_exporter
Redis→ redis_exporter
PostgreSQL→ postgres_exporter这使 Prometheus 能够统一采集不同系统的指标。
4.2 node_exporter
Linux 主机监控中最常见的是:
node_exporter它可以暴露:
CPUMemoryDiskNetworkFilesystemLoad...因此:
Linux Kernel / /proc / /sys │ ▼ node_exporter │ ▼ /metrics官方: node_exporter
五、安装 Prometheus
Prometheus 可以直接以二进制方式运行,也可以运行在容器中。
对于理解 Linux 运维,直接二进制部署是一个很好的学习方式:
Linux ├── prometheus └── node_exporter而实际项目中也常见:
Docker ├── prometheus └── grafana5.1 创建 Prometheus 用户
生产环境不应该默认使用 root 运行 Prometheus。
例如:
sudo useradd \ --no-create-home \ --shell /usr/sbin/nologin \ prometheus创建目录:
sudo mkdir -p /etc/prometheussudo mkdir -p /var/lib/prometheus设置权限:
sudo chown -R prometheus:prometheus \ /etc/prometheus \ /var/lib/prometheus5.2 配置文件
Prometheus 的核心配置文件通常是:
prometheus.yml一个最简单的配置:
global: scrape_interval: 15s
scrape_configs:
- job_name: prometheus static_configs: - targets: - localhost:9090这里:
scrape_interval决定采集间隔。
例如:
15s意味着:
每 15 秒采集一次5.3 启动 Prometheus
直接运行:
prometheus \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/var/lib/prometheus验证:
curl http://127.0.0.1:9090/-/ready如果正常,Prometheus Web UI 通常可以通过:
http://<server>:9090访问。
六、使用 systemd 管理 Prometheus
将 Prometheus 作为长期运行的服务时,可以使用 systemd。
创建:
/etc/systemd/system/prometheus.service例如:
[Unit]Description=PrometheusAfter=network.target
[Service]User=prometheusGroup=prometheus
ExecStart=/usr/local/bin/prometheus \ --config.file=/etc/prometheus/prometheus.yml \ --storage.tsdb.path=/var/lib/prometheus
Restart=on-failure
[Install]WantedBy=multi-user.target重新加载:
sudo systemctl daemon-reload启动:
sudo systemctl start prometheus设置开机启动:
sudo systemctl enable prometheus查看:
systemctl status prometheus日志:
journalctl -u prometheus这样就把上一篇 Linux 服务监控的知识连接到了 Prometheus:
systemd │ ▼Prometheus Service │ ▼Metrics七、配置 node_exporter
7.1 启动 node_exporter
node_exporter 默认监听:
9100启动后:
curl http://127.0.0.1:9100/metrics如果能够看到:
node_cpu_seconds_totalnode_memory_...node_filesystem_...说明 Exporter 工作正常。
7.2 systemd
也可以把 node_exporter 配置成服务:
[Unit]Description=Node ExporterAfter=network.target
[Service]User=node_exporterGroup=node_exporter
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
[Install]WantedBy=multi-user.target启动:
sudo systemctl daemon-reloadsudo systemctl enable --now node_exporter检查:
systemctl status node_exporter7.3 Prometheus 配置 Target
修改:
scrape_configs:
- job_name: node static_configs: - targets: - 127.0.0.1:9100然后让 Prometheus 重新加载配置。
最简单的方式可以直接重启:
sudo systemctl restart prometheus生产环境也可以通过 Prometheus 提供的配置 reload 机制减少中断。
八、Target 与 Job
Prometheus 中非常重要的两个概念:
JobTarget例如:
- job_name: linux static_configs: - targets: - 192.168.1.10:9100 - 192.168.1.11:9100 - 192.168.1.12:9100这里:
job = linux而:
targets=192.168.1.10:9100192.168.1.11:9100192.168.1.12:9100可以理解为:
Job │ ├── Target A ├── Target B └── Target CPrometheus 会根据配置定期抓取这些 Target。
九、Prometheus Targets 页面
Prometheus 自带 Web UI。
打开:
http://<prometheus>:9090然后查看:
Status→ Targets可以看到:
UPDOWN例如:
linux/node192.168.1.10:9100UP表示:
Prometheus ↓192.168.1.10:9100 ↓成功采集如果:
DOWN可能是:
Exporter 没启动端口错误网络不通防火墙DNS目标机器故障因此:
Prometheus Targets 页面本身就是非常重要的故障排查入口。
十、PromQL 基础
PromQL 是 Prometheus 的查询语言。
官方文档: PromQL basics
10.1 查询 Metric
例如:
node_load1表示查询:
1 分钟 Load又例如:
node_memory_MemAvailable_bytes表示:
可用内存10.2 Label 过滤
例如:
node_load1{instance="192.168.1.10:9100"}只查询某个实例。
也可以:
http_requests_total{status="500"}查询:
HTTP 50010.3 Rate
很多指标是 Counter,例如:
http_requests_total它通常只增加:
100120140...如果我们想知道:
每秒增加多少请求可以使用:
rate(http_requests_total[5m])意思可以理解为:
根据最近 5 分钟的数据计算平均每秒增长速度10.4 Sum
例如:
sum(rate(http_requests_total[5m]))将多个时间序列聚合到一起。
10.5 By
例如:
sum by (status) ( rate(http_requests_total[5m]))可以得到:
200 → xxx req/s404 → xxx req/s500 → xxx req/s因此 PromQL 的核心能力之一就是:
选择+过滤+计算+聚合官方文档也将 PromQL 定义为用于实时选择和聚合时间序列数据的函数式查询语言。
十一、常用 Linux 监控 PromQL
11.1 CPU
CPU 使用率可以从:
node_cpu_seconds_total计算。
常见查询:
100 - ( avg by (instance) ( rate(node_cpu_seconds_total{ mode="idle" }[5m]) ) * 100)结果:
CPU 使用率 %11.2 Memory
可以使用:
100 * ( 1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)得到大致的:
Memory 使用率这与上一篇:
free -h所观察的概念对应。
11.3 Disk
例如:
100 * ( 1 - node_filesystem_avail_bytes / node_filesystem_size_bytes)可以估算文件系统使用率。
11.4 Network
例如统计网络接收速率:
rate( node_network_receive_bytes_total[5m])发送:
rate( node_network_transmit_bytes_total[5m])这样上一篇:
ipss网络统计就进入了持续监控体系。
十二、Prometheus 的指标类型
Prometheus 常见 Metric Type:
CounterGaugeHistogramSummary12.1 Counter
Counter 表示只增不减的累计值。
例如:
HTTP 请求总数错误请求总数类似:
100120150180适合计算:
rate(...)increase(...)12.2 Gauge
Gauge 表示可以上下变化的当前值。
例如:
CPU 温度内存使用量并发连接数队列长度可能:
100801206012.3 Histogram
Histogram 用于观察一组数值的分布。
最常见:
HTTP 请求耗时例如:
0.1s0.2s0.5s1s2sHistogram 可以帮助回答:
P50P90P95P99这对于服务性能监控非常重要。
12.4 Summary
Summary 也可以描述分布和分位数,但它与 Histogram 在计算方式和适用场景上有所区别。
初学阶段最需要掌握:
CounterGaugeHistogram十三、Grafana 安装与运行
Grafana 可以直接安装在 Linux 上,也可以运行在 Docker 中。
对于学习环境,可以使用 Docker Compose 快速启动:
services:
grafana: image: grafana/grafana ports: - "3000:3000" volumes: - grafana-data:/var/lib/grafana
volumes: grafana-data:启动:
docker compose up -d查看:
docker compose ps日志:
docker compose logs grafana访问:
http://<server>:3000Grafana 官方安装文档: Install Grafana
十四、Grafana Data Source
Grafana 启动之后,需要告诉它:
数据在哪里?这就是:
Data Source例如:
Grafana │ ▼Prometheushttp://prometheus:9090Grafana 官方把 Data Source 定义为连接到实际数据存储后端的连接;Grafana 可以通过这些数据源查询、可视化和告警,而不会要求把数据迁移到 Grafana 中。
添加 Prometheus:
Connections ↓Data Sources ↓Prometheus填写:
URL例如 Docker Compose 环境:
http://prometheus:9090而不是:
http://localhost:9090这是容器化环境中非常常见的区别:
Grafana Container │ │ ▼prometheus:9090这里的:
prometheus是 Compose 网络中的服务名。
十五、Grafana Dashboard
Dashboard 是 Grafana 最核心的使用方式之一。
可以包含多个 Panel:
┌──────────────────────────────────────┐│ CPU Usage ││ /\ ││ /\ / \__ ││ _______/ \_/ \___ │└──────────────────────────────────────┘
┌───────────────────┐│ Memory Usage ││ 62% │└───────────────────┘
┌───────────────────┐│ Disk Usage ││ 74% │└───────────────────┘一个 Linux Server Dashboard 可以包含:
CPUMemoryLoadDiskNetworkFilesystem15.1 Panel
每个 Panel 通常包含:
Query+Visualization例如:
node_load1然后选择:
Time Series就可以看到 Load 随时间变化的曲线。
15.2 常见 Visualization
Grafana 中常见:
Time SeriesStatGaugeTableBar Chart不同数据应该选择合适的展示方式。
例如:
CPU 趋势→ Time Series
当前 CPU→ Gauge / Stat
多个服务状态→ Table / Stat十六、Grafana 变量
当 Dashboard 面向多个主机时,不能为每台机器建立一张完全独立的 Dashboard。
可以使用:
Variables例如:
instance用户选择:
192.168.1.10:9100Dashboard 自动切换。
例如 PromQL:
node_load1{ instance="$instance"}于是:
一个 Dashboard │ ├── server1 ├── server2 ├── server3 └── server4这对于实际运维非常重要。
十七、Prometheus 告警
17.1 为什么需要 Alert
监控系统不应该要求运维人员:
一直盯着 Grafana例如:
凌晨 3 点CPU > 95%应该主动产生:
Alert而不是等到早上才发现。
Prometheus 的传统告警体系可以理解为:
Prometheus │ │ Alert Rule ▼ Alert │ ▼Alertmanager │ ├── Grouping ├── Inhibition ├── Silence └── NotificationPrometheus 官方明确将告警分成两个部分:Prometheus 中定义和评估告警规则,Alertmanager 负责对告警进行聚合、抑制、静默和通知。
17.2 Alert Rule
例如:
groups: - name: node rules:
- alert: HighCPUUsage expr: | ( 100 - ( avg by (instance) ( rate(node_cpu_seconds_total{ mode="idle" }[5m]) ) * 100 ) ) > 90 for: 5m
labels: severity: warning
annotations: summary: "CPU 使用率过高" description: "实例 {{ $labels.instance }} CPU 使用率超过 90%"这里:
expr→ 告警条件
for→ 持续多久才触发
labels→ 告警分类
annotations→ 告警描述17.3 为什么需要 for
假设:
CPU = 95%只持续:
10 秒可能只是瞬时波动。
如果规定:
for: 5m则表示:
条件持续 5 分钟才触发。
这样可以减少:
瞬时波动→ 大量误告警十八、Alertmanager
Alertmanager 并不是用来计算:
CPU > 90%它主要负责收到 Prometheus 产生的告警后进行:
GroupingInhibitionSilencingRoutingNotifications例如:
Prometheus │ ├── CPU Alert ├── Memory Alert ├── Disk Alert └── Service Alert │ ▼ Alertmanager │ ├── Group ├── Route └── Notify │ ├── Email ├── Webhook └── On-call十九、Grafana Alerting
现在 Grafana 自身也提供完整的 Alerting 能力。
例如:
Grafana │ ▼Prometheus Data Source │ ▼PromQL │ ▼Alert RuleGrafana 官方目前支持:
Grafana-managed alert rules也可以查看 Prometheus 自己管理的规则;对于 Prometheus 原生告警规则,Grafana 中主要作为查看入口,而规则修改仍然需要回到 Prometheus 配置或规则文件中。
因此学习阶段可以先这样理解:
Prometheus→ Metrics + PromQL + 原生告警规则
Alertmanager→ 告警聚合与通知
Grafana→ Dashboard + Query + Grafana Alerting二十、Prometheus 与 Grafana 的典型架构
一个最基础的 Linux 监控系统:
Linux Server │ ▼ node_exporter │ /metrics │ ▼ Prometheus ┌───────┴────────┐ │ │ TSDB PromQL │ ▼ Grafana │ ┌───────────┴───────────┐ ▼ ▼ Dashboard Alert多个服务器:
Node 1 ── node_exporter ──┐Node 2 ── node_exporter ──┤Node 3 ── node_exporter ──┤Node 4 ── node_exporter ──┤ ▼ Prometheus │ ▼ Grafana二十一、Service Discovery
前面的配置:
static_configs: - targets: - 192.168.1.10:9100属于:
Static Configuration服务器多了以后:
100 台500 台1000 台手动维护就很麻烦。
因此 Prometheus 支持:
Service Discovery例如 Kubernetes 环境中,可以通过 Kubernetes Service Discovery 动态发现目标。
Kubernetes │ ├── Pod ├── Service └── Node │ ▼Service Discovery │ ▼Prometheus这也是 Prometheus 非常适合云原生环境的重要原因之一。
二十二、Kubernetes 与 Prometheus
前面的 Kubernetes 文章里学习了:
NodePodServiceDeployment现在可以将它们与监控连接起来:
Kubernetes │ ├── Node │ └── node_exporter │ ├── Pod │ └── application metrics │ └── Service │ ▼ Prometheus │ ▼ Grafana这样:
Kubernetes→ 管理工作负载
Prometheus→ 观察工作负载
Grafana→ 展示观察结果二十三、一个完整的 Linux 监控案例
假设现在有:
Server A192.168.1.10
Server B192.168.1.11每台服务器运行:
node_exporter架构:
Server A │ └── node_exporter :9100 │ ▼ ┐ │Server B │ │ │ └── node_exporter :9100 │ ▼ Prometheus │ ▼ GrafanaPrometheus 配置:
scrape_configs:
- job_name: linux static_configs: - targets: - 192.168.1.10:9100 - 192.168.1.11:9100在 Prometheus 中查询:
up结果:
serverA → 1serverB → 1如果:
serverB → 0就说明 Prometheus 当前无法成功采集:
192.168.1.11:9100进一步排查:
node_exporter ↓端口 9100 ↓网络 ↓防火墙 ↓服务器这就是监控系统与 Linux 运维排障的结合。
二十四、Prometheus 常见故障
24.1 Target DOWN
现象:
Prometheus→ Targets→ DOWN第一步:
curl http://<target>:9100/metrics如果直接失败:
Exporter ↓网络 ↓端口继续检查:
systemctl status node_exporter以及:
ss -lntp | grep 910024.2 Prometheus 启动失败
首先:
systemctl status prometheus然后:
journalctl -u prometheus如果修改了 YAML:
YAML 格式错误可能导致 Prometheus 无法加载配置。
因此修改配置后应该先验证配置,而不是直接不断重启服务。
24.3 查询没有数据
例如:
node_cpu_seconds_total没有返回数据。
排查:
Metric 是否存在 ↓Target 是否 UP ↓Exporter 是否正常 ↓Prometheus 是否成功采集 ↓时间范围是否正确 ↓Label 是否匹配尤其注意:
instance="..."写错后也可能导致:
No data24.4 Grafana 没有数据
首先不要马上修改 Dashboard。
先检查:
Grafana ↓Data Source ↓Prometheus ↓PromQL ↓Metrics在 Grafana Data Source 中进行连接测试。
Grafana 当前官方文档也把 Prometheus 作为标准 Data Source,并提供 PromQL Query Editor。
如果 Data Source 正常,再检查:
Dashboard Query二十五、监控系统的几个重要原则
25.1 监控不是越多越好
如果一个 Dashboard:
1000 个 Panel看起来非常“专业”。
但真正故障时:
找不到重点就失去了监控的价值。
更好的方式是:
Overview ↓发现异常 ↓Service ↓Host ↓Detail25.2 从业务目标设计指标
不要只监控:
CPUMemoryDisk还要问:
用户是否能够访问?请求是否成功?响应是否变慢?错误率有没有增加?例如 Web 服务:
AvailabilityLatencyTrafficErrors这些比单纯:
CPU = 50%更接近业务健康程度。
25.3 监控指标应该能解释问题
例如发现:
HTTP 5xx ↑接下来应该能够通过:
CPUMemoryDatabase ConnectionsLatency进一步判断:
资源不足?数据库问题?网络问题?应用本身异常?这样监控才真正成为:
故障排查工具二十六、从 Metrics 走向 Logs
到这里,我们主要处理的是:
Metrics例如:
CPU = 80%Memory = 70%QPS = 1000Latency = 200ms它们很适合回答:
发生了什么?什么时候发生?严重程度如何?但是它们往往不能直接回答:
为什么发生?于是需要:
Logs例如:
2026-09-14 10:30:01 ERRORDatabase connection refused因此后续会进入:
Metrics→ Prometheus
Visualization→ Grafana
Logs→ 日志收集 / ELK
Metrics + Logs + Traces→ OpenTelemetry / 可观测性体系二十七、监控体系整体模型
目前已经可以把前两篇监控内容串起来:
Linux Server │ ├── CPU ├── Memory ├── Disk ├── Network ├── Process └── Service │ ▼ Exporter │ ▼ Prometheus │ ├── Time Series ├── PromQL └── Alert Rules │ ▼ Alertmanager │ ▼ Notification
Prometheus │ ▼ Grafana │ ├── Dashboard ├── Visualization └── Alerting而完整的可观测性体系会继续扩展成:
Observability │ ┌────────────┼────────────┐ ▼ ▼ ▼ Metrics Logs Traces │ │ │ Prometheus │ OpenTelemetry │ │ │ Grafana ELK/... │ │ │ │ └────────────┼────────────┘ ▼ Correlation │ ▼ Root Cause二十八、Prometheus 与 Grafana 的关系总结
最后可以用一句非常简单的话区分两者:
Prometheus→ “把指标收进来、存下来、查出来”
Grafana→ “把数据展示出来,让人看懂”更加完整地说:
Exporter ↓Metrics ↓Prometheus ├── Storage ├── PromQL └── Alert Rules ↓ Alertmanager
Prometheus ↓Grafana ├── Dashboard ├── Visualization └── Alerting而上一篇 Linux 服务监控中的:
topfreedfiostatsssystemctljournalctl现在变成了:
人工查看 ↓Exporter ↓Prometheus ↓Grafana ↓持续监控因此:
Prometheus 解决“持续采集和查询指标”,Grafana 解决“把指标组织成可视化界面”,而 Exporter 则负责把 Linux、数据库和其他系统的状态转换成 Prometheus 能理解的 Metrics。