diff --git a/pkg/model/timeduration.go b/pkg/model/timeduration.go index bbe766043f..a40a6a78f4 100644 --- a/pkg/model/timeduration.go +++ b/pkg/model/timeduration.go @@ -42,7 +42,7 @@ func (tdv *TimeOrDurationValue) Set(s string) error { return nil } -// String returns either tume or duration. +// String returns either time or duration. func (tdv *TimeOrDurationValue) String() string { switch { case tdv.Time != nil: diff --git a/pkg/store/prometheus.go b/pkg/store/prometheus.go index 41fa52e3e6..976b33f47f 100644 --- a/pkg/store/prometheus.go +++ b/pkg/store/prometheus.go @@ -12,8 +12,10 @@ import ( "net/url" "path" "sort" + "strconv" "strings" "sync" + "time" "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" @@ -23,6 +25,7 @@ import ( "github.com/pkg/errors" "github.com/prometheus/common/version" "github.com/prometheus/prometheus/pkg/labels" + "github.com/prometheus/prometheus/pkg/timestamp" "github.com/prometheus/prometheus/prompb" "github.com/prometheus/prometheus/storage/remote" "github.com/prometheus/prometheus/tsdb/chunkenc" @@ -663,9 +666,9 @@ func (p *PrometheusStore) seriesLabels(ctx context.Context, matchers []storepb.L } q.Add("match[]", metric) + q.Add("start", formatTime(timestamp.Time(startTime))) + q.Add("end", formatTime(timestamp.Time(endTime))) u.RawQuery = q.Encode() - q.Add("start", string(startTime)) - q.Add("end", string(endTime)) req, err := http.NewRequest("GET", u.String(), nil) if err != nil { @@ -715,3 +718,7 @@ func (p *PrometheusStore) seriesLabels(ctx context.Context, matchers []storepb.L return m.Data, nil } + +func formatTime(t time.Time) string { + return strconv.FormatFloat(float64(t.Unix())+float64(t.Nanosecond())/1e9, 'f', -1, 64) +} diff --git a/pkg/store/prometheus_test.go b/pkg/store/prometheus_test.go index bf6fee5cc7..a3adf05218 100644 --- a/pkg/store/prometheus_test.go +++ b/pkg/store/prometheus_test.go @@ -199,6 +199,8 @@ func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { testutil.Ok(t, err) _, err = a.Add(labels.FromStrings("a", "d", "job", "test"), baseT+300, 3) testutil.Ok(t, err) + _, err = a.Add(labels.FromStrings("job", "test"), baseT+400, 4) + testutil.Ok(t, err) testutil.Ok(t, a.Commit()) ctx, cancel := context.WithCancel(context.Background()) @@ -209,14 +211,13 @@ func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { u, err := url.Parse(fmt.Sprintf("http://%s", p.Addr())) testutil.Ok(t, err) - limitMinT := int64(0) - proxy, err := NewPrometheusStore(nil, nil, u, component.Sidecar, + promStore, err := NewPrometheusStore(nil, nil, u, component.Sidecar, func() labels.Labels { return labels.FromStrings("region", "eu-west") }, - func() (int64, int64) { return limitMinT, -1 }) // Maxt does not matter. + func() (int64, int64) { return math.MinInt64/1000 + 62135596801, math.MaxInt64/1000 - 62135596801 }) testutil.Ok(t, err) { - res, err := proxy.seriesLabels(ctx, []storepb.LabelMatcher{ + res, err := promStore.seriesLabels(ctx, []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_EQ, Name: "a", Value: "b"}, }, baseT, baseT+300) testutil.Ok(t, err) @@ -225,7 +226,7 @@ func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { testutil.Equals(t, labels.FromMap(res[0]), labels.Labels{{Name: "a", Value: "b"}}) } { - res, err := proxy.seriesLabels(ctx, []storepb.LabelMatcher{ + res, err := promStore.seriesLabels(ctx, []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_EQ, Name: "job", Value: "foo"}, }, baseT, baseT+300) testutil.Ok(t, err) @@ -233,7 +234,7 @@ func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { testutil.Equals(t, len(res), 0) } { - res, err := proxy.seriesLabels(ctx, []storepb.LabelMatcher{ + res, err := promStore.seriesLabels(ctx, []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_NEQ, Name: "a", Value: "b"}, {Type: storepb.LabelMatcher_EQ, Name: "job", Value: "test"}, }, baseT, baseT+300) @@ -247,7 +248,7 @@ func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { } } { - res, err := proxy.seriesLabels(ctx, []storepb.LabelMatcher{ + res, err := promStore.seriesLabels(ctx, []storepb.LabelMatcher{ {Type: storepb.LabelMatcher_EQ, Name: "job", Value: "test"}, }, baseT, baseT+300) testutil.Ok(t, err) @@ -259,6 +260,29 @@ func TestPrometheusStore_SeriesLabels_e2e(t *testing.T) { testutil.Equals(t, labels.FromMap(r).Get("job"), "test") } } + { + res, err := promStore.seriesLabels(ctx, []storepb.LabelMatcher{ + {Type: storepb.LabelMatcher_EQ, Name: "job", Value: "test"}, + }, baseT+400, baseT+400) + testutil.Ok(t, err) + + // In baseT + 400 we can just get one series. + testutil.Equals(t, len(res), 1) + testutil.Equals(t, len(res[0]), 1) + testutil.Equals(t, labels.FromMap(res[0]).Get("job"), "test") + } + // This test case is to test when start time and end time is not specified. + { + minTime, maxTime := promStore.timestamps() + res, err := promStore.seriesLabels(ctx, []storepb.LabelMatcher{ + {Type: storepb.LabelMatcher_EQ, Name: "job", Value: "test"}, + }, minTime, maxTime) + testutil.Ok(t, err) + testutil.Equals(t, len(res), 3) + for _, r := range res { + testutil.Equals(t, labels.FromMap(r).Get("job"), "test") + } + } } func TestPrometheusStore_LabelValues_e2e(t *testing.T) {