Prometheus+Grafana知识梳理(2)

作者:没有四次元口袋的蓝胖

日期: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

yaml 复制代码
# docker-compose.yml 片段
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
      - ./grafana/provisioning:/etc/grafana/provisioning
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123    # 初始密码
      - GF_USERS_ALLOW_SIGN_UP=false           # 禁止注册
    restart: unless-stopped
    depends_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 手动配置
bash 复制代码
# 操作步骤:
# 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 自动配置(推荐)
yaml 复制代码
# provisioning/datasources/prometheus.yml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: false

这种方式的优势:

  • Git 管理:配置文件可以纳入 Git 版本控制,修改有记录。
  • 可重复:容器重建后自动加载配置,无需手动操作。
  • 团队协作:所有环境的数据源配置一致,避免"我这没问题啊"的尴尬。
  • isDefault: true:设为默认数据源,新建面板时无需每次选择。
  • editable: false:禁止在 UI 上修改,防止有人误操作。

三、Dashboard创建

3.1 导入社区Dashboard(最快上手)

Grafana 社区有大量高质量 Dashboard 模板,导入即用,是快速搭建监控可视化的最佳方式。

bash 复制代码
# 推荐导入的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:

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":

yaml 复制代码
# provisioning/dashboards/dashboards.yml
apiVersion: 1
providers:
  - name: 'default'
    orgId: 1
    folder: ''
    type: file
    disableDeletion: false
    updateIntervalSeconds: 10
    options:
      path: /var/lib/grafana/dashboards
      foldersFromFilesStructure: true

然后将 JSON 格式的 Dashboard 文件放到对应目录下即可自动加载。


四、面板类型与适用场景

Grafana 提供了丰富的面板类型,选择正确的类型对数据展示效果至关重要:

面板类型 说明 适用场景
Time series 折线图/面积图,最常用 展示时序趋势,如CPU/内存使用率变化
Gauge 仪表盘 展示当前值,如CPU使用率百分比
Stat 统计数字面板 展示单一指标值,如在线实例数
Bar gauge 条形仪表盘 多实例对比,如各服务器CPU使用率
Table 表格 列表类数据,如告警列表
Heatmap 热力图 Histogram类型数据的延迟分布
Logs 日志面板 配合 Loki 展示日志
Pie chart 饼图 占比分析,如磁盘空间分布

4.1 面板配置要点

yaml 复制代码
# 常用设置项:
# - 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 最实用的功能之一,通过颜色变化让指标状态一目了然:

yaml 复制代码
# 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 定义变量

promql 复制代码
# 定义变量 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中使用变量

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 变量链式依赖

变量之间可以有依赖关系,形成"级联筛选":

yaml 复制代码
# 变量 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}}

📝 写在最后

学习建议

  1. 先导入 Dashboard 1860 体验:这是最快的上手方式。把整套主机监控跑起来,看看每个面板的 PromQL 是怎么写的,比自己从零建面板高效得多。
  2. 理解 Provisioning 的价值:在团队项目中,所有配置都应该走 provisioning 而不是手动操作。这不仅是效率问题,更是可维护性和可审计性的问题。
  3. 熟练掌握变量 :变量是 Grafana Dashboard 的核心能力之一。理解了 =~ 和 = 的区别、label_values() 的用法,就能搭建出灵活可复用的 Dashboard。
  4. 面板类型的选择:不同数据用不同类型的面板,趋势用折线图、当前值用仪表盘、分布用热力图。选择对了,可视化效果事半功倍。

面试高频问题速答

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。选择原则:根据数据特征和展示目的来选。

相关推荐
Cheney Pan2 天前
第8篇 关键指标分析方法:RED/USE 与黄金信号
prometheus
打工仔折腾 AI2 天前
多台服务器日志分散难查?用Promtail+Loki+Grafana搭建集中检索平台
服务器·人工智能·后端·python·性能优化·django·grafana
Cheney Pan3 天前
第7篇 业务数据监控:SQL Exporter 与自定义业务指标
prometheus·exporter
Cheney Pan3 天前
第4篇 Spring Boot 应用监控:Micrometer 与 JVM 指标
jvm·spring boot·后端·prometheus
飞鸟真人3 天前
应用性能监测(APM)之 (四)Prometheus与Metrics集群存储
prometheus
Cheney Pan3 天前
第09篇 告警体系设计:Alertmanager 路由与告警治理
prometheus
蓝胖的四次元口袋4 天前
Prometheus+Grafana知识梳理(1)
grafana·prometheus
晨陌y4 天前
CentOS 7 部署 mysqld_exporter:MySQL 指标采集、Prometheus 告警与远程监控
mysql·centos·prometheus
倔强的小石头_5 天前
Ubuntu部署Prometheus与Alertmanager:systemd配置、告警对接及cpolar远程访问
数据库·ubuntu·prometheus