有了 Prometheus 采集数据,很快就会遇到新问题:PromQL 查询界面只能一条条看曲线,不够直观;想给老板或同事看一台机器的整体状态,总不能让人家去敲查询语句。这时候就需要 Grafana。它是一个把各种数据源的数据画成图表的可视化工具,支持 Prometheus、MySQL、InfluxDB、Elasticsearch 等几十种数据源,最擅长做的就是"一屏看清所有关键指标"。
这篇文章从安装 Grafana 讲起,带你添加 Prometheus 数据源,动手做一个基于 node_exporter 的主机总览面板,再讲模板变量、导入社区现成 dashboard、告警配置这些进阶内容。面向运维新手,每一步都给真实命令和界面路径,跟着做能搭出一套看得过去的监控大屏。读完你会明白:数据采集靠 Prometheus,展示和告警面板靠 Grafana,两者分工明确。
安装 Grafana
Grafana 官方提供各系统的仓库。RHEL、Rocky、CentOS:
sudo tee /etc/yum.repos.d/grafana.repo >/dev/null <<'EOF'
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
EOF
sudo dnf install -y grafana
Debian、Ubuntu:
sudo apt-get install -y apt-transport-https software-properties-common wget
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg >/dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt-get update
sudo apt-get install -y grafana
启动并设置开机自启:
sudo systemctl enable --now grafana-server
sudo systemctl status grafana-server
默认监听 3000 端口,配置文件在 /etc/grafana/grafana.ini,数据存在 /var/lib/grafana。浏览器打开 http://监控机IP:3000,默认账号密码都是 admin,第一次登录会强制改密码。
放行端口:
# RHEL、Rocky、CentOS
sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload
# Debian、Ubuntu
sudo ufw allow 3000/tcp
风险提示: Grafana 默认对全网开放,且承载大量内部指标信息。生产环境建议用反向代理加 HTTPS,或把 3000 端口限定为办公网段访问,并严格设置账号权限,不要长期用默认管理员账号共享给所有人。Grafana 支持对接 LDAP、OAuth 等外部认证,团队使用建议接上统一登录。
添加数据源
登录后进入左侧「Connections → Data sources → Add data source」,选择 Prometheus。
关键配置项:
| 配置项 | 说明 | 常用值 |
|---|---|---|
| URL | Prometheus 地址 | http://192.0.2.10:9090 |
| Access | 访问方式 | Server(由 Grafana 后端代理) |
| Scrape interval | 默认查询步长 | 15s,与采集间隔一致 |
| HTTP Method | 请求方法 | POST |
点「Save & test」,显示绿色的 "Data source is working" 就成功了。这里要理解一点:Grafana 的 Server 模式是 Grafana 后端去访问 Prometheus,所以浏览器能打开不等于配置对,关键是 Grafana 服务器本身能访问到 Prometheus 的 9090 端口。
如果要接 MySQL,选择 MySQL 数据源,填主机、端口、数据库名和账号密码即可。接 MySQL 的场景通常是画业务指标,比如用户注册数、订单量这类存在关系库里的数据,用 SQL 直接查出来画图。
第一个面板:Linux 主机总览
数据源就绪后,新建一个 Dashboard:左侧「Dashboards → New → New dashboard → Add visualization」,选 Prometheus 数据源。
面板一:CPU 使用率。 查询框里填:
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
右侧面板设置里,Title 填"CPU 使用率",单位选 Misc → Percent (0-100),可视化类型选 Time series。如果想让超阈值变红,可以在 Thresholds 里加一条:基础绿色,百分之八十以上黄色,百分之九十以上红色。
面板二:内存使用率。
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
单位选 Percent。这里用 MemAvailable 而不是 MemFree,原因和前面文章讲的一样,空闲内存被页缓存占着是正常的。
面板三:磁盘使用率。 这个指标是 Gauge 类型(node_filesystem_avail_bytes),要算使用率得用总量减可用:
(1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100
用 fstype!~"tmpfs|overlay" 过滤掉虚拟文件系统,否则会出现一堆无意义的挂载点。可视化类型可以选 Gauge 或 Bar gauge,一眼看出哪块盘快满了。
面板四:网络流量。
# 入站速率(字节/秒转 Mbps)
rate(node_network_receive_bytes_total{device!="lo"}[5m]) * 8 / 1000000
# 出站速率
rate(node_network_transmit_bytes_total{device!="lo"}[5m]) * 8 / 1000000
单位选 Data rate → megabits/sec,加 device!="lo" 过滤回环网卡。
面板五:系统负载。
node_load1
node_load5
node_load15
单位选无,配合 CPU 核心数(count(node_cpu_seconds_total{mode="idle"}) by (instance))一起判断。
把这几块拼成一个主机总览 dashboard,加一个 Time range 控件,默认显示最近六小时,就很好用了。布局上,CPU、内存、磁盘放上面一排,网络和负载放下排,符合"先看是否异常、再看细节"的浏览习惯。
模板变量:一个面板看所有机器
硬编码面板只能看固定主机,机器一多就要复制粘贴。模板变量(Variables)能解决这个问题。在 Dashboard 设置 → Variables 里新建一个变量:
| 字段 | 值 |
|---|---|
| Name | instance |
| Type | Query |
| Data source | Prometheus |
| Query | label_values(up, instance) |
| Multi-value | 开启 |
| Include All | 开启 |
这样顶部就会出现一个下拉框,列出所有被监控实例。然后在每个面板的查询里,把写死的实例名换成 $instance:
(1 - node_memory_MemAvailable_bytes{instance=~"$instance"} / node_memory_MemTotal_bytes{instance=~"$instance"}) * 100
注意这里用 =~ 正则匹配而不是 =,因为多选时变量会展开成 a|b|c 的形式,用 = 会匹配不上。选「All」时变量值是 .*,也能正确匹配全部。
再加一个 env 或 job 变量做二级筛选,就能实现"先选环境、再选机器"的联动。这个技巧在任何规模下都值得用。
导入社区 Dashboard
没必要所有面板都从零画。Grafana 官方社区(grafana.com/grafana/dashboards)有大量现成模板,主机监控最经典的是 node_exporter 配套的那个(ID 1860)。
导入方式:左侧「Dashboards → New → Import」,输入 dashboard ID 1860,点 Load,选择 Prometheus 数据源,再选好刚才建的 instance 变量,导入即可。
导入后你可能会发现实例名显示成 192.0.2.20:9100 这种带端口的形式,不够友好。可以用 label_replace 或在前端变量里做正则清洗:
label_replace(node_load1, "host", "$1", "instance", "(.*):.*")
更简单的办法是给每个 target 加上 nodename 之类的标签,展示时用这个标签。这也是前面配置 scrape_configs 时建议加标签的用处。
社区模板的好处是省时间,但要注意两点:一是模板版本可能和你部署的 exporter 版本不匹配,某些指标名对不上,需要微调;二是别人写的查询未必适合你的场景,导入后要逐个面板检查逻辑,特别是带阈值的面板,别直接沿用不明来历的阈值。
Grafana 告警配置
Grafana 8 之后有统一的 Alerting 模块,可以在面板上直接建告警规则。以"磁盘使用率超过百分之八十五"为例:
在磁盘面板的 Edit 界面,切到 Alert 标签页,创建规则,条件设为"当查询结果大于 85 时触发",设置评估间隔(比如每分钟)和持续时间(比如持续五分钟才触发,避免抖动)。
告警规则需要一个"联络点"(Contact point)来定义发给谁,支持 Email、企业微信(通过 Webhook)、Slack、钉钉等。在「Alerting → Contact points」里新建,填好地址;再到「Notification policies」里配置路由,把不同严重级别的告警发到不同的联系点。
一个实际建议:监控告警最好集中在一个地方管理。如果已经用了 Prometheus + Alertmanager,就优先在 Alertmanager 里写规则,Grafana 只负责展示;如果不想引入 Alertmanager,用 Grafana 自带的告警也够用。两套都配、各写一半,最后会搞不清哪条告警从哪来,排查时非常痛苦。
告警做到可用后要警惕"告警疲劳":规则太多、阈值太敏感,值班的人会逐渐无视消息。规则里尽量用 for 或持续时间做防抖,把非关键指标降级为值班看板而不是直接推送。
常见问题
Grafana 显示 "No data" 但 Prometheus 里能查到?
三个方向排查:一是时间范围选错了,比如选了过去五分钟但采集间隔就十五秒,可能只有零星点;二是模板变量没选对,All 时查询用 = 而非 =~ 会查不到;三是 Grafana 服务器到 Prometheus 的网络不通,这种情况 Save & test 时就会报错。
时间显示对不上或曲线错位?
检查 Grafana 服务器、浏览器、Prometheus 三者的时间是否一致。Grafana 默认按浏览器时区渲染,如果服务器时区是 UTC、浏览器是东八区,看图时容易产生误会。可以在 Dashboard 设置里固定时区,并确保所有机器时间同步。
面板刷新慢、查询超时怎么办?
通常是查询范围太大或 PromQL 太重。减少时间跨度、用 recording rules 预计算、避免 {__name__=~".+"} 这类全表扫描,都能显著提速。Prometheus 的查询是即时的,不做缓存,复杂查询在高基数下会很慢。
dashboard 怎么备份和分享?
在 Dashboard 设置里可以导出 JSON,保存到 Git 里做版本管理,换环境时导入即可。团队共享建议用 Grafana 的文件夹和权限功能,把不同业务的面板分开放,而不是所有人共用一个默认文件夹。
总结
- Grafana 负责可视化,不负责采集;数据来自 Prometheus、MySQL 等数据源,两者分工清晰。
- 添加数据源时关键是 Grafana 服务器能访问到数据源,浏览器能打开不代表配置正确。
- 基于 node_exporter 的常用面板就五块:CPU、内存、磁盘、网络、负载,PromQL 表达式基本固定,可以直接复用。
- 模板变量用
label_values加=~匹配,一个面板就能看所有机器,这是从小规模走向规模化的关键一步。 - 社区 dashboard(如 node_exporter 的 1860)能省大量时间,但导入后必须核对指标名和阈值是否适配自己的环境。
- 告警规则集中在 Alertmanager 或 Grafana 里二选一,配好防抖和分级,才能避免告警疲劳。
企业QQ咨询




