add label value validation to NewConstMetric and friends

This commit is contained in:
Marco Jantke 2017-08-19 22:57:48 +02:00
parent 459e88167e
commit 703c4a9c6f
5 changed files with 56 additions and 8 deletions

View File

@ -430,8 +430,8 @@ func NewConstHistogram(
buckets map[float64]uint64, buckets map[float64]uint64,
labelValues ...string, labelValues ...string,
) (Metric, error) { ) (Metric, error) {
if len(desc.variableLabels) != len(labelValues) { if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil {
return nil, errInconsistentCardinality return nil, err
} }
return &constHistogram{ return &constHistogram{
desc: desc, desc: desc,

View File

@ -543,8 +543,8 @@ func NewConstSummary(
quantiles map[float64]float64, quantiles map[float64]float64,
labelValues ...string, labelValues ...string,
) (Metric, error) { ) (Metric, error) {
if len(desc.variableLabels) != len(labelValues) { if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil {
return nil, errInconsistentCardinality return nil, err
} }
return &constSummary{ return &constSummary{
desc: desc, desc: desc,

View File

@ -158,8 +158,8 @@ func (v *valueFunc) Write(out *dto.Metric) error {
// the Collect method. NewConstMetric returns an error if the length of // the Collect method. NewConstMetric returns an error if the length of
// labelValues is not consistent with the variable labels in Desc. // labelValues is not consistent with the variable labels in Desc.
func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) { func NewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) (Metric, error) {
if len(desc.variableLabels) != len(labelValues) { if err := validateLabelValues(labelValues, len(desc.variableLabels)); err != nil {
return nil, errInconsistentCardinality return nil, err
} }
return &constMetric{ return &constMetric{
desc: desc, desc: desc,

48
prometheus/value_test.go Normal file
View File

@ -0,0 +1,48 @@
package prometheus
import (
"fmt"
"testing"
)
func TestNewConstMetricInvalidLabelValues(t *testing.T) {
testCases := []struct {
desc string
labels Labels
}{
{
desc: "non utf8 label value",
labels: Labels{"a": "\xFF"},
},
{
desc: "not enough label values",
labels: Labels{},
},
{
desc: "too many label values",
labels: Labels{"a": "1", "b": "2"},
},
}
for _, test := range testCases {
test := test
t.Run(test.desc, func(t *testing.T) {
t.Parallel()
metricDesc := NewDesc(
"sample_value",
"sample value",
[]string{"a"},
Labels{},
)
expectPanic(t, func() {
MustNewConstMetric(metricDesc, CounterValue, 0.3, "\xFF")
}, fmt.Sprintf("WithLabelValues: expected panic because: %s", test.desc))
if _, err := NewConstMetric(metricDesc, CounterValue, 0.3, "\xFF"); err == nil {
t.Errorf("NewConstMetric: expected error because: %s", test.desc)
}
})
}
}

View File

@ -207,7 +207,7 @@ func (m *metricVec) Reset() {
} }
func (m *metricVec) hashLabelValues(vals []string) (uint64, error) { func (m *metricVec) hashLabelValues(vals []string) (uint64, error) {
if err := validateLabelValues(m.desc, vals); err != nil { if err := validateLabelValues(vals, len(m.desc.variableLabels)); err != nil {
return 0, err return 0, err
} }
@ -220,7 +220,7 @@ func (m *metricVec) hashLabelValues(vals []string) (uint64, error) {
} }
func (m *metricVec) hashLabels(labels Labels) (uint64, error) { func (m *metricVec) hashLabels(labels Labels) (uint64, error) {
if err := validateLabels(m.desc, labels); err != nil { if err := validateLabels(labels, len(m.desc.variableLabels)); err != nil {
return 0, err return 0, err
} }