Skip to content

Commit

Permalink
Fix invalid start/end params in series api (#2015)
Browse files Browse the repository at this point in the history
* fix invalid start/end params in series api

Signed-off-by: yeya24 <yb532204897@gmail.com>

* add testcase for serieslabels time range

Signed-off-by: yeya24 <yb532204897@gmail.com>
  • Loading branch information
yeya24 authored and bwplotka committed Jan 23, 2020
1 parent b130221 commit 43f659a
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 10 deletions.
2 changes: 1 addition & 1 deletion pkg/model/timeduration.go
Expand Up @@ -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:
Expand Down
11 changes: 9 additions & 2 deletions pkg/store/prometheus.go
Expand Up @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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)
}
38 changes: 31 additions & 7 deletions pkg/store/prometheus_test.go
Expand Up @@ -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())
Expand All @@ -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)
Expand All @@ -225,15 +226,15 @@ 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)

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)
Expand All @@ -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)
Expand All @@ -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) {
Expand Down

0 comments on commit 43f659a

Please sign in to comment.