Grafana - 开源监控可视化与数据分析平台,Go+TypeScript开发,Prometheus集成,多数据源仪表盘,告警通知

Grafana - 开源监控可视化与数据分析平台,Go+TypeScript开发,Prometheus集成,多数据源仪表盘,告警通知

_

一、项目概述

Grafana 是一款流行的开源监控可视化与数据分析平台,能够将来自多个数据源(如 Prometheus、Loki、Graphite、InfluxDB、MySQL、PostgreSQL、Elasticsearch、Jaeger 等)的数据以图表、仪表盘和告警的形式呈现出来。它采用 Go 语言编写后端服务,前端使用 TypeScript/React 构建,功能丰富且可扩展,是 DevOps 和 SRE 工程师最常用的监控工具之一。

Grafana Labs 提供了两个主要版本:Grafana OSS(开源免费版) 与 **Grafana Cloud(托管版)。OSS 版本即可满足绝大多数团队的监控需求。项目目前在 GitHub 上拥有超过 63K Stars,最新稳定版本为 11.x,配套庞大的插件生态和仪表盘市场,是目前监控可视化领域的事实标准。

  • GitHub 地址:https://github.com/grafana/grafana
  • 官方网站:https://grafana.com/
  • 开源协议:AGPL-3.0
  • 开发语言:Go + TypeScript/React
  • 核心定位:多数据源、可扩展的开源监控与可视化平台

1.1 与同类产品对比

特性 Grafana Kibana Zabbix DataDog
开源免费 ✅(开源 Elastic 产品的一部分) ❌(SaaS 商业产品)
多数据源 ✅(Prometheus/InfluxDB/MySQL/Loki 等) ❌(主打 Elasticsearch) ✅(Zabbix Agent) ✅(内置集成)
丰富仪表盘
告警引擎 ✅(Unified Alerting)
插件市场 ✅(有限) ✅(DataDog Marketplace)
日志可视化 ✅(与 Loki 搭配) ✅(ELK Stack)
链路追踪 ✅(与 Tempo 搭配) ✅(APM)
典型适用场景 通用监控与指标可视化 Elastic Stack 日志分析 企业级主机监控 SaaS 全栈可观测性

二、核心功能模块详解

2.1 多数据源支持

数据源类型 内置数据源
时序数据库 Prometheus、InfluxDB、Graphite、OpenTSDB
日志系统 Loki、Elasticsearch
关系型数据库 MySQL、PostgreSQL、MSSQL
云监控 CloudWatch、Azure Monitor、Google Stackdriver
追踪 Tempo、Zipkin、Jaeger
其他 Testdata、CSV、GraphQL、--mixed--

2.2 Dashboard 与 Panel 类型

  • Time series:折线图/面积图/柱状图,最常用
  • Stat:单值大数字(如当前 CPU 使用率)
  • Gauge:仪表盘
  • Bar chart:柱状图
  • Pie chart:饼图
  • Table:表格
  • Heatmap:热力图
  • Histogram:直方图
  • State timeline:状态时间线
  • Logs panel:日志面板(Loki)
  • Traces:链路追踪(Tempo)

2.3 变量与模板(Variables)

变量类型 说明
Query 通过查询数据源动态生成选项
Custom 自定义静态列表
Interval 时间间隔变量(如$__interval
Text Box 文本框输入
Data source 在多个数据源之间切换

示例:定义 $node 变量,在下拉列表选择具体主机,Dashboard 所有图表自动切换。

2.4 统一告警引擎(Unified Alerting)

  • 基于 PromQL / 数据源支持的告警规则
  • 通知渠道:Email、Slack、Webhook、PagerDuty、钉钉、Telegram 等
  • 告警状态跟踪与静默(Silencing)
  • Alertmanager 兼容性

2.5 插件系统

  • Panel 插件:扩展 Dashboard 类型(如 Clock、Pie Chart)
  • Data Source 插件:扩展数据源(如 Zabbix、Splunk)
  • Application 插件:扩展整个应用(如 Kubernetes 监控包)

2.6 用户、组织与团队

  • 多组织(Organization)
  • 多用户(User)
  • 团队(Team)与基于角色的访问控制(RBAC)
  • 文件夹级别的权限控制

2.7 Loki 日志与 Tempo 链路追踪

  • Loki:Grafana 开发的日志聚合系统,类似 ELK 的轻量替代方案,以 Prometheus 标签风格组织日志
  • Tempo:Grafana 开发的分布式追踪系统,兼容 Jaeger/Zipkin 协议

三、技术架构与实现原理

3.1 整体架构

[用户浏览器(React UI)]
         │
         ▼
[Grafana Server(Go)]
    │          │
    ▼          ▼
[SQLite/MySQL/Postgres]
    │
    ▼
[Prometheus / Loki / InfluxDB / Tempo 等数据源]

3.2 核心组件

组件 说明
Grafana Server Go 编写的后端服务,默认 3000 端口
Grafana UI React 编写的前端
配置数据库 SQLite(默认)、MySQL、PostgreSQL
插件 Host 承载插件的独立进程
Alertmanager 可选外部告警管理器

3.3 插件架构

  • Panel / Data Source / App 三种插件均可热插拔,通过独立进程隔离

3.4 告警架构

  • 告警规则存储在数据库中
  • Grafana 评估规则并生成告警
  • 发送到通知渠道

四、快速上手:Docker 部署实战

4.1 部署 Grafana OSS

docker run -d \
  --name=grafana \
  -p 3000:3000 \
  -e "GF_SECURITY_ADMIN_PASSWORD=your-password" \
  -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource" \
  -v ./grafana-data:/var/lib/grafana \
  --restart=unless-stopped \
  grafana/grafana-oss:latest

访问 http://<主机IP>:3000,默认用户 admin,密码为设置的密码。

4.2 Docker Compose 完整监控栈(Grafana + Prometheus + Node Exporter + cAdvisor + Loki + Promtail)

version: "3.8"

services:
  grafana:
    image: grafana/grafana-oss:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=your-admin-password
      - GF_USERS_ALLOW_SIGN_UP=false
      - TZ=Asia/Shanghai
    volumes:
      - ./grafana-data:/var/lib/grafana

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - "9100:9100"

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

  loki:
    image: grafana/loki:latest
    container_name: loki
    restart: unless-stopped
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    volumes:
      - ./loki-data:/loki

  promtail:
    image: grafana/promtail:latest
    container_name: promtail
    restart: unless-stopped
    volumes:
      - ./promtail-config.yml:/etc/promtail/config.yml
      - /var/log:/var/log:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
    command: -config.file=/etc/promtail/config.yml

volumes:
  grafana-data:
  prometheus-data:
  loki-data:

4.3 prometheus.yml 配置

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100']

  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

  - job_name: 'nginx'
    static_configs:
      - targets: ['nginx-exporter:9113']

4.4 首次使用 Grafana

  1. 登录 Grafana,进入 Configuration → Data sources → Add data source
  2. 添加 Prometheus:URL 填入 http://prometheus:9090
  3. 添加 Loki:URL 填入 http://loki:3100
  4. 进入 Dashboards → New dashboard 创建第一个图表

五、从源码编译与开发环境

5.1 构建 Grafana

# 1. 安装依赖
sudo apt install -y nodejs npm golang-1.22

# 2. 克隆仓库
git clone https://github.com/grafana/grafana.git
cd grafana

# 3. 安装前端依赖
yarn install --cwd web

# 4. 构建前端
yarn build

# 5. 构建后端
make build

# 6. 启动
./bin/grafana server

5.2 Docker 镜像构建

docker build -f Dockerfile -t grafana:local .
docker run -d -p 3000:3000 grafana:local

5.3 插件开发(自定义 Panel 插件

npx @grafana/create-plugin@latest
cd my-panel-plugin
yarn install
yarn dev

六、Dashboard 市场与常用面板

6.1 Dashboard 市场

Grafana 提供了庞大的仪表盘市场:https://grafana.com/grafana/dashboards

常用 Dashboard ID 名称 说明
**1860 Node Exporter Full 完整主机监控面板
**14282 cAdvisor Exporter Docker 容器监控
**13946 Docker Monitoring 完整 Docker 监控
**9614 Nginx Exporter Nginx 监控
**10428 Traefik 2 Traefik 监控
**15172 PostgreSQL PostgreSQL 监控
**15757 Kubernetes Cluster Monitoring Kubernetes 集群监控
**13673 Loki Logs Dashboard Loki 日志 Dashboard
**5475 MySQL Performance Schema MySQL 监控
**10887 JMX Exporter Kafka Kafka 监控

6.2 导入 Dashboard

导入 1860(Node Exporter Full):

  1. Dashboards → Import
  2. 粘贴 ID 1860
  3. 选择 Prometheus 数据源
  4. 点击 Import

6.3 创建自定义图表

PromQL 查询示例:

# CPU 使用率(排除 idle 所有核)
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100

# 内存使用率
100 - ((node_memory_MemAvailable_bytes{job="node-exporter"} / node_memory_MemTotal_bytes) * 100)

# 磁盘使用率
100 - ((node_filesystem_avail_bytes{mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes) * 100)

# 网络接收速率
rate(node_network_receive_bytes_total{device="eth0"}[5m])

七、告警配置(Unified Alerting)

7.1 创建告警规则

进入 Alerting → Alert rules → New alert rule:

# 示例:CPU 使用率告警规则
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90

for: 5m

labels:
  severity: warning

annotations:
  summary: "主机 {{ $labels.instance }} CPU 使用率超过 90%"
  description: "当前 CPU 使用率 {{ $value | printf "%.2f" }}%"

7.2 通知渠道配置

支持的通知渠道:

渠道 说明
Email SMTP 邮箱告警
Slack Slack Webhook
Webhook 自定义 Webhook
PagerDuty PagerDuty 集成
OpsGenie OpsGenie 集成
Telegram 通过 Bot 推送
DingTalk 钉钉机器人
Microsoft Teams Teams Webhook

7.3 Contact Points 与 Notification Policies

Contact Points:接收告警的目标(邮箱、Slack channel 等)
Notification Policies:基于标签路由告警到 Contact Points


八、API 接口与自动化集成

8.1 API Key 获取

  1. Configuration → API keys → Add API key,选择 Admin 角色
  2. 保存生成的 Token

8.2 常用 API 调用

TOKEN="glsa_your-token"
BASE="http://127.0.0.1:3000"

# 获取所有数据源
curl -H "Authorization: Bearer $TOKEN" $BASE/api/datasources | jq

# 创建 Dashboard
curl -X POST $BASE/api/dashboards/db \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"dashboard":{"title":"My Dashboard","tags":["test"],"timezone":"browser","schemaVersion":30,"version":1},"overwrite":false}'

# 搜索 Dashboard
curl -H "Authorization: Bearer $TOKEN" "$BASE/api/search?query=node" | jq

# 列出所有告警规则
curl -H "Authorization: Bearer $TOKEN" "$BASE/api/v1/provisioning/alert-rules" | jq

8.3 Provisioning(自动配置数据源和 Dashboard)

通过 YAML 预配置数据源和 Dashboard:

apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    editable: true

将此文件挂载到 `/etc/grafana/provisioning/datasources/ 目录。


九、性能优化与大规模部署

9.1 使用外部数据库

默认使用 SQLite,生产环境建议使用 PostgreSQL 来提升性能与高可用:

docker run -d \
  -e "GF_DATABASE_TYPE=postgres" \
  -e "GF_DATABASE_HOST=postgres:5432" \
  -e "GF_DATABASE_NAME=grafana" \
  -e "GF_DATABASE_USER=grafana" \
  -e "GF_DATABASE_PASSWORD=grafana" \
  grafana/grafana-oss:latest

9.2 缓存与性能

  • 启用浏览器缓存
  • 配置内存缓存
  • 使用 Redis 作为外部缓存

9.3 反向代理与 HTTPS

server {
    listen 443 ssl http2;
    server_name grafana.example.com;

    ssl_certificate     /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

9.4 高可用部署

  • 使用 PostgreSQL 作为外部数据库,多个 Grafana 实例可水平扩展
  • 使用 Redis 缓存
  • 使用负载均衡器(如 Nginx)分发请求到多个 Grafana 实例

9.5 Provisioning 自动化

使用 Grafana 的 Provisioning 可通过配置文件管理数据源和 Dashboard,便于通过 Git 版本控制,做到 IaC 自动化部署。


十、常见问题与故障排查

10.1 Prometheus 数据源无法连接

  • 检查网络连通性:curl http://prometheus:9090/-/healthy
  • 检查容器网络:检查 prometheus 容器是否在同一网络
  • 检查 Prometheus 配置是否有权限访问

10.2 Dashboard 图表不显示数据

  • 检查 Prometheus 是否抓取到数据:访问 http://<serverIP>:9090,使用 node_cpu_seconds_total 查询
  • 检查 PromQL 语法是否正确
  • 检查时间范围是否合理

10.3 告警规则未触发

  • 检查 expr 表达式是否正确
  • 检查 for 时间是否太短(默认 0 秒)
  • 检查 Contact Points 配置是否正确
  • 查看 Alertmanager 状态

10.4 日志面板(Loki)无法显示日志

  • 检查 Loki 与 Promtail 配置正确
  • 检查 Docker 容器日志路径映射
  • 检查 Loki 与 Promtail 之间的连接

10.5 升级 Grafana

docker pull grafana/grafana-oss:latest
docker stop grafana
docker rm grafana
# 重新创建容器

十一、社区生态与学习资源

| 项目 | 用途 | 地址 |
|------|------|
| Grafana Docs | 官方文档 | https://grafana.com/docs/grafana/latest/ |
| Grafana Labs 博客 | 教程与更新 | https://grafana.com/blog/ |
| Grafana Labs 社区 | 论坛 | https://community.grafana.com/ |
| Grafana Dashboard 市场 | Dashboard 模板下载 | https://grafana.com/grafana/dashboards |
| Grafana Plugin 市场 | 插件下载 | https://grafana.com/grafana/plugins |
| Prometheus 官方文档 | Prometheus 使用手册 | https://prometheus.io/docs/ |
| Awesome Prometheus | 第三方资源合集 | https://github.com/roaldnefs/awesome-prometheus-alerts |
| Loki 官方文档 | Loki 使用手册 | https://grafana.com/docs/loki/latest/ |
| PromQL Cheat Sheet | PromQL 速查表 | https://promlabs.com/promql-cheat-sheet/ |


十二、使用场景与案例参考

12.1 自托管主机/小团队监控

Grafana + Prometheus + Node Exporter + cAdvisor 构成完整监控方案:

  • 主机 CPU/内存/磁盘/网络监控
  • Docker 容器资源监控
  • Nginx/Web 服务监控
  • PostgreSQL/MySQL 数据库监控

12.2 企业级可观测性

Grafana + Loki + Tempo + Prometheus 构成完整可观测性栈

  • 指标(Metrics):Prometheus
  • 日志(Logs):Loki
  • 追踪(Traces):Tempo

12.3 个人网站监控

  • 使用 Blackbox Exporter 监控网站可用性与端口
  • 使用 Alertmanager + Webhook 发送到钉钉/Slack 告警

12.4 与 Kibana / Zabbix / DataDog 的选择

工具 推荐场景
Grafana 开源免费、多数据源、强大的 Dashboard
Kibana 配合 Elasticsearch 使用
Zabbix 传统企业级监控、内置告警
DataDog 无需自己部署、SaaS 服务、但收费

总结

Grafana 凭借强大的多数据源支持和丰富的仪表盘市场,使其成为监控可视化领域的事实标准。它可与 Prometheus、Loki、InfluxDB、MySQL 等多种数据源无缝集成,并通过丰富的 Panel 类型和变量模板,让 DevOps 团队能够以可视化方式呈现监控数据。配合 Alertmanager 和通知渠道,可实现完整的告警流程。对于自托管爱好者和小团队,推荐使用 Docker Compose 一键部署 Grafana + Prometheus + Node Exporter + Loki 完整监控栈,并通过 Dashboard 市场快速搭建主机监控、容器监控、数据库监控等面板。对于企业级场景,配合高可用 PostgreSQL、Redis 缓存和负载均衡,可构建生产级监控系统。Grafana 的 Provisioning 和 API 还支持自动化配置,实现完整的 IaC 工作流。无论你是入门还是资深工程师,Grafana 都是监控可视化的最佳选择。

Jellyfin - 开源媒体服务器,Emby分叉版本,.NET+C#开发,电影电视音乐照片播客,Netflix私有化部署 2026-06-20
OwnCast 开源项目详解:自托管视频直播流平台部署教程与 Twitch 替代方案实战指南 2026-06-20

评论区