
























今天在 GitHub Trending 上看到一个有意思的项目:Grafana,这是一款强大的开源可观测性平台,帮助用户实现监控数据可视化、告警管理和探索分析。
Grafana 是一个开源的可观测性和监控平台,由 Grafana Labs 主导开发,采用 AGPL-3.0 开源协议。它允许用户查询、可视化、告警和理解存储在任意位置的指标数据,支持与团队成员创建、探索和共享仪表盘,推动数据驱动的文化建设。
核心特性:
Grafana 采用前后端分离的架构设计:
后端技术栈:
从 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 构建策略,支持三种最终镜像变体:
前端技术栈:
Grafana 的核心扩展性来自于其插件系统。从代码中可以看到:
// 数据源插件可以通过 register 方法注册
// 每个数据源需要实现标准的查询接口
数据源插件架构支持:
从 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)采用模块化设计:
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 提供了:
后端:
前端:
方式一:使用官方二进制
# 下载最新版本
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
# 使用 Docker Compose 快速启动(包含 PostgreSQL)
git clone https://github.com/grafana/grafana.git
cd grafana/devenv
make devenv sources=postgres
# 访问 http://localhost:3000
# 默认账号:admin/admin
{
"templating": {
"list": [
{
"name": "host",
"type": "query",
"query": "label_values(up, instance)"
},
{
"name": "interval",
"type": "interval",
"values": ["1m", "5m", "10m", "30m", "1h"]
}
]
}
}
使用模板变量可以实现:
Grafana 允许在同一面板中混合多个数据源:
-- 数据源 A (PostgreSQL)
SELECT time, value FROM metrics WHERE host = '$host'
-- 数据源 B (Prometheus)
up{instance="$host"}
这种灵活性使得可以在同一图表中:
# 告警规则示例
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 }}"
问题:前端依赖安装失败(yarn install 报错)
解决方案:
# 清理缓存后重新安装
rm -rf node_modules yarn.lock
yarn cache clean
YARN_ENABLE_PROGRESS_BARS=false yarn install --immutable
问题:启动时报 “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
问题:仪表盘加载缓慢,面板渲染超时
解决方案:
cache 部分# 启用 Redis 缓存
make test-go-integration-redis
问题:插件与 Grafana 版本不兼容
解决方案:
plugin.json 中的 dependencies.grafanaVersionGF_PLUGINS_PREINSTALL 环境变量预安装兼容版本Grafana 作为开源可观测性平台的标杆项目,其架构设计充分体现了现代监控系统的核心需求:
从技术深度来看,Grafana 在以下方面值得深入学习:
无论是作为可观测性平台的使用者,还是想要学习现代 Web 应用架构的开发者,Grafana 都是一个值得深入研究的优秀开源项目。
项目地址:https://github.com/grafana/grafana
官方文档:https://grafana.com/docs/
在线体验:https://play.grafana.org/
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。