今天在 GitHub Trending 上看到一个有意思的项目:Grafana,这是一款强大的开源可观测性平台,帮助用户实现监控数据可视化、告警管理和探索分析。
一、项目概述
Grafana 是一个开源的可观测性和监控平台,由 Grafana Labs 主导开发,采用 AGPL-3.0 开源协议。它允许用户查询、可视化、告警和理解存储在任意位置的指标数据,支持与团队成员创建、探索和共享仪表盘,推动数据驱动的文化建设。
核心特性:
- 丰富的数据可视化:快速灵活的客户端图表,提供多种选项。面板插件提供多种不同的指标和日志可视化方式
- 动态仪表盘:使用模板变量创建动态可复用的仪表盘,变量以下拉框形式出现在仪表盘顶部
- 指标探索:通过即席查询和动态下钻探索数据,支持分屏比较不同时间范围、查询和数据源
- 日志探索:从指标切换到日志时保留标签过滤器的神奇体验,快速搜索所有日志或实时流式传输
- 告警系统:为最重要的指标直观地定义告警规则,持续评估并发送通知到 Slack、PagerDuty、VictorOps、OpsGenie 等系统
- 混合数据源:在同一图表中混合不同数据源,可以基于每个查询指定数据源,甚至支持自定义数据源
二、技术原理
2.1 架构设计
Grafana 采用前后端分离的架构设计:
后端技术栈:
- 语言:Go 1.26.4
- 构建系统:Makefile + Go 原生构建工具
- 依赖管理:Go Modules(go.mod/go.sum)
- 代码生成:Wire(依赖注入)、CUE/Thema(配置模式定义)
- API 规范:Swagger 2.0 + OpenAPI 3.0
从 Makefile 中可以看到后端构建的关键配置:
GO = go
GO_VERSION = 1.26.4
WIRE_TAGS = "oss"
GO_LDFLAGS = -X main.version=$(BUILD_VERSION) \
-X main.commit=$(BUILD_COMMIT) \
-X main.buildBranch=$(BUILD_BRANCH) \
-X main.buildstamp=$(BUILD_STAMP)
后端采用多阶段 Docker 构建策略,支持三种最终镜像变体:
- Alpine:基于 alpine:3.24.1,体积小且安全
- Ubuntu:基于 ubuntu:24.04,兼容性更好
- Distroless:基于 gcr.io/distroless/static-debian13,无 Shell、无包管理器,大幅减少 CVE 攻击面
前端技术栈:
- 语言:TypeScript/JavaScript(React 生态)
- 构建工具:Yarn(模块化工作区)
- Node 版本:Node 24
- 代码规范:ESLint + Prettier
- 国际化:i18next
2.2 数据源插件机制
Grafana 的核心扩展性来自于其插件系统。从代码中可以看到:
// 数据源插件可以通过 register 方法注册
// 每个数据源需要实现标准的查询接口
数据源插件架构支持:
- 统一的查询接口抽象
- 插件沙箱隔离
- 前端可视化组件与后端数据获取逻辑分离
2.3 告警引擎设计
从 Makefile 中的测试目标可以看到 Grafana 的告警系统设计:
.PHONY: test-go-integration-alertmanager
test-go-integration-alertmanager:
@echo "test remote alertmanager integration tests"
$(GO) clean -testcache
AM_URL=http://localhost:8080 AM_TENANT_ID=test \
$(GO) test $(GO_RACE_FLAG) -count=1 -run "^TestIntegrationRemoteAlertmanager" \
-covermode=atomic -timeout=5m ./pkg/services/ngalert/...
告警系统(ngalert)采用模块化设计:
- 规则评估:定期执行查询并评估告警条件
- 通知路由:支持复杂的告警路由和抑制规则
- 多通道集成:内置支持 Slack、PagerDuty、Webhook 等多种通知渠道
2.4 CUE 配置验证
Grafana 使用 CUE(Configure, Unify, Execute)语言进行配置验证和代码生成:
.PHONY: gen-cue
gen-cue:
@echo "generate code from .cue files"
go generate ./kinds/gen.go
go generate ./public/app/plugins/gen.go
CUE 提供了:
- 强类型的配置定义
- 自动生成 Go 代码和 TypeScript 类型
- 配置验证和默认值处理
三、安装与快速开始
3.1 环境要求
后端:
- Go 1.26.4+
- 支持 Linux/macOS/Windows
前端:
- Node.js 24+
- Yarn 包管理器
3.2 安装步骤
方式一:使用官方二进制
# 下载最新版本
wget https://dl.grafana.com/oss/release/grafana-11.5.0.linux-amd64.tar.gz
tar -zxvf grafana-11.5.0.linux-amd64.tar.gz
cd grafana-11.5.0
./bin/grafana server
方式二:Docker 运行
# Alpine 版本(默认)
docker run -d -p 3000:3000 grafana/grafana
# Ubuntu 版本
docker run -d -p 3000:3000 grafana/grafana:dev-ubuntu
# Distroless 版本(最安全)
docker run -d -p 3000:3000 grafana/grafana:dev-distroless
方式三:从源码构建
# 克隆仓库
git clone https://github.com/grafana/grafana.git
cd grafana
# 安装前端依赖
make deps-js
# 构建前端
make build-js
# 构建后端
make build-go
# 运行
./bin/grafana server --homepath=/usr/share/grafana \
--config=/etc/grafana/grafana.ini \
--packaging=docker
3.3 最简运行示例
# 使用 Docker Compose 快速启动(包含 PostgreSQL)
git clone https://github.com/grafana/grafana.git
cd grafana/devenv
make devenv sources=postgres
# 访问 http://localhost:3000
# 默认账号:admin/admin
四、使用方法与实战
4.1 添加数据源
- 登录 Grafana,点击左侧边栏的 “Connections” → “Data Sources”
- 点击 “Add data source”
- 选择数据源类型(如 Prometheus、InfluxDB、MySQL 等)
- 填写连接信息并保存
4.2 创建动态仪表盘
{
"templating": {
"list": [
{
"name": "host",
"type": "query",
"query": "label_values(up, instance)"
},
{
"name": "interval",
"type": "interval",
"values": ["1m", "5m", "10m", "30m", "1h"]
}
]
}
}
使用模板变量可以实现:
- 下拉框选择主机
- 动态时间窗口切换
- 跨数据源的联动查询
4.3 混合数据源可视化
Grafana 允许在同一面板中混合多个数据源:
-- 数据源 A (PostgreSQL)
SELECT time, value FROM metrics WHERE host = '$host'
-- 数据源 B (Prometheus)
up{instance="$host"}
这种灵活性使得可以在同一图表中:
- 关联应用指标和基础设施指标
- 对比不同环境的监控数据
- 实现跨数据中心的统一视图
4.4 配置告警规则
# 告警规则示例
groups:
- name: example
rules:
- alert: HighRequestLatency
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 0.5
for: 5m
labels:
severity: warning
annotations:
summary: "High request latency on {{ $labels.instance }}"
五、常见问题与解决方案
5.1 安装失败
问题:前端依赖安装失败(yarn install 报错)
解决方案:
# 清理缓存后重新安装
rm -rf node_modules yarn.lock
yarn cache clean
YARN_ENABLE_PROGRESS_BARS=false yarn install --immutable
5.2 运行时错误
问题:启动时报 “Failed to connect to database”
解决方案:
检查 conf/defaults.ini 或 conf/custom.ini 中的数据库配置:
[database]
type = sqlite3
host = 127.0.0.1:3306
name = grafana
user = root
password =
path = grafana.db
5.3 性能问题
问题:仪表盘加载缓慢,面板渲染超时
解决方案:
- 优化查询:增加查询时间窗口的下采样
- 启用查询缓存:配置
cache部分 - 使用 Redis/Memcached 缓存:参考 Makefile 中的集成测试目标
# 启用 Redis 缓存
make test-go-integration-redis
5.4 兼容性问题
问题:插件与 Grafana 版本不兼容
解决方案:
- 检查插件的
plugin.json中的dependencies.grafanaVersion - 使用
GF_PLUGINS_PREINSTALL环境变量预安装兼容版本 - 参考 Dockerfile 中的插件打包逻辑
六、总结
Grafana 作为开源可观测性平台的标杆项目,其架构设计充分体现了现代监控系统的核心需求:
- 扩展性:插件系统使得可以轻松接入任意数据源
- 性能:Go 后端 + React 前端的组合,兼顾了性能和开发效率
- 安全性:提供 Distroless 镜像,最小化攻击面
- 可维护性:使用 CUE、Wire 等现代工具进行代码生成和依赖管理
从技术深度来看,Grafana 在以下方面值得深入学习:
- 多数据源的统一查询抽象
- 大规模告警规则的评估引擎设计
- 前后端类型安全的代码生成流程
- Docker 多阶段构建的最佳实践
无论是作为可观测性平台的使用者,还是想要学习现代 Web 应用架构的开发者,Grafana 都是一个值得深入研究的优秀开源项目。
项目地址:https://github.com/grafana/grafana
官方文档:https://grafana.com/docs/
在线体验:https://play.grafana.org/