如果说操作系统是业务的底座,服务是高可用的骨架,那么监控告警体系就是把这一切串起来的神经与感官。没有监控的运维是「凭感觉」,有了监控的运维才是「凭数据」——CPU 是不是满了、磁盘还剩多少、接口延迟有没有飙升、某个 Pod 是不是刚挂,只有把系统状态持续采集下来、可视化展示、并在异常时主动推送,运维才真正从「救火」走向「防火」。今天我们要在 Ubuntu 上搭建业界事实标准:用 Prometheus 采集指标、用 Grafana 做可视化展示,并引入 node_exporter 采集主机指标,为前面 25 天构建的所有服务装上「眼睛」。

核心概念:Prometheus 的四大组件与采集模型
Prometheus 的架构非常经典,理解它的四大组件就能理解整个生态。
1. Prometheus Server:核心组件,负责按配置周期性「拉取」(pull)各目标的指标,把时间序列数据存储到本地 TSDB,并提供查询 API 与告警规则引擎。
2. Exporter:暴露在外的指标提供者。最常见的是 node_exporter,把 Linux 主机的 CPU、内存、磁盘、网络等指标以 /metrics 接口暴露给 Prometheus 抓取。业务侧可以自行开发 client 端接入,或用社区 exporter(如 mysqld_exporter、nginx_exporter)。
3. Alertmanager:负责接收 Prometheus 的告警事件,做去重、分组、静默与路由,把最终告警推送到邮件、企业微信、钉钉、Slack、Webhook 等渠道。
4. 查询语言 PromQL:Prometheus 独有的时序查询语言,可以像 SQL 一样对时间序列做聚合、过滤、运算,例如 rate(http_requests_total[5m]) 计算过去 5 分钟每秒请求速率。
一句话总结:Prometheus 是「拉模式 + 时序数据库 + 告警引擎」的组合,exporter 是被采集方,Grafana 是展示层。
实战步骤:从零搭建 Prometheus + Grafana
我们的目标是:在一台 Ubuntu 主机上部署 Prometheus 与 Grafana,用 node_exporter 采集本机指标,在 Grafana 里看到 CPU、内存、磁盘、网络四张面板,并配置一条「CPU 使用率过高」的告警。
第一步:安装 Prometheus
Prometheus 官方推荐用二进制包部署,Ubuntu apt 源里的版本较老。先下载最新稳定版:
sudo mkdir -p /opt/prometheus && cd /opt/prometheus
sudo curl -LO https://github.com/prometheus/prometheus/releases/download/v2.53.0/prometheus-2.53.0.linux-amd64.tar.gz
sudo tar -xzf prometheus-2.53.0.linux-amd64.tar.gz
sudo cp prometheus-2.53.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.53.0.linux-amd64/promtool /usr/local/bin/
sudo cp -r prometheus-2.53.0.linux-amd64/rules.example /etc/
sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
sudo mkdir -p /var/lib/prometheus /etc/prometheus
sudo chown -R prometheus:prometheus /var/lib/prometheus /etc/prometheus
第二步:配置 prometheus.yml
创建最小可用的 Prometheus 配置,包含全局抓取间隔、自身指标与 node_exporter 目标:
# /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: ubuntu-demo
rule_files:
- "rules/example.rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
labels:
host: ubuntu-demo-01
校验配置合法性:
sudo promtool check config /etc/prometheus/prometheus.yml
第三步:安装 node_exporter 采集主机指标
sudo curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
sudo tar -xzf node_exporter-1.8.2.linux-amd64.tar.gz
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
访问 http://localhost:9100/metrics 应能看到大量指标。
第四步:编写 systemd 单元文件
分别创建 Prometheus 与 node_exporter 的 unit 文件,实现开机自启与异常自恢复:
# /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring System
After=network-online.target
Wants=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus
--config.file=/etc/prometheus/prometheus.yml
--storage.tsdb.path=/var/lib/prometheus
--web.listen-address=0.0.0.0:9090
--web.enable-lifecycle
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
--collector.systemd
--collector.processes
--collector.nfs
--web.listen-address=0.0.0.0:9100
Restart=on-failure
[Install]
WantedBy=multi-user.target
启用并启动两个服务:
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus node_exporter
sudo systemctl status prometheus --no-pager | head -n 15
第五步:安装 Grafana 可视化
Grafana 官方 apt 仓库支持 Ubuntu 长期稳定版,安装最省事:
sudo apt-get install -y apt-transport-https software-properties-common wget
sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update && sudo apt install -y grafana
sudo systemctl enable --now grafana-server
浏览器打开 http://<服务器IP>:3000,首次登录用户名密码均为 admin。进入 Configuration → Data Sources → Add data source,选择 Prometheus,URL 填 http://localhost:9090,测试连接成功后即可在仪表盘中写 PromQL 查询。
推荐直接导入官方 Node Exporter Dashboard:Dashboards → Import → 输入 ID 1860,选择刚添加的 Prometheus 数据源,即可看到 CPU、内存、磁盘、网络四大板块的实时曲线。
第六步:配置告警规则与 Alertmanager
在 /etc/prometheus/rules/example.rules.yml 中定义一条 CPU 使用率告警:
groups:
- name: host
interval: 30s
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 10m
labels:
severity: warning
annotations:
summary: "主机 {{ $labels.instance }} CPU 使用率持续过高"
description: "当前 CPU 使用率 {{ $value | humanizePercentage }},已超过 85% 阈值 10 分钟。"
启动 Alertmanager 并联通邮件渠道(/etc/alertmanager/alertmanager.yml):
global:
smtp_smarthost: "smtp.example.com:587"
smtp_from: "alert@example.com"
smtp_auth_username: "alert@example.com"
smtp_auth_password: "xxxxxx"
route:
receiver: 'email-notifier'
group_by: ['alertname']
group_wait: 1m
group_interval: 5m
repeat_interval: 4h
receivers:
- name: 'email-notifier'
email_configs:
- to: 'oncall@example.com'
send_resolved: true
修改 prometheus.yml 添加 alerting: 段指向 Alertmanager,然后用 promtool test rules 验证规则表达式后重载 Prometheus。
常见问题
Prometheus 抓不到目标,targets 页面显示 down? 最常见原因是端口不通或 job_name 配置错误。先用 curl http://<目标>:9100/metrics | head 验证 exporter 是否真的在监听,再用 systemctl status node_exporter 看服务是否正常运行,最后检查 scrape_configs 中 targets 的 IP 与端口。
Grafana 面板是空的,数据源却测试通过? 通常是 PromQL 表达式写错或实例标签不匹配。进入 Grafana Explore,粘贴面板的 PromQL 表达式试算,看是否返回数据;如果 node_exporter 有自定义 label,需要在查询中带上正确的 instance 或 host 过滤。
告警一直没触发,但 CPU 明明很高? 检查两点:一是 evaluation_interval 是否合理,二是 for: 持续时间是否太长(本例是 10m,意味着要连续超阈值 10 分钟才会触发)。临时把 for 改成 1m 便于验证,同时用 promtool test rules 单独验证表达式在当前时刻的返回值。
如何水平扩展 Prometheus? 单实例 Prometheus 数据量超过百万时间序列会出现内存压力,此时可引入 Thanos 或 Cortex 做长期存储与跨集群查询,或在应用层做 federation。中小规模下,把 --storage.tsdb.retention.time 参数调小、并定期归档,也是常见的折中方案。
总结
今天我们从零搭建了一套完整的主机监控告警链路:node_exporter 采集主机指标,Prometheus 存储时序数据并执行告警规则,Alertmanager 做告警路由与去重,Grafana 负责可视化展示。这一套组合是云原生时代的事实标准,几乎所有主流组件(Kubernetes、MySQL、Nginx、Redis 等)都提供官方 exporter 可以直接接入。掌握它之后,你在前面 25 天构建的所有服务——Nginx、MySQL、Docker、Keepalived、HAProxy——都可以用同样的方式纳入监控。真正的运维不是「出事再查」,而是「先看到、再预防」。
下期预告:第 27 天我们将进入「CI/CD 运维实践」,用 GitLab CI 搭建一条从代码提交到自动发布到 Ubuntu 主机的完整流水线,让监控告警的体系真正嵌入到日常开发流程中,敬请期待。
















暂无评论内容