Prometheus + Grafana 监控入门实战:从零跑通指标采集到出图

发布时间:2026/7/16 10:13:32

Prometheus + Grafana 监控入门实战:从零跑通指标采集到出图 Prometheus Grafana 监控入门实战:从零跑通指标采集到出图服务上线后最怕的一句话是「用户说慢,你打开服务器一看 CPU、内存、QPS 一概不知」。日志能告诉你「发生了什么」,但看不出趋势和拐点。Prometheus Grafana 就是这套「趋势可视化」的事实标准组合:Prometheus 负责按时间拉取并存储指标,Grafana 负责把这些指标画成图。这篇用 Docker Compose 从零跑通,监控一个真实的 Node Exporter,看懂 PromQL 的基本查询。两个角色分工先理清楚这套组合里谁干什么,否则配置时容易懵:Exporter:被监控对象的「指标出口」。它把系统状态暴露成一个 HTTP 接口(通常是/metrics),返回纯文本的指标。比如 Node Exporter 暴露机器的 CPU/内存/磁盘。Prometheus:主动周期性地去「拉」(pull)各个 Exporter 的/metrics,存进自己的时序数据库,并提供查询语言 PromQL。Grafana:连到 Prometheus 当数据源,用 PromQL 查数据,画成仪表盘。记住一个反直觉的点:Prometheus 是主动拉取,不是被动接收。所以你要做的是「告诉 Prometheus 去哪拉」,而不是让服务把数据推给它。用 Docker Compose 一把拉起建一个目录,先写 Prometheus 的配置prometheus.yml,核心就是scrape_configs——告诉它拉谁:global:scrape_interval:15s# 每 15 秒拉一次scrape_configs:-job_name:prometheus# 监控 Prometheus 自己static_configs:-targets:[localhost:9090]-job_name:node# 监控宿主机static_configs:-targets:[node-exporter:9100]# 用 compose 里的服务名再写docker-compose.yml把三个组件一起拉起:services:prometheus:image:prom/prometheus:latestports:-9090:9090volumes:# 把上面的配置挂进容器-./prometheus.yml:/etc/prometheus/prometheus.ymlnode-exporter:image:prom/node-exporter:latestports:-9100:9100grafana:image:grafana/grafana:latestports:-3000:3000environment:-GF_SECURITY_ADMIN_PASSWORDadmin# 初始密码,生产务必改启动并验证:dockercompose up-d# 确认 node-exporter 在正常吐指标(能看到一大堆 node_ 开头的行)curl-slocalhost:9100/metrics|head# 确认 Prometheus 认为目标是 UP 的# 浏览器打开 http://localhost:9090/targets,两个 job 都应是绿色 UP如果node这个 target 显示 down,九成是targets里写错了——容器之间要用服务名(node-exporter:9100)互访,不能写localhost,因为 Prometheus 容器里的 localhost 是它自己。用 PromQL 问出有用的信息打开http://localhost:9090,在查询框里练几个真正常用的表达式。直接查内存可用字节数,是个瞬时值:node_memory_MemAvailable_bytes但监控真正关心的是「变化率」。比如 CPU 使用率,Node Exporter 只给了各模式累计秒数node_cpu_seconds_total,得自己算。核心是rate()——求某个计数器在一段时间内的每秒增长率:# 5 分钟内 idle(空闲)模式的每秒增长率,再用 1 减去它 使用率 100 - (avg(rate(node_cpu_seconds_total{modeidle}[5m])) * 100)这里的关键概念:node_cpu_seconds_total是只增不减的计数器(counter),直接看它的绝对值没意义,必须用rate()转成「每秒速率」才有解读价值。这是 PromQL 最重要的一课——counter 看斜率,不看绝对值。再看内存使用率,用两个 gauge(可增可减的瞬时值)相除:(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100接进 Grafana 出图浏览器开http://localhost:3000,用admin/上面设的密码登录。左侧Connections → Data sources → Add data source → Prometheus,URL 填http://prometheus:9090(同样用服务名,别写 localhost)。保存时点Save test,提示绿色即通。Dashboards → New → Import,填入官方社区仪表盘 ID1860(Node Exporter Full),数据源选刚建的 Prometheus。导入后立刻能看到 CPU、内存、磁盘、网络的完整面板——不用自己一个个画图。想自己建面板也简单:New dashboard → Add visualization,在查询框粘上面那条 CPU 使用率 PromQL,右上角选时间范围,曲线就出来了。一个新手常忽略的点:数据保留期Prometheus 默认只存15 天数据,到期自动删。想留更久,启动参数加上:command:---config.file/etc/prometheus/prometheus.yml---storage.tsdb.retention.time90d# 保留 90 天注意本地磁盘存储不适合长期海量数据,真要长留得接远程存储(如 Thanos、VictoriaMetrics),但入门阶段 90 天足够。小结三个角色:Exporter 出指标 → Prometheus 拉取存储 → Grafana 出图,Prometheus 是主动拉取。容器间互访一律用服务名,别写localhost,这是入门最高频的坑。PromQL 里counter(只增)看rate()斜率,gauge(瞬时)看绝对值或相除,这是解读指标的分水岭。Grafana 别从零画图,导入社区仪表盘 ID1860直接拿到整套 Node Exporter 面板。默认只留 15 天数据,按需用--storage.tsdb.retention.time调整。一句话记忆点:Prometheus 定时拉指标、counter 要算 rate,Grafana 连数据源、面板靠导入。

相关新闻