1// Copyright 2020 The Prometheus Authors 2// Licensed under the Apache License, Version 2.0 (the "License"); 3// you may not use this file except in compliance with the License. 4// You may obtain a copy of the License at 5// 6// http://www.apache.org/licenses/LICENSE-2.0 7// 8// Unless required by applicable law or agreed to in writing, software 9// distributed under the License is distributed on an "AS IS" BASIS, 10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11// See the License for the specific language governing permissions and 12// limitations under the License. 13 14// This file holds boilerplate adapters for generic MergeSeriesSet and MergeQuerier functions, so we can have one optimized 15// solution that works for both ChunkSeriesSet as well as SeriesSet. 16 17package storage 18 19import ( 20 "github.com/prometheus/prometheus/pkg/labels" 21) 22 23type genericQuerier interface { 24 LabelQuerier 25 Select(bool, *SelectHints, ...*labels.Matcher) genericSeriesSet 26} 27 28type genericSeriesSet interface { 29 Next() bool 30 At() Labels 31 Err() error 32 Warnings() Warnings 33} 34 35type genericSeriesMergeFunc func(...Labels) Labels 36 37type genericSeriesSetAdapter struct { 38 SeriesSet 39} 40 41func (a *genericSeriesSetAdapter) At() Labels { 42 return a.SeriesSet.At() 43} 44 45type genericChunkSeriesSetAdapter struct { 46 ChunkSeriesSet 47} 48 49func (a *genericChunkSeriesSetAdapter) At() Labels { 50 return a.ChunkSeriesSet.At() 51} 52 53type genericQuerierAdapter struct { 54 LabelQuerier 55 56 // One-of. If both are set, Querier will be used. 57 q Querier 58 cq ChunkQuerier 59} 60 61func (q *genericQuerierAdapter) Select(sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) genericSeriesSet { 62 if q.q != nil { 63 return &genericSeriesSetAdapter{q.q.Select(sortSeries, hints, matchers...)} 64 } 65 return &genericChunkSeriesSetAdapter{q.cq.Select(sortSeries, hints, matchers...)} 66} 67 68func newGenericQuerierFrom(q Querier) genericQuerier { 69 return &genericQuerierAdapter{LabelQuerier: q, q: q} 70} 71 72func newGenericQuerierFromChunk(cq ChunkQuerier) genericQuerier { 73 return &genericQuerierAdapter{LabelQuerier: cq, cq: cq} 74} 75 76type querierAdapter struct { 77 genericQuerier 78} 79 80type seriesSetAdapter struct { 81 genericSeriesSet 82} 83 84func (a *seriesSetAdapter) At() Series { 85 return a.genericSeriesSet.At().(Series) 86} 87 88func (q *querierAdapter) Select(sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) SeriesSet { 89 return &seriesSetAdapter{q.genericQuerier.Select(sortSeries, hints, matchers...)} 90} 91 92type chunkQuerierAdapter struct { 93 genericQuerier 94} 95 96type chunkSeriesSetAdapter struct { 97 genericSeriesSet 98} 99 100func (a *chunkSeriesSetAdapter) At() ChunkSeries { 101 return a.genericSeriesSet.At().(ChunkSeries) 102} 103 104func (q *chunkQuerierAdapter) Select(sortSeries bool, hints *SelectHints, matchers ...*labels.Matcher) ChunkSeriesSet { 105 return &chunkSeriesSetAdapter{q.genericQuerier.Select(sortSeries, hints, matchers...)} 106} 107 108type seriesMergerAdapter struct { 109 VerticalSeriesMergeFunc 110} 111 112func (a *seriesMergerAdapter) Merge(s ...Labels) Labels { 113 buf := make([]Series, 0, len(s)) 114 for _, ser := range s { 115 buf = append(buf, ser.(Series)) 116 } 117 return a.VerticalSeriesMergeFunc(buf...) 118} 119 120type chunkSeriesMergerAdapter struct { 121 VerticalChunkSeriesMergeFunc 122} 123 124func (a *chunkSeriesMergerAdapter) Merge(s ...Labels) Labels { 125 buf := make([]ChunkSeries, 0, len(s)) 126 for _, ser := range s { 127 buf = append(buf, ser.(ChunkSeries)) 128 } 129 return a.VerticalChunkSeriesMergeFunc(buf...) 130} 131 132type noopGenericSeriesSet struct{} 133 134func (noopGenericSeriesSet) Next() bool { return false } 135 136func (noopGenericSeriesSet) At() Labels { return nil } 137 138func (noopGenericSeriesSet) Err() error { return nil } 139 140func (noopGenericSeriesSet) Warnings() Warnings { return nil } 141