@@ -8,109 +8,103 @@ import (
8
8
"github.com/grafana/dskit/services"
9
9
10
10
"github.com/grafana/grafana/pkg/infra/log"
11
- "github.com/grafana/grafana/pkg/services/featuremgmt"
12
- "github.com/grafana/grafana/pkg/setting"
13
11
)
14
12
15
13
type Engine interface {
16
- Init (context.Context ) error
17
14
Run (context.Context ) error
18
- Shutdown (context.Context ) error
15
+ Shutdown (context.Context , string ) error
19
16
}
20
17
21
18
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 )
24
21
}
25
22
26
23
var _ Engine = (* service )(nil )
27
24
var _ Manager = (* service )(nil )
28
25
29
26
// service manages the registration and lifecycle of modules.
30
27
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
39
34
}
40
35
41
- func ProvideService (
42
- cfg * setting.Cfg ,
43
- features * featuremgmt.FeatureManager ,
36
+ func New (
37
+ targets []string ,
44
38
) * service {
45
39
logger := log .New ("modules" )
46
40
47
41
return & service {
48
- cfg : cfg ,
49
- log : logger ,
50
- targets : cfg .Target ,
51
- dependencyMap : map [string ][]string {},
42
+ log : logger ,
43
+ targets : targets ,
52
44
53
- ModuleManager : modules .NewManager (logger ),
54
- ServiceMap : map [string ]services.Service {},
45
+ moduleManager : modules .NewManager (logger ),
46
+ serviceMap : map [string ]services.Service {},
55
47
}
56
48
}
57
49
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 {
60
52
var err error
61
53
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 {
64
59
return err
65
60
}
66
61
}
67
62
68
- m .ServiceMap , err = m .ModuleManager .InitModuleServices (m .targets ... )
63
+ m .serviceMap , err = m .moduleManager .InitModuleServices (m .targets ... )
69
64
if err != nil {
70
65
return err
71
66
}
72
67
73
68
// 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 {
75
70
return nil
76
71
}
77
72
78
73
var svcs []services.Service
79
- for _ , s := range m .ServiceMap {
74
+ for _ , s := range m .serviceMap {
80
75
svcs = append (svcs , s )
81
76
}
82
- m .ServiceManager , err = services .NewManager (svcs ... )
83
77
84
- return err
85
- }
78
+ m .serviceManager , err = services .NewManager (svcs ... )
79
+ if err != nil {
80
+ return err
81
+ }
86
82
87
- // Run starts all registered modules.
88
- func (m * service ) Run (ctx context.Context ) error {
89
83
// we don't need to continue if no modules are registered.
90
84
// this behavior may need to change if dskit services replace the
91
85
// current background service registry.
92
- if len (m .ServiceMap ) == 0 {
86
+ if len (m .serviceMap ) == 0 {
93
87
m .log .Warn ("No modules registered..." )
94
88
<- ctx .Done ()
95
89
return nil
96
90
}
97
91
98
92
listener := newServiceListener (m .log , m )
99
- m .ServiceManager .AddListener (listener )
93
+ m .serviceManager .AddListener (listener )
100
94
101
95
m .log .Debug ("Starting module service manager" )
102
96
// wait until a service fails or stop signal was received
103
- err : = m .ServiceManager .StartAsync (ctx )
97
+ err = m .serviceManager .StartAsync (ctx )
104
98
if err != nil {
105
99
return err
106
100
}
107
101
108
- err = m .ServiceManager .AwaitStopped (ctx )
102
+ err = m .serviceManager .AwaitStopped (ctx )
109
103
if err != nil {
110
104
return err
111
105
}
112
106
113
- failed := m .ServiceManager .ServicesByState ()[services .Failed ]
107
+ failed := m .serviceManager .ServicesByState ()[services .Failed ]
114
108
for _ , f := range failed {
115
109
// the service listener will log error details for all modules that failed,
116
110
// so here we return the first error that is not ErrStopProcess
@@ -123,27 +117,27 @@ func (m *service) Run(ctx context.Context) error {
123
117
}
124
118
125
119
// 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 {
128
122
m .log .Debug ("No modules registered, nothing to stop..." )
129
123
return nil
130
124
}
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 )
134
128
}
135
129
130
+ type initFn func () (services.Service , error )
131
+
136
132
// 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 )
140
135
}
141
136
142
137
// RegisterInvisibleModule registers an invisible module with the dskit module manager.
143
138
// 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 )
147
141
}
148
142
149
143
// IsModuleEnabled returns true if the module is enabled.
0 commit comments