Skip to content

Commit a333e8a

Browse files
authored
Background Services: Remove dskitBackgroundServices toggle (grafana#111255)
1 parent 052b6e3 commit a333e8a

File tree

10 files changed

+96
-215
lines changed

10 files changed

+96
-215
lines changed

packages/grafana-data/src/types/featureToggles.gen.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1169,11 +1169,6 @@ export interface FeatureToggles {
11691169
*/
11701170
prometheusTypeMigration?: boolean;
11711171
/**
1172-
* Enables dskit background service wrapper
1173-
* @default false
1174-
*/
1175-
dskitBackgroundServices?: boolean;
1176-
/**
11771172
* Enables running plugins in containers
11781173
* @default false
11791174
*/

pkg/modules/modules.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type Registry interface {
2323
}
2424

2525
type Manager interface {
26+
services.NamedService
2627
Registry
2728
Engine
2829
}

pkg/registry/backgroundsvcs/adapter/manager.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"time"
66

77
"github.com/grafana/dskit/services"
8+
"go.opentelemetry.io/otel/trace"
89

910
"github.com/grafana/grafana/pkg/infra/log"
1011
"github.com/grafana/grafana/pkg/infra/tracing"
@@ -16,7 +17,7 @@ var (
1617
stopTimeout = 30 * time.Second
1718
)
1819

19-
type managerAdapter struct {
20+
type ManagerAdapter struct {
2021
services.NamedService
2122

2223
reg registry.BackgroundServiceRegistry
@@ -32,16 +33,21 @@ type managerAdapter struct {
3233
// - Graceful shutdown with proper cleanup ordering
3334
//
3435
// Services implementing CanBeDisabled that are disabled will be skipped.
35-
func NewManagerAdapter(reg registry.BackgroundServiceRegistry) *managerAdapter {
36-
m := &managerAdapter{
36+
func NewManagerAdapter(reg registry.BackgroundServiceRegistry) *ManagerAdapter {
37+
m := &ManagerAdapter{
3738
reg: reg,
3839
dependencyMap: dependencyMap(),
3940
}
4041
m.NamedService = services.NewBasicService(m.starting, m.running, m.stopping).WithName("backgroundsvcs.managerAdapter")
4142
return m
4243
}
4344

44-
func (m *managerAdapter) starting(ctx context.Context) error {
45+
func (m *ManagerAdapter) WithDependencies(dependencyMap map[string][]string) *ManagerAdapter {
46+
m.dependencyMap = dependencyMap
47+
return m
48+
}
49+
50+
func (m *ManagerAdapter) starting(ctx context.Context) error {
4551
spanCtx, span := tracing.Start(ctx, "backgroundsvcs.managerAdapter.starting")
4652
defer span.End()
4753
logger := log.New("backgroundsvcs.managerAdapter").FromContext(spanCtx)
@@ -76,16 +82,20 @@ func (m *managerAdapter) starting(ctx context.Context) error {
7682
manager.RegisterModule(BackgroundServices, nil)
7783

7884
m.manager = manager
79-
return nil
85+
if err := m.manager.StartAsync(ctx); err != nil {
86+
return err
87+
}
88+
return m.manager.AwaitRunning(ctx)
8089
}
8190

82-
func (m *managerAdapter) running(ctx context.Context) error {
83-
spanCtx, span := tracing.Start(ctx, "backgroundsvcs.managerAdapter.running")
91+
func (m *ManagerAdapter) running(ctx context.Context) error {
92+
newCtx := trace.ContextWithSpan(context.Background(), trace.SpanFromContext(ctx))
93+
spanCtx, span := tracing.Start(newCtx, "backgroundsvcs.managerAdapter.running")
8494
defer span.End()
85-
return m.manager.Run(spanCtx)
95+
return m.manager.AwaitTerminated(spanCtx)
8696
}
8797

88-
func (m *managerAdapter) stopping(failure error) error {
98+
func (m *ManagerAdapter) stopping(failure error) error {
8999
ctx, cancel := context.WithTimeout(context.Background(), stopTimeout)
90100
defer cancel()
91101
spanCtx, span := tracing.Start(ctx, "backgroundsvcs.managerAdapter.stopping")
@@ -98,15 +108,16 @@ func (m *managerAdapter) stopping(failure error) error {
98108
}
99109

100110
// Run initializes and starts all background services using dskit's module and service patterns.
101-
func (m *managerAdapter) Run(ctx context.Context) error {
111+
func (m *ManagerAdapter) Run(ctx context.Context) error {
102112
if err := m.StartAsync(ctx); err != nil {
103113
return err
104114
}
105-
return m.AwaitTerminated(ctx)
115+
stopCtx := trace.ContextWithSpan(context.Background(), trace.SpanFromContext(ctx))
116+
return m.AwaitTerminated(stopCtx)
106117
}
107118

108119
// Shutdown calls calls the underlying manager's Shutdown
109-
func (m *managerAdapter) Shutdown(ctx context.Context, reason string) error {
120+
func (m *ManagerAdapter) Shutdown(ctx context.Context, reason string) error {
110121
m.StopAsync()
111122
return m.AwaitTerminated(ctx)
112123
}

pkg/registry/backgroundsvcs/adapter/manager_test.go

Lines changed: 28 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ func TestNewManagerAdapter(t *testing.T) {
2828
func TestManagerAdapter_Starting(t *testing.T) {
2929
t.Run("empty registry initializes manager", func(t *testing.T) {
3030
reg := &mockBackgroundServiceRegistry{services: []registry.BackgroundService{}}
31-
adapter := NewManagerAdapter(reg)
32-
adapter.dependencyMap = map[string][]string{
33-
BackgroundServices: {},
34-
}
31+
adapter := NewManagerAdapter(reg).WithDependencies(map[string][]string{
32+
BackgroundServices: {Core},
33+
Core: {},
34+
})
3535

3636
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
3737
defer cancel()
@@ -55,10 +55,10 @@ func TestManagerAdapter_Starting(t *testing.T) {
5555
reg := &mockBackgroundServiceRegistry{
5656
services: []registry.BackgroundService{enabledSvc, disabledSvc, namedSvc},
5757
}
58-
adapter := NewManagerAdapter(reg)
59-
adapter.dependencyMap = map[string][]string{
60-
BackgroundServices: {},
61-
}
58+
adapter := NewManagerAdapter(reg).WithDependencies(map[string][]string{
59+
BackgroundServices: {Core},
60+
Core: {},
61+
})
6262

6363
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
6464
defer cancel()
@@ -110,8 +110,11 @@ func TestManagerAdapter_Starting(t *testing.T) {
110110

111111
// Pre-populate the dependency map with the service using the actual service name that will be used
112112
serviceName := "*adapter.mockNamedService"
113-
adapter.dependencyMap[serviceName] = []string{"custom-dependency"}
114-
initialBgDeps := append([]string{}, adapter.dependencyMap[BackgroundServices]...)
113+
adapter.WithDependencies(map[string][]string{
114+
serviceName: {BackgroundServices},
115+
Core: {},
116+
BackgroundServices: {Core},
117+
})
115118

116119
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
117120
defer cancel()
@@ -121,18 +124,20 @@ func TestManagerAdapter_Starting(t *testing.T) {
121124
require.NotNil(t, adapter.manager)
122125

123126
// Verify the existing dependency was not overwritten
124-
require.Equal(t, []string{"custom-dependency"}, adapter.dependencyMap[serviceName])
127+
require.Equal(t, []string{BackgroundServices}, adapter.dependencyMap[serviceName])
125128

126129
// Verify BackgroundServices dependencies were not modified (should not contain the service twice)
127130
finalBgDeps := adapter.dependencyMap[BackgroundServices]
128-
require.Equal(t, initialBgDeps, finalBgDeps)
131+
require.Equal(t, []string{Core}, finalBgDeps)
129132
})
130133

131134
t.Run("service without NamedService interface gets wrapped", func(t *testing.T) {
132-
// Create a service that doesn't implement NamedService
133135
plainSvc := &mockService{}
134136
reg := &mockBackgroundServiceRegistry{services: []registry.BackgroundService{plainSvc}}
135-
adapter := NewManagerAdapter(reg)
137+
adapter := NewManagerAdapter(reg).WithDependencies(map[string][]string{
138+
BackgroundServices: {Core},
139+
Core: {},
140+
})
136141

137142
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
138143
defer cancel()
@@ -151,11 +156,13 @@ func TestManagerAdapter_Starting(t *testing.T) {
151156
})
152157

153158
t.Run("service without CanBeDisabled interface is always enabled", func(t *testing.T) {
154-
// Create a service that doesn't implement CanBeDisabled
155159
simpleSvc := &simpleBackgroundService{}
156160

157161
reg := &mockBackgroundServiceRegistry{services: []registry.BackgroundService{simpleSvc}}
158-
adapter := NewManagerAdapter(reg)
162+
adapter := NewManagerAdapter(reg).WithDependencies(map[string][]string{
163+
BackgroundServices: {Core},
164+
Core: {},
165+
})
159166

160167
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
161168
defer cancel()
@@ -168,36 +175,18 @@ func TestManagerAdapter_Starting(t *testing.T) {
168175
expectedServiceName := reflect.TypeOf(simpleSvc).String()
169176
require.Contains(t, adapter.dependencyMap, expectedServiceName)
170177
})
171-
172-
t.Run("real manager integration test", func(t *testing.T) {
173-
testSvc := &mockService{}
174-
reg := &mockBackgroundServiceRegistry{services: []registry.BackgroundService{testSvc}}
175-
adapter := NewManagerAdapter(reg)
176-
177-
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
178-
defer cancel()
179-
180-
// Use the real manager - this tests actual integration
181-
err := adapter.starting(ctx)
182-
require.NoError(t, err)
183-
require.NotNil(t, adapter.manager)
184-
185-
// Verify the service was registered in dependency map
186-
expectedServiceName := reflect.TypeOf(testSvc).String()
187-
require.Contains(t, adapter.dependencyMap, expectedServiceName)
188-
})
189178
}
190179

191180
func TestManagerAdapter_Running(t *testing.T) {
192-
t.Run("runs with real manager", func(t *testing.T) {
181+
t.Run("runs with manager", func(t *testing.T) {
193182
mock := &mockNamedService{name: "mock"}
194183
reg := &mockBackgroundServiceRegistry{services: []registry.BackgroundService{
195184
mock,
196185
}}
197-
adapter := NewManagerAdapter(reg)
198-
adapter.dependencyMap = map[string][]string{
199-
BackgroundServices: {},
200-
}
186+
adapter := NewManagerAdapter(reg).WithDependencies(map[string][]string{
187+
BackgroundServices: {Core},
188+
Core: {},
189+
})
201190

202191
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
203192
defer cancel()
@@ -208,25 +197,6 @@ func TestManagerAdapter_Running(t *testing.T) {
208197
err = adapter.AwaitRunning(ctx)
209198
require.NoError(t, err)
210199
})
211-
212-
t.Run("running delegates to manager", func(t *testing.T) {
213-
reg := &mockBackgroundServiceRegistry{services: []registry.BackgroundService{}}
214-
adapter := NewManagerAdapter(reg)
215-
216-
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
217-
defer cancel()
218-
219-
// Initialize with real manager
220-
err := adapter.starting(ctx)
221-
require.NoError(t, err)
222-
223-
// Test running method directly - this will likely fail due to missing production modules
224-
// but it covers the running method code path
225-
err = adapter.running(ctx)
226-
if err != nil {
227-
require.Contains(t, err.Error(), "no such module")
228-
}
229-
})
230200
}
231201

232202
func TestManagerAdapter_Stopping(t *testing.T) {
@@ -262,7 +232,6 @@ func TestManagerAdapter_Stopping(t *testing.T) {
262232
ctx, cancel := context.WithTimeout(context.Background(), testTimeout)
263233
defer cancel()
264234

265-
// Initialize the manager first - need to go through starting to initialize manager
266235
err := adapter.starting(ctx)
267236
require.NoError(t, err)
268237
require.NotNil(t, adapter.manager)

0 commit comments

Comments
 (0)