You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
prometheus/querier.go

122 lines
3.0 KiB

package tsdb
import "github.com/fabxc/tsdb/chunks"
// Matcher matches a string.
type Matcher interface {
// Match returns true if the matcher applies to the string value.
Match(v string) bool
}
// Querier provides querying access over time series data of a fixed
// time range.
type Querier interface {
// Range returns the timestamp range of the Querier.
Range() (start, end int64)
// Iterator returns an interator over the inverted index that
// matches the key label by the constraints of Matcher.
Iterator(key string, m Matcher) Iterator
// Labels resolves a label reference into a set of labels.
Labels(ref LabelRefs) (Labels, error)
// Series returns series provided in the index iterator.
Series(Iterator) []Series
// LabelValues returns all potential values for a label name.
LabelValues(string) []string
// LabelValuesFor returns all potential values for a label name.
// under the constraint of another label.
LabelValuesFor(string, Label) []string
// Close releases the resources of the Querier.
Close() error
}
// Series represents a single time series.
type Series interface {
Labels() (Labels, error)
// Iterator returns a new iterator of the data of the series.
Iterator() (SeriesIterator, error)
}
// SeriesIterator iterates over the data of a time series.
type SeriesIterator interface {
// Seek advances the iterator forward to the given timestamp.
// If there's no value exactly at ts, it advances to the last value
// before tt.
Seek(t int64) bool
// Values returns the current timestamp/value pair.
Values() (t int64, v float64)
// Next advances the iterator by one.
Next() bool
// Err returns the current error.
Err() error
}
// chunkSeriesIterator implements a series iterator on top
// of a list of time-sorted, non-overlapping chunks.
type chunkSeriesIterator struct {
// minTimes []int64
chunks []chunks.Chunk
i int
cur chunks.Iterator
err error
}
func newChunkSeriesIterator(cs []chunks.Chunk) *chunkSeriesIterator {
return &chunkSeriesIterator{
chunks: cs,
i: 0,
cur: cs[0].Iterator(),
}
}
func (it *chunkSeriesIterator) Seek(t int64) (ok bool) {
// TODO(fabxc): skip to relevant chunk.
for it.Next() {
if ts, _ := it.Values(); ts >= t {
return true
}
}
return false
}
func (it *chunkSeriesIterator) Values() (t int64, v float64) {
return it.cur.Values()
}
func (it *chunkSeriesIterator) Next() bool {
if it.cur.Next() {
return true
}
if err := it.cur.Err(); err != nil {
return false
}
if it.i == len(it.chunks)-1 {
return false
}
it.i++
it.cur = it.chunks[it.i].Iterator()
return it.Next()
}
func (it *chunkSeriesIterator) Err() error {
return it.cur.Err()
}
type bufferedSeriesIterator struct {
// TODO(fabxc): time-based look back buffer for time-aggregating
// queries such as rate. It should allow us to re-use an iterator
// within a range query while calculating time-aggregates at any point.
//
// It also allows looking up/seeking at-or-before without modifying
// the simpler interface.
//
// Consider making this the main external interface.
}