Skip to content

Commit d1876b6

Browse files
authored
Chore: refactor grafana-apiserver a bit (grafana#74177)
1 parent 439270f commit d1876b6

File tree

14 files changed

+130
-188
lines changed

14 files changed

+130
-188
lines changed

.github/CODEOWNERS

-1
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@
9898
/pkg/server/ @grafana/backend-platform
9999
/pkg/services/annotations/ @grafana/backend-platform
100100
/pkg/services/apikey/ @grafana/grafana-authnz-team
101-
/pkg/services/certgenerator @grafana/grafana-app-platform-squad
102101
/pkg/services/cleanup/ @grafana/backend-platform
103102
/pkg/services/contexthandler/ @grafana/backend-platform
104103
/pkg/services/correlations/ @grafana/explore-squad

pkg/modules/dependencies.go

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package modules
2+
3+
const (
4+
// All includes all modules necessary for Grafana to run as a standalone server
5+
All string = "all"
6+
7+
Core string = "core"
8+
GrafanaAPIServer string = "grafana-apiserver"
9+
)
10+
11+
var dependencyMap = map[string][]string{
12+
GrafanaAPIServer: {},
13+
Core: {},
14+
All: {Core},
15+
}

pkg/modules/listener.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66

77
"github.com/grafana/dskit/modules"
88
"github.com/grafana/dskit/services"
9+
910
"github.com/grafana/grafana/pkg/infra/log"
1011
)
1112

@@ -30,12 +31,12 @@ func (l *serviceListener) Stopped() {
3031

3132
func (l *serviceListener) Failure(service services.Service) {
3233
// if any service fails, stop all services
33-
if err := l.service.Shutdown(context.Background()); err != nil {
34+
if err := l.service.Shutdown(context.Background(), service.FailureCase().Error()); err != nil {
3435
l.log.Error("Failed to stop all modules", "err", err)
3536
}
3637

3738
// log which module failed
38-
for module, s := range l.service.ServiceMap {
39+
for module, s := range l.service.serviceMap {
3940
if s == service {
4041
if errors.Is(service.FailureCase(), modules.ErrStopProcess) {
4142
l.log.Info("Received stop signal via return error", "module", module, "err", service.FailureCase())

pkg/modules/modules.go

+45-51
Original file line numberDiff line numberDiff line change
@@ -8,109 +8,103 @@ import (
88
"github.com/grafana/dskit/services"
99

1010
"github.com/grafana/grafana/pkg/infra/log"
11-
"github.com/grafana/grafana/pkg/services/featuremgmt"
12-
"github.com/grafana/grafana/pkg/setting"
1311
)
1412

1513
type Engine interface {
16-
Init(context.Context) error
1714
Run(context.Context) error
18-
Shutdown(context.Context) error
15+
Shutdown(context.Context, string) error
1916
}
2017

2118
type Manager interface {
22-
RegisterModule(name string, initFn func() (services.Service, error), deps ...string)
23-
RegisterInvisibleModule(name string, initFn func() (services.Service, error), deps ...string)
19+
RegisterModule(name string, fn initFn)
20+
RegisterInvisibleModule(name string, fn initFn)
2421
}
2522

2623
var _ Engine = (*service)(nil)
2724
var _ Manager = (*service)(nil)
2825

2926
// service manages the registration and lifecycle of modules.
3027
type service struct {
31-
cfg *setting.Cfg
32-
log log.Logger
33-
targets []string
34-
dependencyMap map[string][]string
35-
36-
ModuleManager *modules.Manager
37-
ServiceManager *services.Manager
38-
ServiceMap map[string]services.Service
28+
log log.Logger
29+
targets []string
30+
31+
moduleManager *modules.Manager
32+
serviceManager *services.Manager
33+
serviceMap map[string]services.Service
3934
}
4035

41-
func ProvideService(
42-
cfg *setting.Cfg,
43-
features *featuremgmt.FeatureManager,
36+
func New(
37+
targets []string,
4438
) *service {
4539
logger := log.New("modules")
4640

4741
return &service{
48-
cfg: cfg,
49-
log: logger,
50-
targets: cfg.Target,
51-
dependencyMap: map[string][]string{},
42+
log: logger,
43+
targets: targets,
5244

53-
ModuleManager: modules.NewManager(logger),
54-
ServiceMap: map[string]services.Service{},
45+
moduleManager: modules.NewManager(logger),
46+
serviceMap: map[string]services.Service{},
5547
}
5648
}
5749

58-
// Init initializes all registered modules.
59-
func (m *service) Init(_ context.Context) error {
50+
// Run starts all registered modules.
51+
func (m *service) Run(ctx context.Context) error {
6052
var err error
6153

62-
for mod, targets := range m.dependencyMap {
63-
if err := m.ModuleManager.AddDependency(mod, targets...); err != nil {
54+
for mod, targets := range dependencyMap {
55+
if !m.moduleManager.IsModuleRegistered(mod) {
56+
continue
57+
}
58+
if err := m.moduleManager.AddDependency(mod, targets...); err != nil {
6459
return err
6560
}
6661
}
6762

68-
m.ServiceMap, err = m.ModuleManager.InitModuleServices(m.targets...)
63+
m.serviceMap, err = m.moduleManager.InitModuleServices(m.targets...)
6964
if err != nil {
7065
return err
7166
}
7267

7368
// if no modules are registered, we don't need to start the service manager
74-
if len(m.ServiceMap) == 0 {
69+
if len(m.serviceMap) == 0 {
7570
return nil
7671
}
7772

7873
var svcs []services.Service
79-
for _, s := range m.ServiceMap {
74+
for _, s := range m.serviceMap {
8075
svcs = append(svcs, s)
8176
}
82-
m.ServiceManager, err = services.NewManager(svcs...)
8377

84-
return err
85-
}
78+
m.serviceManager, err = services.NewManager(svcs...)
79+
if err != nil {
80+
return err
81+
}
8682

87-
// Run starts all registered modules.
88-
func (m *service) Run(ctx context.Context) error {
8983
// we don't need to continue if no modules are registered.
9084
// this behavior may need to change if dskit services replace the
9185
// current background service registry.
92-
if len(m.ServiceMap) == 0 {
86+
if len(m.serviceMap) == 0 {
9387
m.log.Warn("No modules registered...")
9488
<-ctx.Done()
9589
return nil
9690
}
9791

9892
listener := newServiceListener(m.log, m)
99-
m.ServiceManager.AddListener(listener)
93+
m.serviceManager.AddListener(listener)
10094

10195
m.log.Debug("Starting module service manager")
10296
// wait until a service fails or stop signal was received
103-
err := m.ServiceManager.StartAsync(ctx)
97+
err = m.serviceManager.StartAsync(ctx)
10498
if err != nil {
10599
return err
106100
}
107101

108-
err = m.ServiceManager.AwaitStopped(ctx)
102+
err = m.serviceManager.AwaitStopped(ctx)
109103
if err != nil {
110104
return err
111105
}
112106

113-
failed := m.ServiceManager.ServicesByState()[services.Failed]
107+
failed := m.serviceManager.ServicesByState()[services.Failed]
114108
for _, f := range failed {
115109
// the service listener will log error details for all modules that failed,
116110
// so here we return the first error that is not ErrStopProcess
@@ -123,27 +117,27 @@ func (m *service) Run(ctx context.Context) error {
123117
}
124118

125119
// Shutdown stops all modules and waits for them to stop.
126-
func (m *service) Shutdown(ctx context.Context) error {
127-
if m.ServiceManager == nil {
120+
func (m *service) Shutdown(ctx context.Context, reason string) error {
121+
if m.serviceManager == nil {
128122
m.log.Debug("No modules registered, nothing to stop...")
129123
return nil
130124
}
131-
m.ServiceManager.StopAsync()
132-
m.log.Info("Awaiting services to be stopped...")
133-
return m.ServiceManager.AwaitStopped(ctx)
125+
m.serviceManager.StopAsync()
126+
m.log.Info("Awaiting services to be stopped...", "reason", reason)
127+
return m.serviceManager.AwaitStopped(ctx)
134128
}
135129

130+
type initFn func() (services.Service, error)
131+
136132
// RegisterModule registers a module with the dskit module manager.
137-
func (m *service) RegisterModule(name string, initFn func() (services.Service, error), deps ...string) {
138-
m.ModuleManager.RegisterModule(name, initFn)
139-
m.dependencyMap[name] = deps
133+
func (m *service) RegisterModule(name string, fn initFn) {
134+
m.moduleManager.RegisterModule(name, fn)
140135
}
141136

142137
// RegisterInvisibleModule registers an invisible module with the dskit module manager.
143138
// Invisible modules are not visible to the user, and are intendent to be used as dependencies.
144-
func (m *service) RegisterInvisibleModule(name string, initFn func() (services.Service, error), deps ...string) {
145-
m.ModuleManager.RegisterModule(name, initFn, modules.UserInvisibleModule)
146-
m.dependencyMap[name] = deps
139+
func (m *service) RegisterInvisibleModule(name string, fn initFn) {
140+
m.moduleManager.RegisterModule(name, fn, modules.UserInvisibleModule)
147141
}
148142

149143
// IsModuleEnabled returns true if the module is enabled.

pkg/modules/wire.go

-9
This file was deleted.

pkg/server/server.go

+5-27
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"github.com/grafana/grafana/pkg/infra/log"
1919
"github.com/grafana/grafana/pkg/infra/metrics"
2020
"github.com/grafana/grafana/pkg/infra/usagestats/statscollector"
21-
"github.com/grafana/grafana/pkg/modules"
2221
"github.com/grafana/grafana/pkg/registry"
2322
"github.com/grafana/grafana/pkg/services/accesscontrol"
2423
"github.com/grafana/grafana/pkg/services/provisioning"
@@ -39,15 +38,14 @@ type Options struct {
3938
func New(opts Options, cfg *setting.Cfg, httpServer *api.HTTPServer, roleRegistry accesscontrol.RoleRegistry,
4039
provisioningService provisioning.ProvisioningService, backgroundServiceProvider registry.BackgroundServiceRegistry,
4140
usageStatsProvidersRegistry registry.UsageStatsProvidersRegistry, statsCollectorService *statscollector.Service,
42-
moduleService modules.Engine,
4341
) (*Server, error) {
4442
statsCollectorService.RegisterProviders(usageStatsProvidersRegistry.GetServices())
45-
s, err := newServer(opts, cfg, httpServer, roleRegistry, provisioningService, backgroundServiceProvider, moduleService)
43+
s, err := newServer(opts, cfg, httpServer, roleRegistry, provisioningService, backgroundServiceProvider)
4644
if err != nil {
4745
return nil, err
4846
}
4947

50-
if err := s.init(); err != nil {
48+
if err := s.Init(); err != nil {
5149
return nil, err
5250
}
5351

@@ -56,7 +54,6 @@ func New(opts Options, cfg *setting.Cfg, httpServer *api.HTTPServer, roleRegistr
5654

5755
func newServer(opts Options, cfg *setting.Cfg, httpServer *api.HTTPServer, roleRegistry accesscontrol.RoleRegistry,
5856
provisioningService provisioning.ProvisioningService, backgroundServiceProvider registry.BackgroundServiceRegistry,
59-
moduleService modules.Engine,
6057
) (*Server, error) {
6158
rootCtx, shutdownFn := context.WithCancel(context.Background())
6259
childRoutines, childCtx := errgroup.WithContext(rootCtx)
@@ -76,7 +73,6 @@ func newServer(opts Options, cfg *setting.Cfg, httpServer *api.HTTPServer, roleR
7673
commit: opts.Commit,
7774
buildBranch: opts.BuildBranch,
7875
backgroundServices: backgroundServiceProvider.GetServices(),
79-
moduleService: moduleService,
8076
}
8177

8278
return s, nil
@@ -103,11 +99,10 @@ type Server struct {
10399
HTTPServer *api.HTTPServer
104100
roleRegistry accesscontrol.RoleRegistry
105101
provisioningService provisioning.ProvisioningService
106-
moduleService modules.Engine
107102
}
108103

109-
// init initializes the server and its services.
110-
func (s *Server) init() error {
104+
// Init initializes the server and its services.
105+
func (s *Server) Init() error {
111106
s.mtx.Lock()
112107
defer s.mtx.Unlock()
113108

@@ -120,11 +115,6 @@ func (s *Server) init() error {
120115
return err
121116
}
122117

123-
// Initialize dskit modules.
124-
if err := s.moduleService.Init(s.context); err != nil {
125-
return err
126-
}
127-
128118
if err := metrics.SetEnvironmentInformation(s.cfg.MetricsGrafanaEnvironmentInfo); err != nil {
129119
return err
130120
}
@@ -141,19 +131,10 @@ func (s *Server) init() error {
141131
func (s *Server) Run() error {
142132
defer close(s.shutdownFinished)
143133

144-
if err := s.init(); err != nil {
134+
if err := s.Init(); err != nil {
145135
return err
146136
}
147137

148-
// Start dskit modules.
149-
s.childRoutines.Go(func() error {
150-
err := s.moduleService.Run(s.context)
151-
if err != nil && !errors.Is(err, context.Canceled) {
152-
return err
153-
}
154-
return nil
155-
})
156-
157138
services := s.backgroundServices
158139

159140
// Start background services.
@@ -197,9 +178,6 @@ func (s *Server) Shutdown(ctx context.Context, reason string) error {
197178
var err error
198179
s.shutdownOnce.Do(func() {
199180
s.log.Info("Shutdown started", "reason", reason)
200-
if err := s.moduleService.Shutdown(ctx); err != nil {
201-
s.log.Error("Failed to shutdown modules", "error", err)
202-
}
203181
// Call cancel func to stop background services.
204182
s.shutdownFn()
205183
// Wait for server to shut down

pkg/server/server_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func (s *testService) IsDisabled() bool {
4848

4949
func testServer(t *testing.T, services ...registry.BackgroundService) *Server {
5050
t.Helper()
51-
s, err := newServer(Options{}, setting.NewCfg(), nil, &acimpl.Service{}, nil, backgroundsvcs.NewBackgroundServiceRegistry(services...), &MockModuleService{})
51+
s, err := newServer(Options{}, setting.NewCfg(), nil, &acimpl.Service{}, nil, backgroundsvcs.NewBackgroundServiceRegistry(services...))
5252
require.NoError(t, err)
5353
// Required to skip configuration initialization that causes
5454
// DI errors in this test.

pkg/server/service.go

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package server
2+
3+
import (
4+
"context"
5+
6+
"github.com/grafana/dskit/services"
7+
8+
"github.com/grafana/grafana/pkg/api"
9+
"github.com/grafana/grafana/pkg/setting"
10+
)
11+
12+
type coreService struct {
13+
*services.BasicService
14+
cla setting.CommandLineArgs
15+
opts Options
16+
apiOpts api.ServerOptions
17+
server *Server
18+
}
19+
20+
func NewService(opts Options, apiOpts api.ServerOptions) (*coreService, error) {
21+
s := &coreService{
22+
opts: opts,
23+
apiOpts: apiOpts,
24+
}
25+
s.BasicService = services.NewBasicService(s.start, s.running, s.stop)
26+
return s, nil
27+
}
28+
29+
func (s *coreService) start(_ context.Context) error {
30+
serv, err := Initialize(s.cla, s.opts, s.apiOpts)
31+
if err != nil {
32+
return err
33+
}
34+
s.server = serv
35+
return s.server.Init()
36+
}
37+
38+
func (s *coreService) running(_ context.Context) error {
39+
return s.server.Run()
40+
}
41+
42+
func (s *coreService) stop(failureReason error) error {
43+
return s.server.Shutdown(context.Background(), failureReason.Error())
44+
}

0 commit comments

Comments
 (0)