981 字
5 分钟
搭建 Prometheus + Grafana:从指标采集到可视化面板

上一篇讲了监控方法论,这篇动手落地:用 Prometheus 采集一台 Linux 主机的指标,再用 Grafana 画成面板。这是目前云原生生态里最主流的监控组合,理解它的工作流程后,再监控 MySQL、Nginx 或自己的应用都是同一套路。

整体架构:拉模型#

Prometheus 的核心特点是主动拉取(Pull):它按配置的时间间隔访问各目标暴露的 /metrics HTTP 接口,把文本格式的指标抓回来存进内置时序数据库。被监控方只需要「暴露」,不需要知道监控系统的存在。

三个角色:

  • Exporter:运行在被监控机器上,把系统/服务状态翻译成 Prometheus 文本格式。监控 Linux 主机用 node_exporter。
  • Prometheus Server:定时抓取、存储、提供 PromQL 查询接口。
  • Grafana:连接 Prometheus 做可视化展示(Prometheus 自带 UI 只适合临时查询)。

第一步:部署 node_exporter#

在被监控机器上(以 Linux amd64 为例):

Terminal window
# 下载官方发布的二进制(版本号以 releases 页面为准)
wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz
tar xzf node_exporter-1.9.1.linux-amd64.tar.gz
sudo cp node_exporter-1.9.1.linux-amd64/node_exporter /usr/local/bin/

用 systemd 管理,新建 /etc/systemd/system/node_exporter.service:

[Unit]
Description=Node Exporter
After=network.target
[Service]
User=nobody
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
Terminal window
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
curl http://localhost:9100/metrics | head

最后一行应该输出大量 node_cpu_seconds_total、node_memory_MemAvailable_bytes 之类的指标——采集端就绪。

第二步:配置 Prometheus 抓取#

Prometheus 的配置文件 prometheus.yml 里加一段 job:

scrape_configs:
- job_name: "node"
scrape_interval: 15s
static_configs:
- targets: ["10.0.1.11:9100", "10.0.1.12:9100"]
labels:
env: "production"
  • scrape_interval: 15s 是全局常用值,太密浪费存储,太疏丢失细节。
  • labels 会附加到这个 job 抓到的所有序列上,是多环境区分的标准做法。

改完执行 promtool check config prometheus.yml 校验,再重启或调用 /-/reload 热加载。打开 Prometheus 自带 UI(:9090/targets),目标状态变为 UP 即成功。

第三步:PromQL 入门五连#

PromQL 是这套体系的核心资产,掌握五个常用查询就能应对日常:

# 1. CPU 使用率(按实例):1 减去空闲比例,irate 取最近两点瞬时变化率
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 2. 内存使用率
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# 3. 根分区磁盘使用率
100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100)
# 4. 磁盘 IO 繁忙度
irate(node_disk_io_time_seconds_total[5m]) * 100
# 5. 网络入向流量(字节/秒)
irate(node_network_receive_bytes_total{device="eth0"}[5m])

几个关键点:irate 对计数器求「每秒增长」;[5m] 是采样窗口,至少为抓取间隔的 2~4 倍;by (instance) 是聚合维度。在 UI 的 Graph 页逐个输入观察曲线,比背语法更快建立直觉。

第四步:接入 Grafana#

  1. Grafana 里添加 Data source → Prometheus,填 http://<prometheus地址>:9090。
  2. Dashboards → Import,输入官方共享面板 ID——Node Exporter Full 的面板 ID 是 1860,导入后选择数据源即得一套完整主机监控页。
  3. 之后可以基于导入的面板删改:保留 CPU、内存、磁盘、网络四组核心图,去掉用不上的硬件传感器图表。

数据保留与容量规划#

Prometheus 默认把数据存 15 天(--storage.tsdb.retention.time)。粗略估算磁盘占用:每个活跃时间序列每秒样本约 12 字节。一台 node_exporter 约暴露 1000 个序列,15 秒抓取一次,15 天约 36 GB——几十台机器的规模单机 Prometheus 完全扛得住。

需要更长保留期或全局查询时,再考虑 Thanos、VictoriaMetrics 这类横向扩展方案,初期不必过度设计。

下一步#

主机监控跑通后,按相同模式扩展:MySQL 用 mysqld_exporter,Nginx 用 nginx-prometheus-exporter,自己的应用则引入客户端库(如 Go 的 prometheus/client_golang)在代码里暴露 /metrics。采集-存储-展示的管道不变,只是数据来源变多。

延伸阅读#

搭建 Prometheus + Grafana:从指标采集到可视化面板
https://meow.us.kg/posts/prometheus-grafana-monitoring-stack/
作者
もゆちゃん
发布于
2026-10-09
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取