惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
S
SegmentFault 最新的问题
Project Zero
Project Zero
D
DataBreaches.Net
I
InfoQ
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Vercel News
Vercel News
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
I
Intezer
The Hacker News
The Hacker News
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
Help Net Security
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Scott Helme
Scott Helme
T
Threatpost
爱范儿
爱范儿
N
Netflix TechBlog - Medium
D
Docker
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
K
Kaspersky official blog
H
Help Net Security
S
Secure Thoughts
T
Threat Research - Cisco Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
G
Google Developers Blog
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
B
Blog
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
P
Privacy International News Feed
Spread Privacy
Spread Privacy
The Last Watchdog
The Last Watchdog

BlogFinder

日常漫步 Vol.24 之漫步前山河 - 雅余 周报 #1-聊聊本周的收获 - Edwin's Blog 我的OpenCode必装插件与Skill Write Something 掌中之物未必在掌握之中 · CRIVU PiliNara,一个更顺手的 PiliPlus 分支 「NekoEcho」:做一个必有回响的猫娘主题博客 2026-05 书影音总结 简化博客主题 - 安迪 我第一次发布 npm 包 拾花小记#45:中考前的二三事 – 小改学习志 黛西花园5月游 #18 枇杷又熟了的五月月报 一些奇奇怪怪的需求?word仿方正书版的几个小操作 - Xiobb's Blog 0419 御温泉之旅 修复了一些bug,网站基本上趋于稳定了 - 新锐博客 又回到四十年前 如何定义成功 迷鹿屋2026已重新上线 科技冰火两重天+一周回顾 ${title} 热度退了,我反而用得更深了-咕咚同学 我到底该不该换个域名? 随身WIFI折腾记 - 安迪 博客撰写体验提升——hexo pro插件 为什么不用相机把屏幕上的接关密码拍下来? 国清寺与天台山 – Ouroboros ★★★★☆《挽救计划》——久违的经济上行感 - Davidの3号基地 删除右键“打开方式”里多余选项 第三周刊_No.53|一切都会被支付两次 安卓APP通话记录与录音上传踩坑记录 - 子舒的博客 天量下跌 inBox 笔记 2.3.8,把工具栏交给了你-咕咚同学 我把小龙虾搬到了微信-咕咚同学 安好 - 响石潭 Compound Engineering Plugin:让每个工程单元都比上一个更容易 MOSS-TTS Family:开源高质量语音与声音生成模型家族深度解析 Crawl4AI:专为 LLM 设计的开源 Web 爬虫与数据抓取工具 Build Your Own X:从零实现你最喜欢的技术——程序员进阶的终极资源清单 Anthropic Skills:用文件夹教 Claude 专业技能的开源框架 1年的去月球(下) - 梅之夏 欢迎回来。 简单讲讲 ASN.1 与 OID DTV - 直播聚合客户端 5.22-5.27 – 不兴江 还没去过鸭川 – 不兴江 张晶晶同学三刷林志颖 关于我 – 不兴江 爱与嫉妒 – 不兴江 港股被持续做空 备案码花了四百块-咕咚同学 一句话生成封面:我给公众号做了4种风格的AI封面生成技能 「官」方認證 再谈费曼学习法 2026-05-28T00:34:11+08:00 2026-05-28T00:28:45+08:00 离谱的英语学习指南:基于AI的英语进阶系统方法论 iii:零集成架构的后端统一运行时 Claude Code Harness:让 Claude Code 工作有迹可循的工程化框架 Heretic:全自动移除大语言模型审查机制的开源工具 MarkItDown:微软开源的万能文档转 Markdown 利器 Harness:让 Claude Code 秒变多智能体协作工厂 这段时间尽折腾AI Agent了,确实极大地提高了效率 近期动态:两个新站点正式上线啦 误判解除!zhouayuan.com 腾讯安全申诉成功 - 周阿源|玩具设计・插画日常・生活随笔 Ralph:让 AI 编码工具自主循环跑完所有 PRD 任务的量产神器 全都违法 – 个人工作记录 关于zhouayuan.com被误判 “含违规信息” 的说明与申诉记录 - 周阿源|玩具设计・插画日常・生活随笔 小米 MiMo v2.5 Pro 白嫖 最大的人间清醒,兜里有钱,但是不花。 夜晚靓歌(12):于文文现场solo - 王志勇的Blog 今日插画:风扬起的倔强 - 周阿源|玩具设计・插画日常・生活随笔 回门习俗 独立网卡 - 忘记了回忆 500亿入股人工智能企业 从命令行到桌面智能体-咕咚同学 第一性原理读书笔记 行者微评论223-加班の守株待兔-博客|政治与时事-风雨行者 ZOZO开源物理接触求解器:GPU加速的可扩展仿真引擎 OpenStock:开源股票市场交易平台技术深度解析 MoneyPrinterTurbo:基于AI的全自动短视频生成工具深度解析 Claude-Mem:为 Claude Code 构建的持久化记忆压缩系统 Twenty:可代码化定制的企业级开源 CRM 平台技术深度解析 2026-05-26T22:59:17+08:00 企业级开源大模型部署平台 GPUStack 实战教程 1年的去月球(上) - 梅之夏 Sevalla - 静态网站托管服务 不用翻墙、不用注册、不用月费,普通人也能用上 Claude Code 装修灯具要注意⚠️ 黄梅天先锋 - 游子微博 公安备案顺利办结,站点备案全部完成 - 周阿源|玩具设计・插画日常・生活随笔 第三次兑换天猫超市卡了宗宗酱-三维狐少儿编程 Don't think, feel. - Rolen's Blog 人这一辈子,到底图个什么 博客迁移 - Edwin's Blog 情感赛道写作模板 再现本轮行情的典型特征 裁员与平常心-咕咚同学 别让“偷懒”,成为隐私泄露的破绽 片刻 - Jdeal | Life is like a Design.
Grafana:开源可观测性平台的架构设计与最佳实践
Cheman · 2026-06-27 · via BlogFinder

今天在 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 添加数据源

  1. 登录 Grafana,点击左侧边栏的 “Connections” → “Data Sources”
  2. 点击 “Add data source”
  3. 选择数据源类型(如 Prometheus、InfluxDB、MySQL 等)
  4. 填写连接信息并保存

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.iniconf/custom.ini 中的数据库配置:

[database]
type = sqlite3
host = 127.0.0.1:3306
name = grafana
user = root
password =
path = grafana.db

5.3 性能问题

问题:仪表盘加载缓慢,面板渲染超时

解决方案

  1. 优化查询:增加查询时间窗口的下采样
  2. 启用查询缓存:配置 cache 部分
  3. 使用 Redis/Memcached 缓存:参考 Makefile 中的集成测试目标
# 启用 Redis 缓存
make test-go-integration-redis

5.4 兼容性问题

问题:插件与 Grafana 版本不兼容

解决方案

  • 检查插件的 plugin.json 中的 dependencies.grafanaVersion
  • 使用 GF_PLUGINS_PREINSTALL 环境变量预安装兼容版本
  • 参考 Dockerfile 中的插件打包逻辑

六、总结

Grafana 作为开源可观测性平台的标杆项目,其架构设计充分体现了现代监控系统的核心需求:

  1. 扩展性:插件系统使得可以轻松接入任意数据源
  2. 性能:Go 后端 + React 前端的组合,兼顾了性能和开发效率
  3. 安全性:提供 Distroless 镜像,最小化攻击面
  4. 可维护性:使用 CUE、Wire 等现代工具进行代码生成和依赖管理

从技术深度来看,Grafana 在以下方面值得深入学习:

  • 多数据源的统一查询抽象
  • 大规模告警规则的评估引擎设计
  • 前后端类型安全的代码生成流程
  • Docker 多阶段构建的最佳实践

无论是作为可观测性平台的使用者,还是想要学习现代 Web 应用架构的开发者,Grafana 都是一个值得深入研究的优秀开源项目。

项目地址:https://github.com/grafana/grafana

官方文档:https://grafana.com/docs/

在线体验:https://play.grafana.org/