From 4bf9c6bb82d7d81c010e698064df7b54e195d4d6 Mon Sep 17 00:00:00 2001 From: gotjosh Date: Wed, 4 Dec 2019 11:08:21 +0000 Subject: [PATCH] Allow targets to be injected as arguments when creating a testTargetRetriever Previously, the struct `testTargetRetriever` had hardcoded active and dropped targets. This made it difficult to change the target information depending on the test case. This change introduces a way to define them as arguments and pass it to a constructor for building. It lays a foundation for dynamically defining targets with various set of arguments to test different scenarios. Signed-off-by: gotjosh --- web/api/v1/api_test.go | 179 +++++++++++++++++++++++++++++++---------- 1 file changed, 136 insertions(+), 43 deletions(-) diff --git a/web/api/v1/api_test.go b/web/api/v1/api_test.go index 13bce6cfa0..7bd4087ee4 100644 --- a/web/api/v1/api_test.go +++ b/web/api/v1/api_test.go @@ -55,55 +55,62 @@ import ( "github.com/prometheus/prometheus/util/testutil" ) -type testTargetRetriever struct{} +type testTargetRetriever struct { + activeTargets map[string][]*scrape.Target + droppedTargets map[string][]*scrape.Target +} + +type testTargetParams struct { + Identifier string + Labels []labels.Label + DiscoveredLabels []labels.Label + Params url.Values + Reports []*testReport + Active bool +} + +type testReport struct { + Start time.Time + Duration time.Duration + Error error +} + +func newTestTargetRetriever(targetsInfo []*testTargetParams) *testTargetRetriever { + var activeTargets map[string][]*scrape.Target + var droppedTargets map[string][]*scrape.Target + activeTargets = make(map[string][]*scrape.Target) + droppedTargets = make(map[string][]*scrape.Target) + + for _, t := range targetsInfo { + nt := scrape.NewTarget(t.Labels, t.DiscoveredLabels, t.Params) + + for _, r := range t.Reports { + nt.Report(r.Start, r.Duration, r.Error) + } + + if t.Active { + activeTargets[t.Identifier] = []*scrape.Target{nt} + } else { + droppedTargets[t.Identifier] = []*scrape.Target{nt} + } + } + + return &testTargetRetriever{ + activeTargets: activeTargets, + droppedTargets: droppedTargets, + } +} var ( scrapeStart = time.Now().Add(-11 * time.Second) ) func (t testTargetRetriever) TargetsActive() map[string][]*scrape.Target { - testTarget := scrape.NewTarget( - labels.FromMap(map[string]string{ - model.SchemeLabel: "http", - model.AddressLabel: "example.com:8080", - model.MetricsPathLabel: "/metrics", - model.JobLabel: "test", - }), - nil, - url.Values{}, - ) - testTarget.Report(scrapeStart, 70*time.Millisecond, nil) - blackboxTarget := scrape.NewTarget( - labels.FromMap(map[string]string{ - model.SchemeLabel: "http", - model.AddressLabel: "localhost:9115", - model.MetricsPathLabel: "/probe", - model.JobLabel: "blackbox", - }), - nil, - url.Values{"target": []string{"example.com"}}, - ) - blackboxTarget.Report(scrapeStart, 100*time.Millisecond, errors.New("failed")) - return map[string][]*scrape.Target{ - "test": {testTarget}, - "blackbox": {blackboxTarget}, - } + return t.activeTargets } + func (t testTargetRetriever) TargetsDropped() map[string][]*scrape.Target { - return map[string][]*scrape.Target{ - "blackbox": { - scrape.NewTarget( - nil, - labels.FromMap(map[string]string{ - model.AddressLabel: "http://dropped.example.com:9115", - model.MetricsPathLabel: "/probe", - model.SchemeLabel: "http", - model.JobLabel: "blackbox", - }), - url.Values{}, - ), - }, - } + return t.droppedTargets } type testAlertmanagerRetriever struct{} @@ -243,10 +250,53 @@ func TestEndpoints(t *testing.T) { algr.RuleGroups() + targets := []*testTargetParams{ + { + Identifier: "test", + Labels: labels.FromMap(map[string]string{ + model.SchemeLabel: "http", + model.AddressLabel: "example.com:8080", + model.MetricsPathLabel: "/metrics", + model.JobLabel: "test", + }), + DiscoveredLabels: nil, + Params: url.Values{}, + Reports: []*testReport{{scrapeStart, 70 * time.Millisecond, nil}}, + Active: true, + }, + { + Identifier: "blackbox", + Labels: labels.FromMap(map[string]string{ + model.SchemeLabel: "http", + model.AddressLabel: "localhost:9115", + model.MetricsPathLabel: "/probe", + model.JobLabel: "blackbox", + }), + DiscoveredLabels: nil, + Params: url.Values{"target": []string{"example.com"}}, + Reports: []*testReport{{scrapeStart, 100 * time.Millisecond, errors.New("failed")}}, + Active: true, + }, + { + Identifier: "blackbox", + Labels: nil, + DiscoveredLabels: labels.FromMap(map[string]string{ + model.SchemeLabel: "http", + model.AddressLabel: "http://dropped.example.com:9115", + model.MetricsPathLabel: "/probe", + model.JobLabel: "blackbox", + }), + Params: url.Values{}, + Active: false, + }, + } + + testTargetRetriever := newTestTargetRetriever(targets) + api := &API{ Queryable: suite.Storage(), QueryEngine: suite.QueryEngine(), - targetRetriever: testTargetRetriever{}, + targetRetriever: testTargetRetriever, alertmanagerRetriever: testAlertmanagerRetriever{}, flagsMap: sampleFlagMap, now: func() time.Time { return now }, @@ -305,10 +355,53 @@ func TestEndpoints(t *testing.T) { algr.RuleGroups() + targets := []*testTargetParams{ + { + Identifier: "test", + Labels: labels.FromMap(map[string]string{ + model.SchemeLabel: "http", + model.AddressLabel: "example.com:8080", + model.MetricsPathLabel: "/metrics", + model.JobLabel: "test", + }), + DiscoveredLabels: nil, + Params: url.Values{}, + Reports: []*testReport{{scrapeStart, 70 * time.Millisecond, nil}}, + Active: true, + }, + { + Identifier: "blackbox", + Labels: labels.FromMap(map[string]string{ + model.SchemeLabel: "http", + model.AddressLabel: "localhost:9115", + model.MetricsPathLabel: "/probe", + model.JobLabel: "blackbox", + }), + DiscoveredLabels: nil, + Params: url.Values{"target": []string{"example.com"}}, + Reports: []*testReport{{scrapeStart, 100 * time.Millisecond, errors.New("failed")}}, + Active: true, + }, + { + Identifier: "blackbox", + Labels: nil, + DiscoveredLabels: labels.FromMap(map[string]string{ + model.SchemeLabel: "http", + model.AddressLabel: "http://dropped.example.com:9115", + model.MetricsPathLabel: "/probe", + model.JobLabel: "blackbox", + }), + Params: url.Values{}, + Active: false, + }, + } + + testTargetRetriever := newTestTargetRetriever(targets) + api := &API{ Queryable: remote, QueryEngine: suite.QueryEngine(), - targetRetriever: testTargetRetriever{}, + targetRetriever: testTargetRetriever, alertmanagerRetriever: testAlertmanagerRetriever{}, flagsMap: sampleFlagMap, now: func() time.Time { return now },