Grafana 源码分析
版本 6.7.1
前言
- go 依赖注入
- 事件总线模式
- go-macaron
- hashicorp/go-plugin
- DTO
Services
Services vs Background Services
两者都实现了 Init(),后者还实现了 Run()
分析 server.go 代码可知,大多数服务是通过匿名导入( import _ <package> )的方式,随包的 init() 方法完成服务注册。只有 api.HTTPServer 服务是通过显式导入 api 包并注册。而 api.HTTPServer 服务的依赖服务,包括 datasources.CacheService、login.LoginService、hooks.HooksService、quota.QuotaService、backendplugin.Manager、rendering.RenderingService 是在 http_server.go 中显式导入注册。
优先级 High:SqlStore,HTTPServer
Service | 功能说明 | 依赖项 |
---|---|---|
SqlStore | 提供数据库服务,包括用户表、模板信息表等、注册各种数据库表增删改查请求的处理函数,比如 Dashboard 表的请求处理函数。Init:初始化 xorm 引擎;完成表的创建或升级、迁移操作;向 Bus 注册 sql Handler;检查用户表中是否至少有一个 admin。 | *setting.Cfg, bus.Bus, *localcache.CacheService |
OSSLicensingService | 检查开源软件证书授权 | *setting.Cfg, *hooks.HooksService |
UserAuthTokenService | *sqlstore.SqlStore, *serverlock.ServerLockService, *setting.Cfg | |
SearchService | 处理 /api/search/,/api/alerts/{alertid} 等API 请求 | bus.Bus |
CacheService | 从缓存中读取 datasource 信息并返回。 | bus.Bus, *localcache.CacheService |
LoginService | 提供登录后的服务。Init:注册 user 更新处理函数到 Bus。 | bus.Bus, *quota.QuotaService |
HooksService | ||
QuotaService | models.UserTokenService | |
ServerLockService | *sqlstore.SqlStore |
BackgroundService | 说明 | 依赖项 |
---|---|---|
HTTPServer | 提供 API 服务,Web 框架基于 go-macaron。Init:初始化 HTTPServer 结构体,包括创建一个 Macaron 实例,注册 API 路由以及对应处理函数 handler。Run:将注册的 API 路径依次应用到 Macaron 实例(通过调用 Macaron 的 Handle 和 Get 方法);根据协议(HTTP/HTTP2/HTTPS/SOCKET)启动服务端。 | routing.RouteRegister, bus.Bus, rendering.Service, *setting.Cfg, *hooks.HooksService, *localcache.CacheService, datasources.CacheService, models.UserTokenService, *quota.QuotaService, *remotecache.RemoteCache, api.ProvisioningService, *login.LoginService, models.Licensing, backendplugin.Manager, *plugins.PluginManager |
InternalMetricsService | *setting.Cfg | |
RemoteCache | 向远端存储存放对象,支持的远端存储包括:redis,memcached 和 db。 | *sqlstore.SqlStore, *setting.Cfg |
TracingService | 提供 jaeger 的链路追踪服务 | *setting.Cfg |
UsageStatsService | *setting.Cfg, bus.Bus, *sqlstore.SqlStore, models.Licensing | |
PluginManager | 加载前端插件:datasource(负载将 ds 的原始数据转化成前端需要的 time series 或 table 格式),panel 和 app。Init:读取 plugin.json 文件,初始化插件信息。Run:每 10分钟 检查插件版本,并更新。 | backendplugin.Manager |
AlertEngine | 告警处理服务。Init:初始化告警 Job 队列。Run:更新任务队列;处理告警任务。 | rendering.Service |
CleanUpService | 定时删除 过期、tmp 文件 | *setting.Cfg, *serverlock.ServerLockService |
NotificationService | 通知处理服务 | bus.Bus, *setting.Cfg |
ProvisioningService | *setting.Cfg | |
RenderingService | 提供监控导出图片服务。 | *setting.Cfg, *remotecache.RemoteCache |
Manager | 加载后端插件 。 | |
Service:包名.服务结构体名 | ||
功能说明:介绍 Service(功能概述、init() 方法向 Bus 注册了哪些事件处理函数等),以及 Init(),Run() 函数功能 | ||
依赖项:仅列出被 `inject:""` 标记的字段 |
数据库表
Dashboard 表
插件系统
Frontend Plugin
Backend Plugin
CLI 工具
总结
小技巧:Navigate | Implementation(s) 快速找到实现结构体