Path: blob/main/pkg/integrations/v2/controller_metricsintegration_test.go
5333 views
package integrations12import (3"context"4nethttp "net/http"5"testing"67"github.com/go-kit/log"8"github.com/grafana/agent/pkg/integrations/v2/autoscrape"9"github.com/grafana/agent/pkg/util"10"github.com/prometheus/common/model"11prom_config "github.com/prometheus/prometheus/config"12"github.com/prometheus/prometheus/discovery"13"github.com/prometheus/prometheus/discovery/http"14"github.com/prometheus/prometheus/discovery/targetgroup"15"github.com/stretchr/testify/require"16)1718//19// Tests for controller's utilization of the MetricsIntegration interface.20//2122func Test_controller_MetricsIntegration_Targets(t *testing.T) {23integrationWithTarget := func(targetName string) Integration {24return mockMetricsIntegration{25HTTPIntegration: newWaitStartedIntegration(),26TargetsFunc: func(Endpoint) []*targetgroup.Group {27return []*targetgroup.Group{{28Targets: []model.LabelSet{{model.AddressLabel: model.LabelValue(targetName)}},29}}30},31ScrapeConfigsFunc: func(c discovery.Configs) []*autoscrape.ScrapeConfig { return nil },32}33}3435integrations := []Config{36mockConfigNameTuple(t, "a", "instanceA").WithNewIntegrationFunc(func(l log.Logger, g Globals) (Integration, error) {37return integrationWithTarget("a"), nil38}),39mockConfigNameTuple(t, "b", "instanceB").WithNewIntegrationFunc(func(l log.Logger, g Globals) (Integration, error) {40return integrationWithTarget("b"), nil41}),42}4344// waitIntegrations starts a controller and waits for all of its integrations45// to run.46waitIntegrations := func(t *testing.T, ctrl *controller) {47t.Helper()48_ = newSyncController(t, ctrl)49err := ctrl.forEachIntegration("/", func(ci *controlledIntegration, _ string) {50wsi := ci.i.(mockMetricsIntegration).HTTPIntegration.(*waitStartedIntegration)51_ = wsi.trigger.WaitContext(context.Background())52})53require.NoError(t, err)54}5556t.Run("All", func(t *testing.T) {57ctrl, err := newController(58util.TestLogger(t),59controllerConfig(integrations),60Globals{},61)62require.NoError(t, err)63waitIntegrations(t, ctrl)6465result := ctrl.Targets(Endpoint{Prefix: "/"}, TargetOptions{})66expect := []*targetGroup{67{Targets: []model.LabelSet{{model.AddressLabel: "a"}}},68{Targets: []model.LabelSet{{model.AddressLabel: "b"}}},69}70require.Equal(t, expect, result)71})7273t.Run("All by Integration", func(t *testing.T) {74ctrl, err := newController(75util.TestLogger(t),76controllerConfig(integrations),77Globals{},78)79require.NoError(t, err)80waitIntegrations(t, ctrl)8182result := ctrl.Targets(Endpoint{Prefix: "/"}, TargetOptions{83Integrations: []string{"a", "b"},84})85expect := []*targetGroup{86{Targets: []model.LabelSet{{model.AddressLabel: "a"}}},87{Targets: []model.LabelSet{{model.AddressLabel: "b"}}},88}89require.Equal(t, expect, result)90})9192t.Run("Specific Integration", func(t *testing.T) {93ctrl, err := newController(94util.TestLogger(t),95controllerConfig(integrations),96Globals{},97)98require.NoError(t, err)99waitIntegrations(t, ctrl)100101result := ctrl.Targets(Endpoint{Prefix: "/"}, TargetOptions{102Integrations: []string{"a"},103})104expect := []*targetGroup{105{Targets: []model.LabelSet{{model.AddressLabel: "a"}}},106}107require.Equal(t, expect, result)108})109}110111func Test_controller_MetricsIntegration_ScrapeConfig(t *testing.T) {112integrationWithTarget := func(targetName string) Integration {113return mockMetricsIntegration{114HTTPIntegration: NoOpIntegration,115ScrapeConfigsFunc: func(c discovery.Configs) []*autoscrape.ScrapeConfig {116return []*autoscrape.ScrapeConfig{{117Instance: "default",118Config: prom_config.ScrapeConfig{JobName: targetName},119}}120},121}122}123124integrations := []Config{125mockConfigNameTuple(t, "a", "instanceA").WithNewIntegrationFunc(func(l log.Logger, g Globals) (Integration, error) {126return integrationWithTarget("a"), nil127}),128mockConfigNameTuple(t, "b", "instanceB").WithNewIntegrationFunc(func(l log.Logger, g Globals) (Integration, error) {129return integrationWithTarget("b"), nil130}),131}132133ctrl, err := newController(134util.TestLogger(t),135controllerConfig(integrations),136Globals{},137)138require.NoError(t, err)139_ = newSyncController(t, ctrl)140141result := ctrl.ScrapeConfigs("/", &http.DefaultSDConfig)142expect := []*autoscrape.ScrapeConfig{143{Instance: "default", Config: prom_config.ScrapeConfig{JobName: "a"}},144{Instance: "default", Config: prom_config.ScrapeConfig{JobName: "b"}},145}146require.Equal(t, expect, result)147}148149//150// Tests for controller's utilization of the MetricsIntegration interface.151//152153type waitStartedIntegration struct {154trigger *util.WaitTrigger155}156157func newWaitStartedIntegration() *waitStartedIntegration {158return &waitStartedIntegration{trigger: util.NewWaitTrigger()}159}160161func (i *waitStartedIntegration) RunIntegration(ctx context.Context) error {162i.trigger.Trigger()163<-ctx.Done()164return nil165}166167func (i *waitStartedIntegration) Handler(prefix string) (nethttp.Handler, error) {168return nil, nil169}170171type mockMetricsIntegration struct {172HTTPIntegration173TargetsFunc func(ep Endpoint) []*targetgroup.Group174ScrapeConfigsFunc func(discovery.Configs) []*autoscrape.ScrapeConfig175}176177func (m mockMetricsIntegration) Targets(ep Endpoint) []*targetgroup.Group {178return m.TargetsFunc(ep)179}180181func (m mockMetricsIntegration) ScrapeConfigs(cfgs discovery.Configs) []*autoscrape.ScrapeConfig {182return m.ScrapeConfigsFunc(cfgs)183}184185186