一、项目概述
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
- 登录 Grafana,进入 Configuration → Data sources → Add data source
- 添加 Prometheus:URL 填入
http://prometheus:9090 - 添加 Loki:URL 填入
http://loki:3100 - 进入 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):
- Dashboards → Import
- 粘贴 ID
1860 - 选择 Prometheus 数据源
- 点击 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 通知渠道配置
支持的通知渠道:
| 渠道 | 说明 |
|---|---|
| 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 获取
- Configuration → API keys → Add API key,选择
Admin角色 - 保存生成的 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 都是监控可视化的最佳选择。