2016-12-24 16:40:28 -08:00
// Copyright 2014 The Prometheus Authors
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package storage
import (
2017-10-04 12:04:15 -07:00
"context"
2016-12-24 16:40:28 -08:00
"errors"
2021-05-06 13:53:52 -07:00
"fmt"
2016-12-24 16:40:28 -08:00
2021-11-08 06:23:17 -08:00
"github.com/prometheus/prometheus/model/exemplar"
"github.com/prometheus/prometheus/model/labels"
2020-02-06 07:58:38 -08:00
"github.com/prometheus/prometheus/tsdb/chunkenc"
"github.com/prometheus/prometheus/tsdb/chunks"
2016-12-24 16:40:28 -08:00
)
2017-07-04 02:24:13 -07:00
// The errors exposed.
2016-12-24 16:40:28 -08:00
var (
2017-01-15 08:33:07 -08:00
ErrNotFound = errors . New ( "not found" )
2022-06-22 04:45:21 -07:00
ErrOutOfOrderSample = errors . New ( "out of order sample" ) // OOO support disabled and sample is OOO
ErrTooOldSample = errors . New ( "too old sample" ) // OOO support enabled, but sample outside of tolerance
ErrDuplicateSampleForTimestamp = errors . New ( "duplicate sample for timestamp" ) // WARNING: this is only reported if value differs. equal values get silently dropped
ErrOutOfBounds = errors . New ( "out of bounds" ) // OOO support disabled and t < minValidTime
2021-03-16 02:47:45 -07:00
ErrOutOfOrderExemplar = errors . New ( "out of order exemplar" )
2021-05-06 13:53:52 -07:00
ErrDuplicateExemplar = errors . New ( "duplicate exemplar" )
ErrExemplarLabelLength = fmt . Errorf ( "label length for exemplar exceeds maximum of %d UTF-8 characters" , exemplar . ExemplarMaxLabelSetLength )
2021-07-19 21:52:57 -07:00
ErrExemplarsDisabled = fmt . Errorf ( "exemplar storage is disabled or max exemplars is less than or equal to 0" )
2016-12-24 16:40:28 -08:00
)
2021-11-06 03:10:04 -07:00
// SeriesRef is a generic series reference. In prometheus it is either a
// HeadSeriesRef or BlockSeriesRef, though other implementations may have
// their own reference types.
type SeriesRef uint64
2020-02-06 07:58:38 -08:00
// Appendable allows creating appenders.
type Appendable interface {
2020-07-31 00:33:56 -07:00
// Appender returns a new appender for the storage. The implementation
// can choose whether or not to use the context, for deadlines or to check
// for errors.
2020-07-24 07:10:51 -07:00
Appender ( ctx context . Context ) Appender
2020-02-06 07:58:38 -08:00
}
2020-06-24 06:41:52 -07:00
// SampleAndChunkQueryable allows retrieving samples as well as encoded samples in form of chunks.
type SampleAndChunkQueryable interface {
Queryable
ChunkQueryable
}
2016-12-24 16:40:28 -08:00
// Storage ingests and manages samples, along with various indexes. All methods
2021-03-16 02:47:45 -07:00
// are goroutine-safe. Storage implements storage.Appender.
2016-12-24 16:40:28 -08:00
type Storage interface {
2020-06-24 06:41:52 -07:00
SampleAndChunkQueryable
2020-02-06 07:58:38 -08:00
Appendable
2017-11-11 16:27:45 -08:00
2017-10-18 04:08:14 -07:00
// StartTime returns the oldest timestamp stored in the storage.
StartTime ( ) ( int64 , error )
2016-12-24 16:40:28 -08:00
// Close closes the storage and all its underlying resources.
Close ( ) error
}
2021-03-16 02:47:45 -07:00
// ExemplarStorage ingests and manages exemplars, along with various indexes. All methods are
// goroutine-safe. ExemplarStorage implements storage.ExemplarAppender and storage.ExemplarQuerier.
type ExemplarStorage interface {
ExemplarQueryable
ExemplarAppender
}
2017-11-11 16:27:45 -08:00
// A Queryable handles queries against a storage.
2020-03-24 13:15:47 -07:00
// Use it when you need to have access to all samples without chunk encoding abstraction e.g promQL.
2017-11-11 16:27:45 -08:00
type Queryable interface {
// Querier returns a new Querier on the storage.
Querier ( ctx context . Context , mint , maxt int64 ) ( Querier , error )
}
2022-03-28 17:16:46 -07:00
// A MockQueryable is used for testing purposes so that a mock Querier can be used.
type MockQueryable struct {
MockQuerier Querier
}
func ( q * MockQueryable ) Querier ( ctx context . Context , mint , maxt int64 ) ( Querier , error ) {
return q . MockQuerier , nil
}
2020-03-24 13:15:47 -07:00
// Querier provides querying access over time series data of a fixed time range.
2016-12-24 16:40:28 -08:00
type Querier interface {
2020-06-24 06:41:52 -07:00
LabelQuerier
2020-03-24 13:15:47 -07:00
2016-12-24 16:40:28 -08:00
// Select returns a set of series that matches the given label matchers.
2020-03-12 02:36:09 -07:00
// Caller can specify if it requires returned series to be sorted. Prefer not requiring sorting for better performance.
// It allows passing hints that can help in optimising select, but it's up to implementation how this is used if used at all.
2020-06-09 09:57:31 -07:00
Select ( sortSeries bool , hints * SelectHints , matchers ... * labels . Matcher ) SeriesSet
2020-03-24 13:15:47 -07:00
}
2022-03-28 17:16:46 -07:00
// MockQuerier is used for test purposes to mock the selected series that is returned.
type MockQuerier struct {
SelectMockFunction func ( sortSeries bool , hints * SelectHints , matchers ... * labels . Matcher ) SeriesSet
}
func ( q * MockQuerier ) LabelValues ( name string , matchers ... * labels . Matcher ) ( [ ] string , Warnings , error ) {
return nil , nil , nil
}
func ( q * MockQuerier ) LabelNames ( matchers ... * labels . Matcher ) ( [ ] string , Warnings , error ) {
return nil , nil , nil
}
func ( q * MockQuerier ) Close ( ) error {
return nil
}
func ( q * MockQuerier ) Select ( sortSeries bool , hints * SelectHints , matchers ... * labels . Matcher ) SeriesSet {
return q . SelectMockFunction ( sortSeries , hints , matchers ... )
}
2020-03-24 13:15:47 -07:00
// A ChunkQueryable handles queries against a storage.
// Use it when you need to have access to samples in encoded format.
type ChunkQueryable interface {
// ChunkQuerier returns a new ChunkQuerier on the storage.
2020-06-24 06:41:52 -07:00
ChunkQuerier ( ctx context . Context , mint , maxt int64 ) ( ChunkQuerier , error )
2020-03-24 13:15:47 -07:00
}
// ChunkQuerier provides querying access over time series data of a fixed time range.
type ChunkQuerier interface {
2020-06-24 06:41:52 -07:00
LabelQuerier
2020-03-24 13:15:47 -07:00
// Select returns a set of series that matches the given label matchers.
// Caller can specify if it requires returned series to be sorted. Prefer not requiring sorting for better performance.
// It allows passing hints that can help in optimising select, but it's up to implementation how this is used if used at all.
2020-06-09 09:57:31 -07:00
Select ( sortSeries bool , hints * SelectHints , matchers ... * labels . Matcher ) ChunkSeriesSet
2020-03-24 13:15:47 -07:00
}
2020-01-17 03:21:44 -08:00
2020-06-24 06:41:52 -07:00
// LabelQuerier provides querying access over labels.
type LabelQuerier interface {
2016-12-24 16:40:28 -08:00
// LabelValues returns all potential values for a label name.
2021-05-31 15:49:29 -07:00
// It is not safe to use the strings beyond the lifetime of the querier.
2021-02-09 09:38:35 -08:00
// If matchers are specified the returned result set is reduced
// to label values of metrics matching the matchers.
LabelValues ( name string , matchers ... * labels . Matcher ) ( [ ] string , Warnings , error )
2016-12-24 16:40:28 -08:00
2018-11-19 02:21:14 -08:00
// LabelNames returns all the unique label names present in the block in sorted order.
2021-07-20 05:38:08 -07:00
// If matchers are specified the returned result set is reduced
// to label names of metrics matching the matchers.
LabelNames ( matchers ... * labels . Matcher ) ( [ ] string , Warnings , error )
2018-11-19 02:21:14 -08:00
2016-12-24 16:40:28 -08:00
// Close releases the resources of the Querier.
Close ( ) error
}
2021-03-16 02:47:45 -07:00
type ExemplarQueryable interface {
// ExemplarQuerier returns a new ExemplarQuerier on the storage.
ExemplarQuerier ( ctx context . Context ) ( ExemplarQuerier , error )
}
2021-05-07 20:45:29 -07:00
// ExemplarQuerier provides reading access to time series data.
2021-03-16 02:47:45 -07:00
type ExemplarQuerier interface {
// Select all the exemplars that match the matchers.
// Within a single slice of matchers, it is an intersection. Between the slices, it is a union.
Select ( start , end int64 , matchers ... [ ] * labels . Matcher ) ( [ ] exemplar . QueryResult , error )
}
2020-03-12 02:36:09 -07:00
// SelectHints specifies hints passed for data selections.
// This is used only as an option for implementation to use.
type SelectHints struct {
2018-07-17 20:58:00 -07:00
Start int64 // Start time in milliseconds for this select.
End int64 // End time in milliseconds for this select.
2018-01-09 08:44:23 -08:00
Step int64 // Query step size in milliseconds.
Func string // String representation of surrounding function or aggregation.
2019-12-05 06:06:28 -08:00
Grouping [ ] string // List of label names used in aggregation.
By bool // Indicate whether it is without or by.
Range int64 // Range vector selector range in milliseconds.
2021-08-13 03:37:41 -07:00
2021-08-13 06:16:03 -07:00
ShardIndex uint64 // Current shard index (starts from 0 and up to ShardCount-1).
2021-08-13 03:37:41 -07:00
ShardCount uint64 // Total number of shards (0 means sharding is disabled).
2021-11-03 03:23:16 -07:00
2021-11-03 03:08:34 -07:00
// DisableTrimming allows to disable trimming of matching series chunks based on query Start and End time.
// When disabled, the result may contain samples outside the queried time range but Select() performances
// may be improved.
DisableTrimming bool
2018-01-09 08:44:23 -08:00
}
2020-06-24 06:41:52 -07:00
// TODO(bwplotka): Move to promql/engine_test.go?
2017-11-11 16:27:45 -08:00
// QueryableFunc is an adapter to allow the use of ordinary functions as
// Queryables. It follows the idea of http.HandlerFunc.
type QueryableFunc func ( ctx context . Context , mint , maxt int64 ) ( Querier , error )
// Querier calls f() with the given parameters.
func ( f QueryableFunc ) Querier ( ctx context . Context , mint , maxt int64 ) ( Querier , error ) {
return f ( ctx , mint , maxt )
}
2016-12-24 16:40:28 -08:00
// Appender provides batched appends against a storage.
2020-02-07 08:24:17 -08:00
// It must be completed with a call to Commit or Rollback and must not be reused afterwards.
//
// Operations on the Appender interface are not goroutine-safe.
2016-12-24 16:40:28 -08:00
type Appender interface {
2021-02-18 04:07:00 -08:00
// Append adds a sample pair for the given series.
2021-11-17 02:21:27 -08:00
// An optional series reference can be provided to accelerate calls.
// A series reference number is returned which can be used to add further
// samples to the given series in the same or later transactions.
2020-02-07 08:24:17 -08:00
// Returned reference numbers are ephemeral and may be rejected in calls
2021-02-18 04:07:00 -08:00
// to Append() at any point. Adding the sample via Append() returns a new
2020-02-07 08:24:17 -08:00
// reference number.
// If the reference is 0 it must not be used for caching.
2021-11-06 03:10:04 -07:00
Append ( ref SeriesRef , l labels . Labels , t int64 , v float64 ) ( SeriesRef , error )
2016-12-24 16:40:28 -08:00
2020-03-09 10:24:18 -07:00
// Commit submits the collected samples and purges the batch. If Commit
// returns a non-nil error, it also rolls back all modifications made in
// the appender so far, as Rollback would do. In any case, an Appender
// must not be used anymore after Commit has been called.
2016-12-24 16:40:28 -08:00
Commit ( ) error
2017-01-13 05:48:01 -08:00
2020-02-07 08:24:17 -08:00
// Rollback rolls back all modifications made in the appender so far.
2020-02-11 08:34:09 -08:00
// Appender has to be discarded after rollback.
2017-01-13 05:48:01 -08:00
Rollback ( ) error
2021-03-16 02:47:45 -07:00
ExemplarAppender
}
2021-03-19 12:28:55 -07:00
// GetRef is an extra interface on Appenders used by downstream projects
// (e.g. Cortex) to avoid maintaining a parallel set of references.
type GetRef interface {
2021-03-24 08:24:58 -07:00
// Returns reference number that can be used to pass to Appender.Append(),
// and a set of labels that will not cause another copy when passed to Appender.Append().
2021-03-19 12:28:55 -07:00
// 0 means the appender does not have a reference to this series.
2021-11-06 03:10:04 -07:00
GetRef ( lset labels . Labels ) ( SeriesRef , labels . Labels )
2021-03-19 12:28:55 -07:00
}
2021-03-16 02:47:45 -07:00
// ExemplarAppender provides an interface for adding samples to exemplar storage, which
// within Prometheus is in-memory only.
type ExemplarAppender interface {
// AppendExemplar adds an exemplar for the given series labels.
// An optional reference number can be provided to accelerate calls.
// A reference number is returned which can be used to add further
// exemplars in the same or later transactions.
// Returned reference numbers are ephemeral and may be rejected in calls
// to Append() at any point. Adding the sample via Append() returns a new
// reference number.
// If the reference is 0 it must not be used for caching.
// Note that in our current implementation of Prometheus' exemplar storage
// calls to Append should generate the reference numbers, AppendExemplar
// generating a new reference number should be considered possible erroneous behaviour and be logged.
2021-11-06 03:10:04 -07:00
AppendExemplar ( ref SeriesRef , l labels . Labels , e exemplar . Exemplar ) ( SeriesRef , error )
2016-12-24 16:40:28 -08:00
}
// SeriesSet contains a set of series.
type SeriesSet interface {
Next ( ) bool
2021-04-12 13:43:42 -07:00
// At returns full series. Returned series should be iterable even after Next is called.
2017-01-02 04:33:37 -08:00
At ( ) Series
2020-06-09 09:57:31 -07:00
// The error that iteration as failed with.
// When an error occurs, set cannot continue to iterate.
2016-12-24 16:40:28 -08:00
Err ( ) error
2020-06-09 09:57:31 -07:00
// A collection of warnings for the whole set.
// Warnings could be return even iteration has not failed with error.
Warnings ( ) Warnings
2016-12-24 16:40:28 -08:00
}
2020-02-06 07:58:38 -08:00
var emptySeriesSet = errSeriesSet { }
// EmptySeriesSet returns a series set that's always empty.
func EmptySeriesSet ( ) SeriesSet {
return emptySeriesSet
}
2022-03-28 17:16:46 -07:00
type testSeriesSet struct {
series Series
}
func ( s testSeriesSet ) Next ( ) bool { return true }
func ( s testSeriesSet ) At ( ) Series { return s . series }
func ( s testSeriesSet ) Err ( ) error { return nil }
func ( s testSeriesSet ) Warnings ( ) Warnings { return nil }
// TestSeriesSet returns a mock series set
func TestSeriesSet ( series Series ) SeriesSet {
return testSeriesSet { series : series }
}
2020-02-06 07:58:38 -08:00
type errSeriesSet struct {
err error
}
2020-06-09 09:57:31 -07:00
func ( s errSeriesSet ) Next ( ) bool { return false }
func ( s errSeriesSet ) At ( ) Series { return nil }
func ( s errSeriesSet ) Err ( ) error { return s . err }
2020-06-24 06:41:52 -07:00
func ( s errSeriesSet ) Warnings ( ) Warnings { return nil }
2020-06-09 09:57:31 -07:00
// ErrSeriesSet returns a series set that wraps an error.
func ErrSeriesSet ( err error ) SeriesSet {
return errSeriesSet { err : err }
}
2020-02-06 07:58:38 -08:00
2020-06-24 06:41:52 -07:00
var emptyChunkSeriesSet = errChunkSeriesSet { }
// EmptyChunkSeriesSet returns a chunk series set that's always empty.
func EmptyChunkSeriesSet ( ) ChunkSeriesSet {
return emptyChunkSeriesSet
}
type errChunkSeriesSet struct {
err error
}
func ( s errChunkSeriesSet ) Next ( ) bool { return false }
func ( s errChunkSeriesSet ) At ( ) ChunkSeries { return nil }
func ( s errChunkSeriesSet ) Err ( ) error { return s . err }
func ( s errChunkSeriesSet ) Warnings ( ) Warnings { return nil }
// ErrChunkSeriesSet returns a chunk series set that wraps an error.
func ErrChunkSeriesSet ( err error ) ChunkSeriesSet {
return errChunkSeriesSet { err : err }
}
2020-03-24 13:15:47 -07:00
// Series exposes a single time series and allows iterating over samples.
2016-12-24 16:40:28 -08:00
type Series interface {
2020-03-24 13:15:47 -07:00
Labels
2021-04-12 13:43:42 -07:00
SampleIterable
2020-03-24 13:15:47 -07:00
}
2022-03-28 17:16:46 -07:00
type mockSeries struct {
timestamps [ ] int64
values [ ] float64
labelSet [ ] string
}
func ( s mockSeries ) Labels ( ) labels . Labels {
return labels . FromStrings ( s . labelSet ... )
}
func ( s mockSeries ) Iterator ( ) chunkenc . Iterator {
return chunkenc . MockSeriesIterator ( s . timestamps , s . values )
}
// MockSeries returns a series with custom timestamps, values and labelSet.
func MockSeries ( timestamps [ ] int64 , values [ ] float64 , labelSet [ ] string ) Series {
return mockSeries {
timestamps : timestamps ,
values : values ,
labelSet : labelSet ,
}
}
2020-03-24 13:15:47 -07:00
// ChunkSeriesSet contains a set of chunked series.
type ChunkSeriesSet interface {
Next ( ) bool
2021-04-12 13:43:42 -07:00
// At returns full chunk series. Returned series should be iterable even after Next is called.
2020-03-24 13:15:47 -07:00
At ( ) ChunkSeries
2020-06-09 09:57:31 -07:00
// The error that iteration has failed with.
// When an error occurs, set cannot continue to iterate.
2020-03-24 13:15:47 -07:00
Err ( ) error
2020-06-09 09:57:31 -07:00
// A collection of warnings for the whole set.
// Warnings could be return even iteration has not failed with error.
Warnings ( ) Warnings
2020-03-24 13:15:47 -07:00
}
// ChunkSeries exposes a single time series and allows iterating over chunks.
type ChunkSeries interface {
Labels
2021-04-12 13:43:42 -07:00
ChunkIterable
2020-03-24 13:15:47 -07:00
}
// Labels represents an item that has labels e.g. time series.
type Labels interface {
// Labels returns the complete set of labels. For series it means all labels identifying the series.
2016-12-24 16:40:28 -08:00
Labels ( ) labels . Labels
2020-03-24 13:15:47 -07:00
}
2016-12-24 16:40:28 -08:00
2021-04-12 13:43:42 -07:00
type SampleIterable interface {
2020-07-31 08:03:02 -07:00
// Iterator returns a new, independent iterator of the data of the series.
2020-02-06 07:58:38 -08:00
Iterator ( ) chunkenc . Iterator
2016-12-24 16:40:28 -08:00
}
2021-04-12 13:43:42 -07:00
type ChunkIterable interface {
2020-07-31 08:03:02 -07:00
// Iterator returns a new, independent iterator that iterates over potentially overlapping
// chunks of the series, sorted by min time.
2020-03-24 13:15:47 -07:00
Iterator ( ) chunks . Iterator
}
2018-11-30 06:27:12 -08:00
type Warnings [ ] error