mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-25 05:34:05 -08:00
Support native histogram values in template functions
Co-authored-by: Aleks Fazlieva <britishrum@users.noreply.github.com> Signed-off-by: suntala <arati.rana@grafana.com>
This commit is contained in:
parent
44f385fd51
commit
9a7c6a5cc4
|
@ -18,7 +18,7 @@ The primary data structure for dealing with time series data is the sample, defi
|
||||||
```go
|
```go
|
||||||
type sample struct {
|
type sample struct {
|
||||||
Labels map[string]string
|
Labels map[string]string
|
||||||
Value float64
|
Value interface{}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ If functions are used in a pipeline, the pipeline value is passed as the last ar
|
||||||
| query | query string | []sample | Queries the database, does not support returning range vectors. |
|
| query | query string | []sample | Queries the database, does not support returning range vectors. |
|
||||||
| first | []sample | sample | Equivalent to `index a 0` |
|
| first | []sample | sample | Equivalent to `index a 0` |
|
||||||
| label | label, sample | string | Equivalent to `index sample.Labels label` |
|
| label | label, sample | string | Equivalent to `index sample.Labels label` |
|
||||||
| value | sample | float64 | Equivalent to `sample.Value` |
|
| value | sample | interface{} | Equivalent to `sample.Value` |
|
||||||
| sortByLabel | label, []samples | []sample | Sorts the samples by the given label. Is stable. |
|
| sortByLabel | label, []samples | []sample | Sorts the samples by the given label. Is stable. |
|
||||||
|
|
||||||
`first`, `label` and `value` are intended to make query results easily usable in pipelines.
|
`first`, `label` and `value` are intended to make query results easily usable in pipelines.
|
||||||
|
|
|
@ -57,7 +57,7 @@ func init() {
|
||||||
// A version of vector that's easier to use from templates.
|
// A version of vector that's easier to use from templates.
|
||||||
type sample struct {
|
type sample struct {
|
||||||
Labels map[string]string
|
Labels map[string]string
|
||||||
Value float64
|
Value interface{}
|
||||||
}
|
}
|
||||||
type queryResult []*sample
|
type queryResult []*sample
|
||||||
|
|
||||||
|
@ -96,6 +96,9 @@ func query(ctx context.Context, q string, ts time.Time, queryFn QueryFunc) (quer
|
||||||
Value: v.F,
|
Value: v.F,
|
||||||
Labels: v.Metric.Map(),
|
Labels: v.Metric.Map(),
|
||||||
}
|
}
|
||||||
|
if v.H != nil {
|
||||||
|
s.Value = v.H
|
||||||
|
}
|
||||||
result[n] = &s
|
result[n] = &s
|
||||||
}
|
}
|
||||||
return result, nil
|
return result, nil
|
||||||
|
@ -160,7 +163,7 @@ func NewTemplateExpander(
|
||||||
"label": func(label string, s *sample) string {
|
"label": func(label string, s *sample) string {
|
||||||
return s.Labels[label]
|
return s.Labels[label]
|
||||||
},
|
},
|
||||||
"value": func(s *sample) float64 {
|
"value": func(s *sample) interface{} {
|
||||||
return s.Value
|
return s.Value
|
||||||
},
|
},
|
||||||
"strvalue": func(s *sample) string {
|
"strvalue": func(s *sample) string {
|
||||||
|
|
|
@ -23,6 +23,7 @@ import (
|
||||||
|
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
|
|
||||||
|
"github.com/prometheus/prometheus/model/histogram"
|
||||||
"github.com/prometheus/prometheus/model/labels"
|
"github.com/prometheus/prometheus/model/labels"
|
||||||
"github.com/prometheus/prometheus/promql"
|
"github.com/prometheus/prometheus/promql"
|
||||||
)
|
)
|
||||||
|
@ -39,6 +40,12 @@ func TestTemplateExpansion(t *testing.T) {
|
||||||
text: "{{ 1 }}",
|
text: "{{ 1 }}",
|
||||||
output: "1",
|
output: "1",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// Native histogram value.
|
||||||
|
text: "{{ . | value }}",
|
||||||
|
input: &sample{Value: &histogram.FloatHistogram{Count: 3, Sum: 10}},
|
||||||
|
output: (&histogram.FloatHistogram{Count: 3, Sum: 10}).String(),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// Non-ASCII space (not allowed in text/template, see https://github.com/golang/go/blob/master/src/text/template/parse/lex.go#L98)
|
// Non-ASCII space (not allowed in text/template, see https://github.com/golang/go/blob/master/src/text/template/parse/lex.go#L98)
|
||||||
text: "{{ }}",
|
text: "{{ }}",
|
||||||
|
@ -84,6 +91,18 @@ func TestTemplateExpansion(t *testing.T) {
|
||||||
},
|
},
|
||||||
output: "11",
|
output: "11",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
// Get value of a native histogram from query.
|
||||||
|
text: "{{ query \"metric{instance='a'}\" | first | value }}",
|
||||||
|
queryResult: promql.Vector{
|
||||||
|
{
|
||||||
|
Metric: labels.FromStrings(labels.MetricName, "metric", "instance", "a"),
|
||||||
|
T: 0,
|
||||||
|
H: &histogram.FloatHistogram{Count: 3, Sum: 10},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
output: (&histogram.FloatHistogram{Count: 3, Sum: 10}).String(),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
// Get label from query.
|
// Get label from query.
|
||||||
text: "{{ query \"metric{instance='a'}\" | first | label \"instance\" }}",
|
text: "{{ query \"metric{instance='a'}\" | first | label \"instance\" }}",
|
||||||
|
|
Loading…
Reference in a new issue