Grafana如何监控Linux服务器?仪表盘配置与指标展示教程

有了 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 里二选一,配好防抖和分级,才能避免告警疲劳。