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.
pull/1073/head
Brian Brazil 9 years ago
parent 1ef5ed0cf2
commit 69f5fa0c1e

@ -650,6 +650,30 @@ func funcLabelReplace(ev *evaluator, args Expressions) model.Value {
return vector 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{ var functions = map[string]*Function{
"abs": { "abs": {
Name: "abs", Name: "abs",
@ -845,6 +869,13 @@ var functions = map[string]*Function{
ReturnType: model.ValVector, ReturnType: model.ValVector,
Call: funcTopk, 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. // getFunction returns a predefined Function object for the given name.

@ -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. # label_replace fails when there would be duplicated identical output label sets.
eval_fail instant at 0m label_replace(testmetric, "src", "", "", "") 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…
Cancel
Save