mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-26 06:04:05 -08:00
Implement native histogram min and max query functions
Signed-off-by: Carrie Edwards <edwrdscarrie@gmail.com>
This commit is contained in:
parent
a462f7fa21
commit
bc0ee4a469
|
@ -996,6 +996,66 @@ func funcHistogramSum(vals []parser.Value, args parser.Expressions, enh *EvalNod
|
||||||
return enh.Out
|
return enh.Out
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// === histogram_min(Vector parser.ValueTypeVector) Vector ===
|
||||||
|
func funcHistogramMin(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector {
|
||||||
|
inVec := vals[0].(Vector)
|
||||||
|
|
||||||
|
for _, sample := range inVec {
|
||||||
|
// Skip non-histogram samples.
|
||||||
|
if sample.H == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
min := math.NaN() // initialize to NaN in case histogram is empty
|
||||||
|
|
||||||
|
it := sample.H.AllBucketIterator() // AllBucketIterator starts at the lowest bucket in the native histogram
|
||||||
|
for it.Next() {
|
||||||
|
bucket := it.At()
|
||||||
|
// Find the lower limit of the lowest populated bucket
|
||||||
|
if bucket.Count > 0 {
|
||||||
|
min = bucket.Lower
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enh.Out = append(enh.Out, Sample{
|
||||||
|
Metric: enh.DropMetricName(sample.Metric),
|
||||||
|
Point: Point{V: min},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return enh.Out
|
||||||
|
}
|
||||||
|
|
||||||
|
// === histogram_max(Vector parser.ValueTypeVector) Vector ===
|
||||||
|
func funcHistogramMax(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector {
|
||||||
|
inVec := vals[0].(Vector)
|
||||||
|
|
||||||
|
for _, sample := range inVec {
|
||||||
|
// Skip non-histogram samples.
|
||||||
|
if sample.H == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
max := math.NaN() // initialize to NaN in case histogram is empty
|
||||||
|
|
||||||
|
it := sample.H.AllReverseBucketIterator() // AllReverseBucketIterator starts at the highest bucket in the native histogram
|
||||||
|
for it.Next() {
|
||||||
|
bucket := it.At()
|
||||||
|
// Find the upper limit of the highest populated bucket
|
||||||
|
if bucket.Count > 0 {
|
||||||
|
max = bucket.Upper
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enh.Out = append(enh.Out, Sample{
|
||||||
|
Metric: enh.DropMetricName(sample.Metric),
|
||||||
|
Point: Point{V: max},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return enh.Out
|
||||||
|
}
|
||||||
|
|
||||||
// === histogram_fraction(lower, upper parser.ValueTypeScalar, Vector parser.ValueTypeVector) Vector ===
|
// === histogram_fraction(lower, upper parser.ValueTypeScalar, Vector parser.ValueTypeVector) Vector ===
|
||||||
func funcHistogramFraction(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector {
|
func funcHistogramFraction(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector {
|
||||||
lower := vals[0].(Vector)[0].F
|
lower := vals[0].(Vector)[0].F
|
||||||
|
@ -1375,6 +1435,8 @@ var FunctionCalls = map[string]FunctionCall{
|
||||||
"floor": funcFloor,
|
"floor": funcFloor,
|
||||||
"histogram_count": funcHistogramCount,
|
"histogram_count": funcHistogramCount,
|
||||||
"histogram_fraction": funcHistogramFraction,
|
"histogram_fraction": funcHistogramFraction,
|
||||||
|
"histogram_max": funcHistogramMax,
|
||||||
|
"histogram_min": funcHistogramMin,
|
||||||
"histogram_quantile": funcHistogramQuantile,
|
"histogram_quantile": funcHistogramQuantile,
|
||||||
"histogram_sum": funcHistogramSum,
|
"histogram_sum": funcHistogramSum,
|
||||||
"holt_winters": funcHoltWinters,
|
"holt_winters": funcHoltWinters,
|
||||||
|
|
|
@ -173,6 +173,16 @@ var Functions = map[string]*Function{
|
||||||
ArgTypes: []ValueType{ValueTypeVector},
|
ArgTypes: []ValueType{ValueTypeVector},
|
||||||
ReturnType: ValueTypeVector,
|
ReturnType: ValueTypeVector,
|
||||||
},
|
},
|
||||||
|
"histogram_min": {
|
||||||
|
Name: "histogram_min",
|
||||||
|
ArgTypes: []ValueType{ValueTypeVector},
|
||||||
|
ReturnType: ValueTypeVector,
|
||||||
|
},
|
||||||
|
"histogram_max": {
|
||||||
|
Name: "histogram_max",
|
||||||
|
ArgTypes: []ValueType{ValueTypeVector},
|
||||||
|
ReturnType: ValueTypeVector,
|
||||||
|
},
|
||||||
"histogram_fraction": {
|
"histogram_fraction": {
|
||||||
Name: "histogram_fraction",
|
Name: "histogram_fraction",
|
||||||
ArgTypes: []ValueType{ValueTypeScalar, ValueTypeScalar, ValueTypeVector},
|
ArgTypes: []ValueType{ValueTypeScalar, ValueTypeScalar, ValueTypeVector},
|
||||||
|
|
Loading…
Reference in a new issue