mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-09 23:24:05 -08:00
promql: Add vector function.
Currently the only way to convert a scalar to a vector is to use absent(), which isn't very clean. This adds a vector() function that's the inverse of scalar() and lets your optionally set labels. Example usage would be vector(time() % 86400) < 3600 to filter to only the first hour of the day.
This commit is contained in:
parent
1ef5ed0cf2
commit
69f5fa0c1e
|
@ -650,6 +650,30 @@ func funcLabelReplace(ev *evaluator, args Expressions) model.Value {
|
|||
return vector
|
||||
}
|
||||
|
||||
// === vector(s scalar, vector model.ValVectora={}) Vector ===
|
||||
func funcVector(ev *evaluator, args Expressions) model.Value {
|
||||
m := model.Metric{}
|
||||
if len(args) >= 2 {
|
||||
if vs, ok := args[1].(*VectorSelector); ok {
|
||||
for _, matcher := range vs.LabelMatchers {
|
||||
if matcher.Type == metric.Equal && matcher.Name != model.MetricNameLabel {
|
||||
m[matcher.Name] = matcher.Value
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return vector{
|
||||
&sample{
|
||||
Metric: metric.Metric{
|
||||
Metric: m,
|
||||
Copied: true,
|
||||
},
|
||||
Value: model.SampleValue(ev.evalFloat(args[0])),
|
||||
Timestamp: ev.Timestamp,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
var functions = map[string]*Function{
|
||||
"abs": {
|
||||
Name: "abs",
|
||||
|
@ -845,6 +869,13 @@ var functions = map[string]*Function{
|
|||
ReturnType: model.ValVector,
|
||||
Call: funcTopk,
|
||||
},
|
||||
"vector": {
|
||||
Name: "vector",
|
||||
ArgTypes: []model.ValueType{model.ValScalar, model.ValVector},
|
||||
ReturnType: model.ValVector,
|
||||
OptionalArgs: 1,
|
||||
Call: funcVector,
|
||||
},
|
||||
}
|
||||
|
||||
// getFunction returns a predefined Function object for the given name.
|
||||
|
|
15
promql/testdata/functions.test
vendored
15
promql/testdata/functions.test
vendored
|
@ -146,3 +146,18 @@ eval_fail instant at 0m label_replace(testmetric, "invalid-label-name", "", "src
|
|||
|
||||
# label_replace fails when there would be duplicated identical output label sets.
|
||||
eval_fail instant at 0m label_replace(testmetric, "src", "", "", "")
|
||||
|
||||
clear
|
||||
|
||||
# Tests for vector.
|
||||
eval instant at 0m vector(1)
|
||||
{} 1
|
||||
|
||||
eval instant at 60m vector(time())
|
||||
{} 3600
|
||||
|
||||
eval instant at 0m vector(1, {a="b"})
|
||||
{a="b"} 1
|
||||
|
||||
eval instant at 0m vector(1, {a="b", c=~"d", e!="f", g!~"h", a="z"})
|
||||
{a="z"} 1
|
||||
|
|
Loading…
Reference in a new issue