Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/integrations/v2/controller_metricsintegration_test.go
5333 views
1
package integrations
2
3
import (
4
"context"
5
nethttp "net/http"
6
"testing"
7
8
"github.com/go-kit/log"
9
"github.com/grafana/agent/pkg/integrations/v2/autoscrape"
10
"github.com/grafana/agent/pkg/util"
11
"github.com/prometheus/common/model"
12
prom_config "github.com/prometheus/prometheus/config"
13
"github.com/prometheus/prometheus/discovery"
14
"github.com/prometheus/prometheus/discovery/http"
15
"github.com/prometheus/prometheus/discovery/targetgroup"
16
"github.com/stretchr/testify/require"
17
)
18
19
//
20
// Tests for controller's utilization of the MetricsIntegration interface.
21
//
22
23
func Test_controller_MetricsIntegration_Targets(t *testing.T) {
24
integrationWithTarget := func(targetName string) Integration {
25
return mockMetricsIntegration{
26
HTTPIntegration: newWaitStartedIntegration(),
27
TargetsFunc: func(Endpoint) []*targetgroup.Group {
28
return []*targetgroup.Group{{
29
Targets: []model.LabelSet{{model.AddressLabel: model.LabelValue(targetName)}},
30
}}
31
},
32
ScrapeConfigsFunc: func(c discovery.Configs) []*autoscrape.ScrapeConfig { return nil },
33
}
34
}
35
36
integrations := []Config{
37
mockConfigNameTuple(t, "a", "instanceA").WithNewIntegrationFunc(func(l log.Logger, g Globals) (Integration, error) {
38
return integrationWithTarget("a"), nil
39
}),
40
mockConfigNameTuple(t, "b", "instanceB").WithNewIntegrationFunc(func(l log.Logger, g Globals) (Integration, error) {
41
return integrationWithTarget("b"), nil
42
}),
43
}
44
45
// waitIntegrations starts a controller and waits for all of its integrations
46
// to run.
47
waitIntegrations := func(t *testing.T, ctrl *controller) {
48
t.Helper()
49
_ = newSyncController(t, ctrl)
50
err := ctrl.forEachIntegration("/", func(ci *controlledIntegration, _ string) {
51
wsi := ci.i.(mockMetricsIntegration).HTTPIntegration.(*waitStartedIntegration)
52
_ = wsi.trigger.WaitContext(context.Background())
53
})
54
require.NoError(t, err)
55
}
56
57
t.Run("All", func(t *testing.T) {
58
ctrl, err := newController(
59
util.TestLogger(t),
60
controllerConfig(integrations),
61
Globals{},
62
)
63
require.NoError(t, err)
64
waitIntegrations(t, ctrl)
65
66
result := ctrl.Targets(Endpoint{Prefix: "/"}, TargetOptions{})
67
expect := []*targetGroup{
68
{Targets: []model.LabelSet{{model.AddressLabel: "a"}}},
69
{Targets: []model.LabelSet{{model.AddressLabel: "b"}}},
70
}
71
require.Equal(t, expect, result)
72
})
73
74
t.Run("All by Integration", func(t *testing.T) {
75
ctrl, err := newController(
76
util.TestLogger(t),
77
controllerConfig(integrations),
78
Globals{},
79
)
80
require.NoError(t, err)
81
waitIntegrations(t, ctrl)
82
83
result := ctrl.Targets(Endpoint{Prefix: "/"}, TargetOptions{
84
Integrations: []string{"a", "b"},
85
})
86
expect := []*targetGroup{
87
{Targets: []model.LabelSet{{model.AddressLabel: "a"}}},
88
{Targets: []model.LabelSet{{model.AddressLabel: "b"}}},
89
}
90
require.Equal(t, expect, result)
91
})
92
93
t.Run("Specific Integration", func(t *testing.T) {
94
ctrl, err := newController(
95
util.TestLogger(t),
96
controllerConfig(integrations),
97
Globals{},
98
)
99
require.NoError(t, err)
100
waitIntegrations(t, ctrl)
101
102
result := ctrl.Targets(Endpoint{Prefix: "/"}, TargetOptions{
103
Integrations: []string{"a"},
104
})
105
expect := []*targetGroup{
106
{Targets: []model.LabelSet{{model.AddressLabel: "a"}}},
107
}
108
require.Equal(t, expect, result)
109
})
110
}
111
112
func Test_controller_MetricsIntegration_ScrapeConfig(t *testing.T) {
113
integrationWithTarget := func(targetName string) Integration {
114
return mockMetricsIntegration{
115
HTTPIntegration: NoOpIntegration,
116
ScrapeConfigsFunc: func(c discovery.Configs) []*autoscrape.ScrapeConfig {
117
return []*autoscrape.ScrapeConfig{{
118
Instance: "default",
119
Config: prom_config.ScrapeConfig{JobName: targetName},
120
}}
121
},
122
}
123
}
124
125
integrations := []Config{
126
mockConfigNameTuple(t, "a", "instanceA").WithNewIntegrationFunc(func(l log.Logger, g Globals) (Integration, error) {
127
return integrationWithTarget("a"), nil
128
}),
129
mockConfigNameTuple(t, "b", "instanceB").WithNewIntegrationFunc(func(l log.Logger, g Globals) (Integration, error) {
130
return integrationWithTarget("b"), nil
131
}),
132
}
133
134
ctrl, err := newController(
135
util.TestLogger(t),
136
controllerConfig(integrations),
137
Globals{},
138
)
139
require.NoError(t, err)
140
_ = newSyncController(t, ctrl)
141
142
result := ctrl.ScrapeConfigs("/", &http.DefaultSDConfig)
143
expect := []*autoscrape.ScrapeConfig{
144
{Instance: "default", Config: prom_config.ScrapeConfig{JobName: "a"}},
145
{Instance: "default", Config: prom_config.ScrapeConfig{JobName: "b"}},
146
}
147
require.Equal(t, expect, result)
148
}
149
150
//
151
// Tests for controller's utilization of the MetricsIntegration interface.
152
//
153
154
type waitStartedIntegration struct {
155
trigger *util.WaitTrigger
156
}
157
158
func newWaitStartedIntegration() *waitStartedIntegration {
159
return &waitStartedIntegration{trigger: util.NewWaitTrigger()}
160
}
161
162
func (i *waitStartedIntegration) RunIntegration(ctx context.Context) error {
163
i.trigger.Trigger()
164
<-ctx.Done()
165
return nil
166
}
167
168
func (i *waitStartedIntegration) Handler(prefix string) (nethttp.Handler, error) {
169
return nil, nil
170
}
171
172
type mockMetricsIntegration struct {
173
HTTPIntegration
174
TargetsFunc func(ep Endpoint) []*targetgroup.Group
175
ScrapeConfigsFunc func(discovery.Configs) []*autoscrape.ScrapeConfig
176
}
177
178
func (m mockMetricsIntegration) Targets(ep Endpoint) []*targetgroup.Group {
179
return m.TargetsFunc(ep)
180
}
181
182
func (m mockMetricsIntegration) ScrapeConfigs(cfgs discovery.Configs) []*autoscrape.ScrapeConfig {
183
return m.ScrapeConfigsFunc(cfgs)
184
}
185
186