@@ -2,7 +2,6 @@ package util
2
2
3
3
import (
4
4
"sort"
5
- "time"
6
5
7
6
"github.com/prometheus/common/model"
8
7
"github.com/prometheus/prometheus/storage/local"
@@ -11,38 +10,31 @@ import (
11
10
12
11
// MergeSeriesIterator combines SampleStreamIterator
13
12
type MergeSeriesIterator struct {
14
- metric model.Metric
15
13
iterators []local.SeriesIterator
16
14
}
17
15
18
16
// NewMergeSeriesIterator creates a mergeSeriesIterator
19
- func NewMergeSeriesIterator (metric model. Metric , iterators []local.SeriesIterator ) MergeSeriesIterator {
17
+ func NewMergeSeriesIterator (iterators []local.SeriesIterator ) MergeSeriesIterator {
20
18
return MergeSeriesIterator {
21
- metric : metric ,
22
19
iterators : iterators ,
23
20
}
24
21
}
25
22
26
23
// Metric implements the SeriesIterator interface.
27
24
func (msit MergeSeriesIterator ) Metric () metric.Metric {
28
- return metric.Metric {Metric : msit .metric }
25
+ return metric.Metric {Metric : msit .iterators [ 0 ]. Metric (). Metric }
29
26
}
30
27
31
28
// ValueAtOrBeforeTime implements the SeriesIterator interface.
32
29
func (msit MergeSeriesIterator ) ValueAtOrBeforeTime (ts model.Time ) model.SamplePair {
33
- var closestSamplePair * model.SamplePair
34
- var closestTimeDifference time.Duration
35
-
30
+ latest := model .ZeroSamplePair
36
31
for _ , it := range msit .iterators {
37
- samplePair := it .ValueAtOrBeforeTime (ts )
38
- timeDifference := ts .Sub (samplePair .Timestamp )
39
- if closestSamplePair == nil || timeDifference .Nanoseconds () < closestTimeDifference .Nanoseconds () {
40
- closestSamplePair = & samplePair
41
- closestTimeDifference = timeDifference
32
+ v := it .ValueAtOrBeforeTime (ts )
33
+ if v .Timestamp .After (latest .Timestamp ) {
34
+ latest = v
42
35
}
43
36
}
44
-
45
- return * closestSamplePair
37
+ return latest
46
38
}
47
39
48
40
// RangeValues implements the SeriesIterator interface.
@@ -60,7 +52,11 @@ func (msit MergeSeriesIterator) RangeValues(in metric.Interval) []model.SamplePa
60
52
}
61
53
62
54
// Close implements the SeriesIterator interface.
63
- func (msit MergeSeriesIterator ) Close () {}
55
+ func (msit MergeSeriesIterator ) Close () {
56
+ for _ , it := range msit .iterators {
57
+ it .Close ()
58
+ }
59
+ }
64
60
65
61
// SampleStreamIterator is a struct and not just a renamed type because otherwise the Metric
66
62
// field and Metric() methods would clash.
0 commit comments