Grafana如何监控云服务器?仪表盘配置与常见指标可视化教程

Prometheus 装好了,数据也在采,但打开它自带的 Web UI,只有一个朴素的输入框和几条曲线——给老板汇报时你总不能让人家现学 PromQL。这时候就需要 Grafana。Grafana 本身不采集也不存储数据,它是一个纯粹的"可视化与告警前端",把 Prometheus、MySQL、Elasticsearch、云厂商 API 等各类数据源的数据画成图、排成盘、配成告警。对云服务器监控来说,最常见的组合就是 Prometheus 采集 + Grafana 展示。本文从数据源接入讲到面板配置,再到变量与 JSON 自动化,让你能真正把一台云服务器的 CPU、内存、磁盘、网络、负载做成一张看得懂的仪表盘。

一、安装 Grafana 并接入 Prometheus 数据源

Grafana 有开源版(OSS)和企业版,开源版功能对绝大多数场景完全够用。Linux 上推荐用官方仓库安装,方便后续升级。

# CentOS / RHEL 系
cat > /etc/yum.repos.d/grafana.repo <<'EOF'
[grafana]
name=grafana
baseurl=https://rpm.grafana.com
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://rpm.grafana.com/gpg.key
EOF
yum install -y grafana
systemctl enable --now grafana-server

# Debian / Ubuntu 系
apt-get install -y apt-transport-https software-properties-common
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" \
  > /etc/apt/sources.list.d/grafana.list
apt-get update && apt-get install -y grafana
systemctl enable --now grafana-server

Grafana 默认监听 3000 端口,首次登录账号密码均为 admin,登录后会强制要求修改密码。配置文件在 /etc/grafana/grafana.ini,常用的修改项包括 http_port、domain、root_url(反向代理后必须改对,否则跳转地址会错)、以及 SMTP 邮件设置([smtp] 段,用于面板告警发邮件)。

接数据源的路径是:Connections → Data Sources → Add new data source → Prometheus。填写 URL 为 http://127.0.0.1:9090(如果 Grafana 与 Prometheus 同机),其余保持默认,点 Save & test,出现 "Successfully queried the Prometheus API" 即可。

配置项推荐值说明
NamePrometheus数据源名称,面板中引用
URLhttp://127.0.0.1:9090跨机时写 http://IP:9090
Scrape interval15s需与 Prometheus 的 scrape_interval 一致
Query timeout60s大区间查询时适当调大
HTTP MethodPOST查询语句很长时 GET 会被截断

二、最快的方式:导入社区面板模板

不要从零画。Grafana 官方社区(grafana.com/grafana/dashboards)有大量成熟模板,其中 Node Exporter Full(模板 ID 1860) 是监控 Linux 服务器的首选,覆盖 CPU、内存、磁盘、网络、负载、温度等几十个 Panel,且支持变量切换机器。导入方法:Dashboards → New → Import,输入 ID 1860,点击 Load,选择数据源为刚才配置的 Prometheus,点 Import 即可。

导入后如果某些图表空白,按顺序排查:① 面板变量里没选到实例(右上角下拉框);② job 标签不匹配——模板默认查询 job="node",如果你的 job_name 叫别的名字,需要批量修改面板查询,或在 Prometheus 里用 relabel_configs 把 job 改写成 node;③ 时间范围选得太短(右上角时间选择器)。

三、自己动手建一个核心指标面板

模板虽好,但往往有几十个图表,信息过载。实际工作中更实用的是自己搭一张"一屏看清"的核心盘:4-6 个关键图表。下面给出每个图表的 PromQL 与可视化类型选择。

新建面板:Dashboards → New → New Dashboard → Add visualization,选择数据源 Prometheus,在 Query 区域输入 PromQL。

# 1) CPU 使用率 —— 选 Time series(时间序列曲线)
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 2) 内存使用率 —— 选 Gauge(仪表盘)或 Time series
(1 - node_memory_MemAvailable_bytes{instance="$node"}
   / node_memory_MemTotal_bytes{instance="$node"}) * 100

# 3) 磁盘使用率(按挂载点分组)—— 选 Bar gauge(条形)
(1 - node_filesystem_avail_bytes{instance="$node",fstype!~"tmpfs|overlay"}
   / node_filesystem_size_bytes{instance="$node",fstype!~"tmpfs|overlay"}) * 100

# 4) 网络入/出带宽(字节/秒)—— 选 Time series,单位设 Bps
rate(node_network_receive_bytes_total{instance="$node",device!~"lo|veth.*|docker.*"}[5m])
rate(node_network_transmit_bytes_total{instance="$node",device!~"lo|veth.*|docker.*"}[5m])

# 5) 磁盘 IO 繁忙度(等价 iostat 的 %util)—— 选 Time series,阈值 80 加告警线
rate(node_disk_io_time_seconds_total{instance="$node"}[5m]) * 100

# 6) 系统负载 —— 选 Time series,三条线叠加
node_load1{instance="$node"}
node_load5{instance="$node"}
node_load15{instance="$node"}

可视化类型怎么选,有一条简单规则:看变化趋势用 Time series,看"当前值是否健康"用 Stat 或 Gauge,看多个同类对象的排序对比用 Bar gauge 或 Table。单位一定要在右侧面板选项中正确设置(Percent 0-100、bytes/sec、seconds),否则 0.85 和 85% 的显示差异会让人误判。每个图表都建议配置 Thresholds(阈值):绿色 0-70、黄色 70-85、红色 85-100,这样一眼就能看出哪台机器在危险区。

四、用变量实现"一台盘看所有机器"

变量(Variables)是 Grafana 最实用的功能之一。它的作用是:在面板顶部生成一个下拉框,选择不同机器时,所有图表的 PromQL 自动替换对应值。上面的语句里出现的 $node 就是变量。

配置方法:Dashboard settings(齿轮图标)→ Variables → New variable,按下表填写:

字段取值说明
Variable typeQuery从数据源动态获取候选值
Namenode引用时写作 $node
Data sourcePrometheus—
Querylabel_values(node_load1, instance)取所有实例的 IP:端口
RefreshOn time range change新机器上架后自动出现在下拉框
Multi-value开启可一次勾选多台对比,配合 $node 用
Include All option开启选 All 时展示全部机器

变量查询还有几个常用写法:label_values(node_load1, instance) 取实例列表;query_result(node_uname_info) 取主机名;label_values(node_filesystem_size_bytes, mountpoint) 取挂载点列表。开启 Multi-value 后,PromQL 里要把 instance="$node" 改写成 instance=~"$node"(正则匹配),否则多选时不生效——这是个非常常见的踩坑点。

五、面板 JSON 与自动化部署

Grafana 的每一个仪表盘本质上是一份 JSON。通过 Dashboard settings → JSON Model 可以看到完整结构,也可以 Share → Export → Save to file 导出为 .json 文件。理解 JSON 结构后,就能把面板纳入版本管理,实现"配置即代码"。

{
  "title": "Linux 服务器核心指标",
  "uid": "linux-core",
  "schemaVersion": 39,
  "editable": true,
  "refresh": "30s",
  "templating": {
    "list": [
      {
        "name": "node",
        "type": "query",
        "datasource": { "type": "prometheus", "uid": "prometheus" },
        "query": "label_values(node_load1, instance)",
        "refresh": 1,
        "multi": true,
        "includeAll": true,
        "current": {}
      }
    ]
  },
  "panels": [
    {
      "type": "timeseries",
      "title": "CPU 使用率",
      "datasource": { "type": "prometheus", "uid": "prometheus" },
      "targets": [
        {
          "expr": "100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
          "legendFormat": "{{instance}}",
          "refId": "A"
        }
      ],
      "fieldConfig": {
        "defaults": {
          "unit": "percent",
          "min": 0,
          "max": 100,
          "thresholds": {
            "mode": "absolute",
            "steps": [
              { "color": "green",  "value": null },
              { "color": "orange", "value": 70 },
              { "color": "red",    "value": 85 }
            ]
          }
        }
      },
      "gridPos": { "h": 8, "w": 12, "x": 0, "y": 0 }
    }
  ]
}

几个关键字段:uid 是面板唯一标识,导入时若已存在同 uid 会覆盖;templating.list 存变量定义;panels 是图表数组,每个图表的 targets[].expr 就是 PromQL;gridPos 控制图表在网格中的位置(x/y 为坐标,w/h 为宽高,总宽 24)。

要做自动化,把 JSON 放到 /var/lib/grafana/dashboards/ 并写一份 provisioning 配置,Grafana 启动时会自动加载,这样重建 Grafana 实例时面板不会丢:

# /etc/grafana/provisioning/dashboards/linux.yml
apiVersion: 1
providers:
  - name: 'linux'
    orgId: 1
    folder: 'Linux'
    type: file
    disableDeletion: false
    updateIntervalSeconds: 30
    allowUiUpdates: true
    options:
      path: /var/lib/grafana/dashboards
      foldersFromFilesStructure: false
# /etc/grafana/provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://127.0.0.1:9090
    isDefault: true
    editable: true
    jsonData:
      httpMethod: POST
      timeInterval: 15s

六、在 Grafana 里直接配置告警与团队共享

新版 Grafana(9.0 之后)引入了 Grafana Alerting,可以脱离 Alertmanager 直接在面板上配告警,规则与图表绑定,配置体验更直观。做法是在某个 Panel 的 Edit 页面切到 Alert 标签页,点 Create alert rule:先定义查询(可加 reduce 把时间序列聚合成单值,再加 threshold 设阈值),然后在 "Set evaluation behavior" 里配置评估间隔与 pending 时长(例如每 1 分钟评估、持续 5 分钟才转为 Firing)。最后在 Contact points 里配置通知渠道,支持邮件、Webhook、钉钉、企业微信、Slack 等。

选择 Grafana Alerting 还是 Alertmanager?简单原则:如果告警规则与图表强相关、且团队主要在 Grafana 里工作,用 Grafana Alerting;如果已有成熟的 Prometheus 规则体系、需要复杂的分组抑制与静默策略,继续用 Alertmanager。两者也可以共存——Grafana 负责可视化层的阈值告警,Alertmanager 负责基础设施级告警。

共享方面有三个常用手段:一是直接分享链接(要求对方有 Grafana 账号与权限);二是 Snapshot(快照),把当前数据固化成一个公开链接,无需登录即可查看,适合对外汇报或发到群里,注意可以设置过期时间避免数据长期外泄;三是 Export 导出 JSON 或 PDF。团队协作时建议用 Folder(文件夹)按业务线组织面板,并给不同团队设置 Folder 级别的查看/编辑权限。

性能方面有一个常见陷阱:一台机器上放几十个面板、每个面板几十个查询、时间范围选 30 天且刷新间隔设 5 秒,会把 Prometheus 和浏览器同时拖垮。优化手段包括:查询区间用变量控制并限制最大可选范围;对长期趋势做降采样(Prometheus 的 recording rules 预先聚合);面板自动刷新不低于 30 秒;大屏展示机单独配一台,避免多人同时开大盘。

七、搭建一张实用仪表盘的实施步骤

  1. 安装 Grafana 并启动,修改默认 admin 密码,按需配置 [smtp] 段以支持邮件告警。
  2. 添加 Prometheus 数据源,HTTP Method 设为 POST,保存后确认测试通过。
  3. 先导入模板 ID 1860(Node Exporter Full),确认所有机器数据能正常显示,作为参考基线。
  4. 新建自己的核心盘:按"CPU、内存、磁盘、网络、负载"五块设计 5-6 个图表,一屏放得下。
  5. 配置变量 node(Query 类型,label_values 取 instance),开启 Multi-value 与 All。
  6. 把所有图表的 instance="$node" 改成 instance=~"$node",测试多选与 All 是否生效。
  7. 为每个图表设置正确的 unit 与 thresholds(70 黄、85 红),设置面板自动刷新为 30s。
  8. 导出 JSON 并提交到 Git,同时配置 provisioning,实现面板可重建、可版本回溯。

小结

Grafana 监控云服务器的核心动作只有四个:接数据源、导模板或自建面板、配变量、导出 JSON 做版本管理。真正拉开差距的不是会不会点鼠标,而是图表设计是否"能指导行动"——一张好的面板,应该让人扫一眼就知道哪台机器有问题、问题在哪个资源上。避坑清单:一是 job 标签与模板不匹配导致图表全空,这是最常见的问题;二是单位设置错误(忘记设 percent 或 Bps)造成数值误读;三是开启多值变量后忘记把 = 改成 =~,导致多选失效;四是 rate() 区间小于采集间隔的 4 倍,曲线出现断点和毛刺;五是面板不做 JSON 备份,Grafana 实例一旦损坏,几十个手工配置的图表全部丢失。把 provisioning 用起来,这些问题就都不存在了。


关键词:Grafana监控、云服务器监控、仪表盘配置、Prometheus数据源、面板JSON、Grafana变量