Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/metrics/instance/manager_test.go
4094 views
1
package instance
2
3
import (
4
"context"
5
"fmt"
6
"os"
7
"testing"
8
9
"github.com/go-kit/log"
10
"github.com/prometheus/prometheus/scrape"
11
"github.com/prometheus/prometheus/storage"
12
"github.com/stretchr/testify/require"
13
)
14
15
func TestBasicManager_ApplyConfig(t *testing.T) {
16
logger := log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
17
18
baseMock := mockInstance{
19
RunFunc: func(ctx context.Context) error {
20
logger.Log("msg", "starting an instance")
21
<-ctx.Done()
22
return nil
23
},
24
UpdateFunc: func(c Config) error {
25
return nil
26
},
27
TargetsActiveFunc: func() map[string][]*scrape.Target {
28
return nil
29
},
30
}
31
32
t.Run("dynamic update successful", func(t *testing.T) {
33
spawnedCount := 0
34
spawner := func(c Config) (ManagedInstance, error) {
35
spawnedCount++
36
37
newMock := baseMock
38
return &newMock, nil
39
}
40
41
cm := NewBasicManager(DefaultBasicManagerConfig, logger, spawner)
42
43
for i := 0; i < 10; i++ {
44
err := cm.ApplyConfig(Config{Name: "test"})
45
require.NoError(t, err)
46
}
47
48
require.Equal(t, 1, spawnedCount)
49
})
50
51
t.Run("dynamic update unsuccessful", func(t *testing.T) {
52
spawnedCount := 0
53
spawner := func(c Config) (ManagedInstance, error) {
54
spawnedCount++
55
56
newMock := baseMock
57
newMock.UpdateFunc = func(c Config) error {
58
return ErrInvalidUpdate{
59
Inner: fmt.Errorf("cannot dynamically update for testing reasons"),
60
}
61
}
62
return &newMock, nil
63
}
64
65
cm := NewBasicManager(DefaultBasicManagerConfig, logger, spawner)
66
67
for i := 0; i < 10; i++ {
68
err := cm.ApplyConfig(Config{Name: "test"})
69
require.NoError(t, err)
70
}
71
72
require.Equal(t, 10, spawnedCount)
73
})
74
75
t.Run("dynamic update errored", func(t *testing.T) {
76
spawnedCount := 0
77
spawner := func(c Config) (ManagedInstance, error) {
78
spawnedCount++
79
80
newMock := baseMock
81
newMock.UpdateFunc = func(c Config) error {
82
return fmt.Errorf("something really bad happened")
83
}
84
return &newMock, nil
85
}
86
87
cm := NewBasicManager(DefaultBasicManagerConfig, logger, spawner)
88
89
// Creation should succeed
90
err := cm.ApplyConfig(Config{Name: "test"})
91
require.NoError(t, err)
92
93
// ...but the update should fail
94
err = cm.ApplyConfig(Config{Name: "test"})
95
require.Error(t, err, "something really bad happened")
96
require.Equal(t, 1, spawnedCount)
97
})
98
}
99
100
type mockInstance struct {
101
RunFunc func(ctx context.Context) error
102
ReadyFunc func() bool
103
UpdateFunc func(c Config) error
104
TargetsActiveFunc func() map[string][]*scrape.Target
105
StorageDirectoryFunc func() string
106
AppenderFunc func() storage.Appender
107
}
108
109
func (m mockInstance) Run(ctx context.Context) error {
110
if m.RunFunc != nil {
111
return m.RunFunc(ctx)
112
}
113
panic("RunFunc not provided")
114
}
115
116
func (m mockInstance) Ready() bool {
117
if m.ReadyFunc != nil {
118
return m.ReadyFunc()
119
}
120
panic("ReadyFunc not provided")
121
}
122
123
func (m mockInstance) Update(c Config) error {
124
if m.UpdateFunc != nil {
125
return m.UpdateFunc(c)
126
}
127
panic("UpdateFunc not provided")
128
}
129
130
func (m mockInstance) TargetsActive() map[string][]*scrape.Target {
131
if m.TargetsActiveFunc != nil {
132
return m.TargetsActiveFunc()
133
}
134
panic("TargetsActiveFunc not provided")
135
}
136
137
func (m mockInstance) StorageDirectory() string {
138
if m.StorageDirectoryFunc != nil {
139
return m.StorageDirectoryFunc()
140
}
141
panic("StorageDirectoryFunc not provided")
142
}
143
144
func (m mockInstance) Appender(_ context.Context) storage.Appender {
145
if m.AppenderFunc != nil {
146
return m.AppenderFunc()
147
}
148
panic("AppenderFunc not provided")
149
}
150
151