forked from mirror/client_golang
add label value validation to NewConstMetric and friends
This commit is contained in:
parent
459e88167e
commit
703c4a9c6f
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue