Grafana

技术栈
工具链
可视化监控仪表盘数据源面板

概览

Grafana

Grafana 是由 Torkel Ödegaard 于 2014 年创建的开源数据可视化和监控平台。它支持从多种数据源(Prometheus、Elasticsearch、MySQL 等)查询数据并以丰富的面板展示。

核心价值:统一的"监控 UI 层",通过 Dashboard 将多个数据源的数据整合展示。配合告警功能,形成完整的可观测性方案。

关键特性

  • 丰富的可视化面板(折线图、热力图、Gauge、Table、Geomap...)
  • 多数据源支持(Prometheus、InfluxDB、Elasticsearch、MySQL、PostgreSQL、CloudWatch...)
  • 告警引擎(多渠道通知)
  • Dashboard 模板变量(动态过滤)
  • 插件生态(自定义面板/数据源)
  • 团队与权限管理

安装

1. 环境准备

  • 操作系统:Linux、macOS、Windows、Docker
  • 端口:3000(Grafana UI)
  • 浏览器:Chrome / Firefox / Edge 最新版
  • 数据源:至少一个已运行的数据库(Prometheus、MySQL 等)

2. 安装命令

Docker(推荐)

docker run -d --name grafana -p 3000:3000 \
  -v grafana-data:/var/lib/grafana \
  -e GF_SECURITY_ADMIN_PASSWORD=admin123 \
  grafana/grafana:latest

Docker Compose(与 Prometheus 一起)

services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin123
      - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-piechart-panel
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/dashboards:/etc/grafana/provisioning/dashboards
      - ./grafana/datasources:/etc/grafana/provisioning/datasources
    restart: unless-stopped

volumes:
  grafana-data:

Ubuntu

sudo apt install -y apt-transport-https software-properties-common
sudo 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" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install -y grafana
sudo systemctl enable --now grafana-server

macOS

brew install grafana
brew services start grafana

默认登录

  • URL: http://localhost:3000
  • 用户名: admin
  • 密码: admin(首次登录需修改)

3. 常见安装问题

问题 解决方案
忘记 admin 密码 grafana-cli admin reset-admin-password <new-password>
数据源连接失败 Docker 中 use host.docker.internalhost.docker.internal:9090 访问宿主机
Dashboard 不显示数据 检查数据源配置、PromQL 语法、时间范围选择
插件安装失败 设置 GF_INSTALL_PLUGINS 环境变量,或 grafana-cli plugins install <id>
权限不足 默认 SQLite,生产环境建议 PostgreSQL + 配置 SMTP

示例

Grafana 连接 Prometheus + 主机监控 Dashboard

目标

配置 Prometheus 数据源,导入 Node Exporter Full 仪表盘,实现一键监控。

步骤一:添加数据源

  1. 登录 Grafana http://localhost:3000
  2. 左侧菜单 → ConnectionsData SourcesAdd data source
  3. 选择 Prometheus
  4. 填写 URL:
    • Docker 环境:http://host.docker.internal:9090(macOS/Windows)
    • Docker 环境:http://172.17.0.1:9090(Linux)
    • 同主机:http://localhost:9090
  5. 点击 Save & Test,应显示绿色 "Data source is working"

步骤二:创建自定义 Dashboard(JSON 配置)

{
  "dashboard": {
    "title": "主机监控总览",
    "tags": ["prometheus", "node"],
    "timezone": "browser",
    "panels": [
      {
        "title": "CPU 使用率",
        "type": "timeseries",
        "targets": [
          {
            "expr": "100 - (avg by(instance)(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
            "legendFormat": "{{instance}}",
            "refId": "A"
          }
        ],
        "gridPos": {"h": 8, "w": 12, "x": 0, "y": 0}
      },
      {
        "title": "内存使用率",
        "type": "gauge",
        "targets": [
          {
            "expr": "100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)",
            "refId": "A"
          }
        ],
        "fieldConfig": {
          "defaults": {
            "unit": "percent",
            "thresholds": {
              "steps": [
                {"color": "green", "value": null},
                {"color": "yellow", "value": 70},
                {"color": "red", "value": 90}
              ]
            }
          }
        },
        "gridPos": {"h": 8, "w": 6, "x": 12, "y": 0}
      },
      {
        "title": "磁盘使用率",
        "type": "timeseries",
        "targets": [
          {
            "expr": "100 * (1 - node_filesystem_avail_bytes{mountpoint=\"/\"} / node_filesystem_size_bytes{mountpoint=\"/\"})",
            "legendFormat": "{{instance}}",
            "refId": "A"
          }
        ],
        "gridPos": {"h": 8, "w": 6, "x": 18, "y": 0}
      }
    ]
  }
}

步骤三:导入社区 Dashboard

Grafana 社区有大量现成 Dashboard:

  1. 左侧菜单 → DashboardsNewImport
  2. 输入 Dashboard ID(如 Node Exporter Full: 1860
  3. 选择 Prometheus 数据源
  4. 导入

常用 Dashboard ID:

  • 1860 - Node Exporter Full
  • 11074 - Node Exporter for Prometheus
  • 6417 - Kubernetes 集群监控

步骤四:配置告警通知

# grafana.ini(或环境变量)
[smtp]
enabled = true
host = smtp.example.com:587
user = alerts@example.com
password = your-password
from_address = grafana@example.com

# 环境变量方式:
# GF_SMTP_ENABLED=true
# GF_SMTP_HOST=smtp.example.com:587

然后在 Dashboard 面板的 Alert 标签页中创建告警规则。

预期效果

Dashboard 显示主机 CPU/内存/磁盘实时曲线,阈值变色,告警通道配置完成后可收到通知。

教程

Grafana 入门教程:Dashboard 设计与多数据源

1. Grafana 在可观测性中的位置

数据采集层:Prometheus / Telegraf / Filebeat
      ↓
存储层:Prometheus TSDB / Elasticsearch / InfluxDB
      ↓
可视化层:Grafana ← 你在这一层
      ↓
告警层:Grafana Alerting / Alertmanager

2. Dashboard 设计原则

RED 方法论(服务监控)

  • Rate:请求速率
  • Errors:错误率
  • Duration:延迟分布

USE 方法论(资源监控)

  • Utilization:资源利用率
  • Saturation:饱和度(排队长度)
  • Errors:错误数

黄金信号

  1. 延迟(Latency)
  2. 流量(Traffic)
  3. 错误(Errors)
  4. 饱和度(Saturation)

3. 模板变量

# 变量定义(Dashboard Settings → Variables)
# 名称: instance
# 类型: Query
# 查询: label_values(node_cpu_seconds_total, instance)

# 面板中使用
rate(node_cpu_seconds_total{instance=~"$instance"}[5m])

常用变量类型:

  • Query:从数据源动态获取值
  • Custom:手动定义静态列表
  • Constant:固定值(如环境名)
  • Interval:时间间隔

4. 多数据源混合查询

Grafana 支持在一个面板中混合多个数据源:

// 面板 A 用 Prometheus(应用指标)
// 面板 B 用 Elasticsearch(日志统计)
// 面板 C 用 MySQL(业务指标)

MySQL 数据源示例

SELECT
  UNIX_TIMESTAMP(created_at) as time,
  COUNT(*) as orders,
  SUM(amount) as revenue
FROM orders
WHERE created_at >= $__from AND created_at <= $__to
GROUP BY DATE(created_at)
ORDER BY time

5. Provisioning(基础设施即代码)

# datasources/prometheus.yaml
apiVersion: 1
datasources:
  - name: Prometheus
    type: prometheus
    url: http://prometheus:9090
    access: proxy
    isDefault: true

# dashboards/dashboard.yaml
apiVersion: 1
providers:
  - name: 'default'
    folder: ''
    type: file
    options:
      path: /etc/grafana/provisioning/dashboards

6. 思考题

  1. Grafana Dashboard 里 Stat / Gauge / Time-series 面板各自适合什么场景?
  2. 模板变量 $__rate_interval[5m] 有什么区别?
  3. 如何用 Grafana 监控业务指标(如注册用户数、订单量)?

参考资料

暂无参考文献