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) 快速找到实现结构体

posted @ 2020-03-22 10:49  黄挤挤  阅读(4445)  评论(2编辑  收藏  举报