作者:没有四次元口袋的蓝胖
日期:2026-10-1
标签:Grafana, 监控体系
Grafana可视化实战
Prometheus 自带一个简陋的 Web UI(http://localhost:9090),只适合调试 PromQL 表达式。真正的生产环境可视化全靠Grafana——一个开源的数据可视化平台,支持多种数据源,通过 Dashboard 面板将时序数据变成直观可读的图表。
这篇笔记系统梳理 Grafana 从安装部署到高级配置的完整知识链:数据源配置(手动 + provisioning 自动配置)、Dashboard 创建与面板类型选择、变量与模板的动态筛选。无论是面试还是实际工作,这些知识点都能帮你快速上手 Grafana 可视化。
核心掌握:Grafana数据源配置方式、Provisioning自动配置、Dashboard创建流程、常用面板类型与适用场景、变量与模板的动态筛选。
一、Grafana简介
1.1 什么是Grafana
Grafana 是一个开源的数据可视化平台,支持多种数据源(Prometheus、MySQL、Elasticsearch、InfluxDB、Loki 等),通过 Dashboard 面板展示时序数据的图表。
核心价值:
- 多数据源支持:一个平台同时连接 Prometheus、MySQL、Elasticsearch 等多种后端
- 丰富的面板类型:折线图、仪表盘、热力图、表格、日志等十几种可视化方式
- 社区生态:大量预置 Dashboard 模板,导入即用
- 告警能力:内置告警功能,但生产环境通常用 Prometheus + Alertmanager 做告警,Grafana 专注可视化
一个关键认知:Grafana 不存储数据、不采集数据。它只是数据源的前端展示层,数据存在 Prometheus 中,采集由 node_exporter 等负责。Grafana 挂了不影响监控数据采集和告警。
二、安装与数据源配置
2.1 Docker安装Grafana
# docker-compose.yml 片段services:grafana:image:grafana/grafana:latestcontainer_name:grafanaports:-"3000:3000"volumes:-grafana_data:/var/lib/grafana-./grafana/provisioning:/etc/grafana/provisioningenvironment:-GF_SECURITY_ADMIN_PASSWORD=admin123# 初始密码-GF_USERS_ALLOW_SIGN_UP=false# 禁止注册restart:unless-stoppeddepends_on:-prometheus关键配置解读:
grafana_data:/var/lib/grafana:用 Docker Volume 持久化 Grafana 数据(Dashboard、用户配置等),容器重建不丢失。./grafana/provisioning:/etc/grafana/provisioning:挂载 provisioning 配置目录,实现数据源和 Dashboard 的自动配置。GF_SECURITY_ADMIN_PASSWORD:设置管理员初始密码,生产环境务必修改。GF_USERS_ALLOW_SIGN_UP=false:禁止自助注册,防止未授权用户访问。depends_on: prometheus:确保 Prometheus 先启动,Grafana 才能正常连接数据源。
2.2 数据源配置方式
Grafana 支持两种数据源配置方式,生产环境强烈推荐第二种。
方式一:通过 Web UI 手动配置
# 操作步骤:# 1. 访问 http://localhost:3000,用 admin / admin123 登录# 2. Configuration → Data Sources → Add data source# 3. 选择 Prometheus# 4. URL 填写:http://prometheus:9090# 5. Save & Test → 显示 "Data source is working" 即配置成功这种方式简单直观,适合开发调试。但缺点是配置无法版本控制,容器重建后配置丢失。
方式二:通过 Provisioning 自动配置(推荐)
# provisioning/datasources/prometheus.ymlapiVersion:1datasources:-name:Prometheustype:prometheusaccess:proxyurl:http://prometheus:9090isDefault:trueeditable:false这种方式的优势:
- Git 管理:配置文件可以纳入 Git 版本控制,修改有记录。
- 可重复:容器重建后自动加载配置,无需手动操作。
- 团队协作:所有环境的数据源配置一致,避免"我这没问题啊"的尴尬。
isDefault: true:设为默认数据源,新建面板时无需每次选择。editable: false:禁止在 UI 上修改,防止有人误操作。
三、Dashboard创建
3.1 导入社区Dashboard(最快上手)
Grafana 社区有大量高质量 Dashboard 模板,导入即用,是快速搭建监控可视化的最佳方式。
# 推荐导入的Dashboard ID:# 1860 → Node Exporter Full(主机监控全景)# 11074 → Node Exporter for Prometheus Dashboard EN## 操作:Dashboards → Import → 输入ID → 选择数据源 → Import推荐 Dashboard 说明:
- ID 1860:最经典的主机监控 Dashboard,覆盖 CPU、内存、磁盘、网络等所有基础指标,几乎每个 Prometheus 环境都会导入。
- ID 11074:相对简洁的主机监控面板,适合快速查看核心指标。
3.2 手动创建面板
当社区 Dashboard 不能满足需求时,可以手动创建面板。以"CPU使用率"面板为例:
步骤:Dashboard → Add Panel → 选择数据源 → 输入 PromQL → 选择面板类型 → 保存
常用监控指标的 PromQL:
# CPU使用率百分比 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) # 内存使用率 (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 # 磁盘使用率 (1 - node_filesystem_avail_bytes{mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{mountpoint="/",fstype!="rootfs"}) * 100 # 网络接收速率(bytes/s) rate(node_network_receive_bytes_total{device!~"lo|veth.*|docker.*"}[5m]) # 网络发送速率(bytes/s) rate(node_network_transmit_bytes_total{device!~"lo|veth.*|docker.*"}[5m])3.3 Dashboard Provisioning
除了手动创建,还可以用 YAML 文件自动 provision Dashboard,实现"Dashboard as Code":
# provisioning/dashboards/dashboards.ymlapiVersion:1providers:-name:'default'orgId:1folder:''type:filedisableDeletion:falseupdateIntervalSeconds:10options:path:/var/lib/grafana/dashboardsfoldersFromFilesStructure:true然后将 JSON 格式的 Dashboard 文件放到对应目录下即可自动加载。
四、面板类型与适用场景
Grafana 提供了丰富的面板类型,选择正确的类型对数据展示效果至关重要:
| 面板类型 | 说明 | 适用场景 |
|---|---|---|
| Time series | 折线图/面积图,最常用 | 展示时序趋势,如CPU/内存使用率变化 |
| Gauge | 仪表盘 | 展示当前值,如CPU使用率百分比 |
| Stat | 统计数字面板 | 展示单一指标值,如在线实例数 |
| Bar gauge | 条形仪表盘 | 多实例对比,如各服务器CPU使用率 |
| Table | 表格 | 列表类数据,如告警列表 |
| Heatmap | 热力图 | Histogram类型数据的延迟分布 |
| Logs | 日志面板 | 配合 Loki 展示日志 |
| Pie chart | 饼图 | 占比分析,如磁盘空间分布 |
4.1 面板配置要点
# 常用设置项:# - Title: 面板标题,简洁明了# - Unit: 数据单位(percent、bytes、bytes/sec 等),自动格式化数值显示# - Min/Max: 坐标轴范围,Gauge面板尤其重要# - Thresholds: 阈值配色# 如 >80% 变红、>60% 变黄、<60% 变绿# 视觉上快速区分正常/警告/危险# - Legend: 图例格式,支持变量 {{instance}} {{device}} 等# - Time range: 时间范围(默认 Last 6 hours)# - Refresh: 自动刷新间隔(如 10s、30s、1m)4.2 Thresholds 配置实践
Thresholds(阈值配色)是 Grafana 最实用的功能之一,通过颜色变化让指标状态一目了然:
# CPU使用率的Thresholds配置示例:# 0-60%: 绿色(正常)# 60-80%: 黄色(警告)# 80-100%: 红色(危险)# 配置方式:# Panel → Thresholds → Add threshold# Base: 绿色# 60: 黄色# 80: 红色4.3 面板类型选择决策指南
需要什么展示效果? │ ├── 看趋势变化 → Time series(折线图) │ ├── 看当前值 │ ├── 单个数值 → Stat │ ├── 仪表盘风格 → Gauge │ └── 多实例对比 → Bar gauge │ ├── 看分布 │ ├── 延迟分布 → Heatmap(配合Histogram) │ └── 占比分析 → Pie chart │ ├── 看列表 → Table │ └── 看日志 → Logs(配合Loki)五、变量与模板
5.1 变量的作用
变量让 Dashboard 支持动态筛选,避免为每台机器建一个面板。比如你有 10 台服务器,不需要建 10 个 CPU 面板,只需要一个面板 + 一个instance变量,通过下拉框切换即可。
5.2 定义变量
# 定义变量 instance: # Settings → Variables → Add variable # Name: instance # Type: Query # Query: label_values(node_cpu_seconds_total, instance) # Multi-value: 开启(支持多选) # Include All: 开启(支持全选)配置要点:
- Type: Query:从数据源动态获取变量值,最常用。
- Query:
label_values(指标名, label名)提取该 label 的所有取值。 - Multi-value:开启后支持多选,一次查看多台机器的数据。
- Include All:开启后有个"All"选项,一键选中所有值。
5.3 在PromQL中使用变量
# CPU使用率(使用 instance 变量) 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle", instance=~"$instance"}[5m])) * 100) # 磁盘使用率(使用 instance 变量) (1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay", instance=~"$instance"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay", instance=~"$instance"}) * 100关键语法:
instance=~"$instance":多值匹配用=~(正则匹配),单值用=。- 当 Multi-value 开启时,
$instance会展开为server1|server2|server3的正则表达式,必须用=~才能正确匹配。 - 如果只用
=,多选时只会匹配第一个值,其他值会被忽略。
5.4 常用变量类型
| 类型 | 说明 | 示例 |
|---|---|---|
| Query | 从数据源动态查询 | label_values(node_cpu_seconds_total, instance) |
| Custom | 自定义固定值列表 | production,staging,development |
| Constant | 隐藏的常量 | 环境变量名env = production |
| Interval | 时间间隔选择 | 1m,5m,15m,1h |
| Datasource | 数据源选择 | 切换不同的 Prometheus 实例 |
| Textbox | 文本输入框 | 手动输入搜索关键词 |
5.5 变量链式依赖
变量之间可以有依赖关系,形成"级联筛选":
# 变量 datacenter:选择数据中心# Query: label_values(node_cpu_seconds_total, datacenter)# 变量 instance:依赖 datacenter# Query: label_values(node_cpu_seconds_total{datacenter="$datacenter"}, instance)# 效果:先选数据中心,再在该数据中心下选择实例六、常见面试注意点
- Grafana 不存储数据:Grafana 只是数据源的前端展示层,数据存在 Prometheus 中。Grafana 挂了不影响监控数据采集。
- 数据源配置用 provisioning:生产环境通过 YAML 文件自动配置数据源和 Dashboard,而不是手动在 UI 上操作,方便 Git 管理和版本控制。
- 变量用
=~而非=:当变量支持多选时,PromQL 中必须用正则匹配=~"$instance",否则只能匹配单个值。 - Alerting 功能:Grafana 也有内置告警功能,但生产环境通常还是用 Prometheus + Alertmanager 做告警,Grafana 专注于可视化。
- Dashboard as Code:用 provisioning 文件管理 Dashboard,配合 Git 做版本控制,是团队协作的最佳实践。
🗺️ 思维导图速览
Grafana 可视化实战 ├── 定位 │ ├── 开源数据可视化平台 │ ├── 多数据源支持(Prometheus/MySQL/ES/Loki) │ └── 不存储数据、不采集数据,纯展示层 │ ├── 安装部署 │ ├── Docker安装(推荐) │ ├── Volume持久化:/var/lib/grafana │ └── 环境变量:GF_SECURITY_ADMIN_PASSWORD │ ├── 数据源配置 │ ├── 方式1:Web UI手动配置(开发调试) │ └── 方式2:Provisioning自动配置(生产推荐) │ └── provisioning/datasources/prometheus.yml │ ├── Dashboard创建 │ ├── 导入社区Dashboard(ID 1860 最经典) │ ├── 手动创建面板(PromQL + 面板类型) │ └── Dashboard Provisioning(Dashboard as Code) │ ├── 面板类型 │ ├── Time series:折线图,看趋势(最常用) │ ├── Gauge:仪表盘,看当前值 │ ├── Stat:统计数字,看单一指标 │ ├── Bar gauge:条形仪表盘,多实例对比 │ ├── Table:表格,列表数据 │ ├── Heatmap:热力图,Histogram分布 │ └── Logs:日志面板 │ ├── 变量与模板 │ ├── 作用:动态筛选,避免重复建面板 │ ├── 类型:Query/Custom/Constant/Interval/Datasource │ ├── 语法:多值匹配用 =~ "$var",单值用 = "$var" │ └── 链式依赖:级联筛选(datacenter → instance) │ └── 关键配置 ├── Thresholds:阈值配色(绿/黄/红) ├── Unit:数据单位自动格式化 ├── Refresh:自动刷新间隔 └── Legend:图例变量 {{instance}} {{device}}📝 写在最后
学习建议
- 先导入 Dashboard 1860 体验:这是最快的上手方式。把整套主机监控跑起来,看看每个面板的 PromQL 是怎么写的,比自己从零建面板高效得多。
- 理解 Provisioning 的价值:在团队项目中,所有配置都应该走 provisioning 而不是手动操作。这不仅是效率问题,更是可维护性和可审计性的问题。
- 熟练掌握变量:变量是 Grafana Dashboard 的核心能力之一。理解了
=~和=的区别、label_values()的用法,就能搭建出灵活可复用的 Dashboard。 - 面板类型的选择:不同数据用不同类型的面板,趋势用折线图、当前值用仪表盘、分布用热力图。选择对了,可视化效果事半功倍。
面试高频问题速答
Q:Grafana 挂了会影响监控吗?
不会。Grafana 只是可视化层,不存储数据也不采集数据。数据存在 Prometheus 的 TSDB 中,采集由 node_exporter 等负责。Grafana 挂了只是看不到图表,监控数据的采集和存储完全不受影响,告警也不受影响。
Q:Grafana 的 provisioning 是什么?为什么要用?
Provisioning 是通过 YAML 文件自动配置 Grafana 的数据源、Dashboard 等设置的机制。优势:配置可纳入 Git 版本控制、容器重建后自动恢复、团队协作配置一致。生产环境不推荐手动在 UI 上配置,因为无法版本控制且容易丢失。
Q:Grafana 变量中=~和=有什么区别?
=是精确匹配,只能匹配单个值。=~是正则匹配,支持多值。当变量开启 Multi-value 时,$instance会展开为server1|server2的正则形式,必须用=~"$instance"才能正确匹配多个实例。
Q:如何选择合适的 Grafana 面板类型?
看趋势变化用 Time series(折线图),看当前值用 Gauge 或 Stat,多实例对比用 Bar gauge,看分布用 Heatmap(配合 Histogram),看列表数据用 Table。选择原则:根据数据特征和展示目的来选。