Path: blob/main/pkg/integrations/v2/autoscrape/autoscrape_test.go
5363 views
package autoscrape12import (3"context"4"net/http/httptest"5"testing"6"time"78"github.com/grafana/agent/pkg/metrics/instance"9"github.com/grafana/agent/pkg/util"10"github.com/prometheus/client_golang/prometheus/promhttp"11"github.com/prometheus/common/model"12prom_config "github.com/prometheus/prometheus/config"13"github.com/prometheus/prometheus/discovery"14"github.com/prometheus/prometheus/model/exemplar"15"github.com/prometheus/prometheus/model/histogram"16"github.com/prometheus/prometheus/model/labels"17"github.com/prometheus/prometheus/model/metadata"18"github.com/prometheus/prometheus/storage"19"github.com/stretchr/testify/assert"20"github.com/stretchr/testify/require"21"go.uber.org/atomic"22)2324// TestAutoscrape is a basic end-to-end test of the autoscraper.25func TestAutoscrape(t *testing.T) {26srv := httptest.NewServer(promhttp.Handler())27defer srv.Close()2829wt := util.NewWaitTrigger()3031noop := noOpAppender32noop.AppendFunc = func(ref storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error) {33wt.Trigger()34return noOpAppender.AppendFunc(ref, l, t, v)35}3637im := instance.MockManager{38GetInstanceFunc: func(name string) (instance.ManagedInstance, error) {39assert.Equal(t, t.Name(), name)40return &mockInstance{app: &noop}, nil41},42}43as := NewScraper(util.TestLogger(t), im, nil)44defer as.Stop()4546err := as.ApplyConfig([]*ScrapeConfig{{47Instance: t.Name(),48Config: func() prom_config.ScrapeConfig {49cfg := prom_config.DefaultScrapeConfig50cfg.JobName = t.Name()51cfg.ScrapeInterval = model.Duration(time.Second)52cfg.ScrapeTimeout = model.Duration(time.Second / 2)53cfg.ServiceDiscoveryConfigs = discovery.Configs{54discovery.StaticConfig{{55Targets: []model.LabelSet{{56model.AddressLabel: model.LabelValue(srv.Listener.Addr().String()),57}},58Source: t.Name(),59}},60}61return cfg62}(),63}})64require.NoError(t, err, "failed to apply configs")6566// NOTE(rfratto): SD won't start sending targets until after 5 seconds. We'll67// need to at least wait that long.68time.Sleep(5 * time.Second)6970require.NoError(t, wt.Wait(5*time.Second), "timed out waiting for scrape")71}7273var globalRef atomic.Uint6474var noOpAppender = mockAppender{75AppendFunc: func(ref storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error) {76return storage.SeriesRef(globalRef.Inc()), nil77},78CommitFunc: func() error { return nil },79RollbackFunc: func() error { return nil },80AppendExemplarFunc: func(ref storage.SeriesRef, l labels.Labels, e exemplar.Exemplar) (storage.SeriesRef, error) {81return storage.SeriesRef(globalRef.Inc()), nil82},83AppendHistogramFunc: func(ref storage.SeriesRef, l labels.Labels, t int64, h *histogram.Histogram, fh *histogram.FloatHistogram) (storage.SeriesRef, error) {84return storage.SeriesRef(globalRef.Inc()), nil85},86}8788type mockAppender struct {89AppendFunc func(ref storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error)90CommitFunc func() error91RollbackFunc func() error92AppendExemplarFunc func(ref storage.SeriesRef, l labels.Labels, e exemplar.Exemplar) (storage.SeriesRef, error)93UpdateMetadataFunc func(ref storage.SeriesRef, l labels.Labels, m metadata.Metadata) (storage.SeriesRef, error)94AppendHistogramFunc func(ref storage.SeriesRef, l labels.Labels, t int64, h *histogram.Histogram, fh *histogram.FloatHistogram) (storage.SeriesRef, error)95}9697func (ma *mockAppender) Append(ref storage.SeriesRef, l labels.Labels, t int64, v float64) (storage.SeriesRef, error) {98return ma.AppendFunc(ref, l, t, v)99}100func (ma *mockAppender) Commit() error { return ma.CommitFunc() }101func (ma *mockAppender) Rollback() error { return ma.RollbackFunc() }102func (ma *mockAppender) AppendExemplar(ref storage.SeriesRef, l labels.Labels, e exemplar.Exemplar) (storage.SeriesRef, error) {103return ma.AppendExemplarFunc(ref, l, e)104}105func (ma *mockAppender) UpdateMetadata(ref storage.SeriesRef, l labels.Labels, m metadata.Metadata) (storage.SeriesRef, error) {106return ma.UpdateMetadataFunc(ref, l, m)107}108func (ma *mockAppender) AppendHistogram(ref storage.SeriesRef, l labels.Labels, t int64, h *histogram.Histogram, fh *histogram.FloatHistogram) (storage.SeriesRef, error) {109return ma.AppendHistogramFunc(ref, l, t, h, fh)110}111112type mockInstance struct {113instance.NoOpInstance114app storage.Appender115}116117func (mi *mockInstance) Appender(ctx context.Context) storage.Appender { return mi.app }118119120