Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/pkg/integrations/v2/autoscrape/autoscrape_test.go
5363 views
1
package autoscrape
2
3
import (
4
"context"
5
"net/http/httptest"
6
"testing"
7
"time"
8
9
"github.com/grafana/agent/pkg/metrics/instance"
10
"github.com/grafana/agent/pkg/util"
11
"github.com/prometheus/client_golang/prometheus/promhttp"
12
"github.com/prometheus/common/model"
13
prom_config "github.com/prometheus/prometheus/config"
14
"github.com/prometheus/prometheus/discovery"
15
"github.com/prometheus/prometheus/model/exemplar"
16
"github.com/prometheus/prometheus/model/histogram"
17
"github.com/prometheus/prometheus/model/labels"
18
"github.com/prometheus/prometheus/model/metadata"
19
"github.com/prometheus/prometheus/storage"
20
"github.com/stretchr/testify/assert"
21
"github.com/stretchr/testify/require"
22
"go.uber.org/atomic"
23
)
24
25
// TestAutoscrape is a basic end-to-end test of the autoscraper.
26
func TestAutoscrape(t *testing.T) {
27
srv := httptest.NewServer(promhttp.Handler())
28
defer srv.Close()
29
30
wt := util.NewWaitTrigger()
31
32
noop := noOpAppender
33
noop.AppendFunc = func(ref storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error) {
34
wt.Trigger()
35
return noOpAppender.AppendFunc(ref, l, t, v)
36
}
37
38
im := instance.MockManager{
39
GetInstanceFunc: func(name string) (instance.ManagedInstance, error) {
40
assert.Equal(t, t.Name(), name)
41
return &mockInstance{app: &noop}, nil
42
},
43
}
44
as := NewScraper(util.TestLogger(t), im, nil)
45
defer as.Stop()
46
47
err := as.ApplyConfig([]*ScrapeConfig{{
48
Instance: t.Name(),
49
Config: func() prom_config.ScrapeConfig {
50
cfg := prom_config.DefaultScrapeConfig
51
cfg.JobName = t.Name()
52
cfg.ScrapeInterval = model.Duration(time.Second)
53
cfg.ScrapeTimeout = model.Duration(time.Second / 2)
54
cfg.ServiceDiscoveryConfigs = discovery.Configs{
55
discovery.StaticConfig{{
56
Targets: []model.LabelSet{{
57
model.AddressLabel: model.LabelValue(srv.Listener.Addr().String()),
58
}},
59
Source: t.Name(),
60
}},
61
}
62
return cfg
63
}(),
64
}})
65
require.NoError(t, err, "failed to apply configs")
66
67
// NOTE(rfratto): SD won't start sending targets until after 5 seconds. We'll
68
// need to at least wait that long.
69
time.Sleep(5 * time.Second)
70
71
require.NoError(t, wt.Wait(5*time.Second), "timed out waiting for scrape")
72
}
73
74
var globalRef atomic.Uint64
75
var noOpAppender = mockAppender{
76
AppendFunc: func(ref storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error) {
77
return storage.SeriesRef(globalRef.Inc()), nil
78
},
79
CommitFunc: func() error { return nil },
80
RollbackFunc: func() error { return nil },
81
AppendExemplarFunc: func(ref storage.SeriesRef, l labels.Labels, e exemplar.Exemplar) (storage.SeriesRef, error) {
82
return storage.SeriesRef(globalRef.Inc()), nil
83
},
84
AppendHistogramFunc: func(ref storage.SeriesRef, l labels.Labels, t int64, h *histogram.Histogram, fh *histogram.FloatHistogram) (storage.SeriesRef, error) {
85
return storage.SeriesRef(globalRef.Inc()), nil
86
},
87
}
88
89
type mockAppender struct {
90
AppendFunc func(ref storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error)
91
CommitFunc func() error
92
RollbackFunc func() error
93
AppendExemplarFunc func(ref storage.SeriesRef, l labels.Labels, e exemplar.Exemplar) (storage.SeriesRef, error)
94
UpdateMetadataFunc func(ref storage.SeriesRef, l labels.Labels, m metadata.Metadata) (storage.SeriesRef, error)
95
AppendHistogramFunc func(ref storage.SeriesRef, l labels.Labels, t int64, h *histogram.Histogram, fh *histogram.FloatHistogram) (storage.SeriesRef, error)
96
}
97
98
func (ma *mockAppender) Append(ref storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error) {
99
return ma.AppendFunc(ref, l, t, v)
100
}
101
func (ma *mockAppender) Commit() error { return ma.CommitFunc() }
102
func (ma *mockAppender) Rollback() error { return ma.RollbackFunc() }
103
func (ma *mockAppender) AppendExemplar(ref storage.SeriesRef, l labels.Labels, e exemplar.Exemplar) (storage.SeriesRef, error) {
104
return ma.AppendExemplarFunc(ref, l, e)
105
}
106
func (ma *mockAppender) UpdateMetadata(ref storage.SeriesRef, l labels.Labels, m metadata.Metadata) (storage.SeriesRef, error) {
107
return ma.UpdateMetadataFunc(ref, l, m)
108
}
109
func (ma *mockAppender) AppendHistogram(ref storage.SeriesRef, l labels.Labels, t int64, h *histogram.Histogram, fh *histogram.FloatHistogram) (storage.SeriesRef, error) {
110
return ma.AppendHistogramFunc(ref, l, t, h, fh)
111
}
112
113
type mockInstance struct {
114
instance.NoOpInstance
115
app storage.Appender
116
}
117
118
func (mi *mockInstance) Appender(ctx context.Context) storage.Appender { return mi.app }
119
120