Add more label checksn during gathering

Including check for an invalid "quantile" label in summaries.

Also, improve error messages.

Signed-off-by: beorn7 <beorn@soundcloud.com>
This commit is contained in:
beorn7 2018-07-13 14:14:39 +02:00
parent e064aa97f1
commit 767a0218df
3 changed files with 19 additions and 5 deletions

View File

@ -740,7 +740,7 @@ temperature_kelvin 4.5
// temperature_kelvin{location="outside"} 273.14 // temperature_kelvin{location="outside"} 273.14
// temperature_kelvin{location="somewhere else"} 4.5 // temperature_kelvin{location="somewhere else"} 4.5
// ---------- // ----------
// collected metric temperature_kelvin label:<name:"location" value:"outside" > gauge:<value:265.3 > was collected before with the same name and label values // collected metric "temperature_kelvin" { label:<name:"location" value:"outside" > gauge:<value:265.3 > } was collected before with the same name and label values
// # HELP humidity_percent Humidity in %. // # HELP humidity_percent Humidity in %.
// # TYPE humidity_percent gauge // # TYPE humidity_percent gauge
// humidity_percent{location="inside"} 33.2 // humidity_percent{location="inside"} 33.2

View File

@ -783,14 +783,28 @@ func checkMetricConsistency(
metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil || metricFamily.GetType() == dto.MetricType_HISTOGRAM && dtoMetric.Histogram == nil ||
metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil { metricFamily.GetType() == dto.MetricType_UNTYPED && dtoMetric.Untyped == nil {
return fmt.Errorf( return fmt.Errorf(
"collected metric %s %s is not a %s", "collected metric %q { %s} is not a %s",
metricFamily.GetName(), dtoMetric, metricFamily.GetType(), metricFamily.GetName(), dtoMetric, metricFamily.GetType(),
) )
} }
for _, labelPair := range dtoMetric.GetLabel() { for _, labelPair := range dtoMetric.GetLabel() {
if !checkLabelName(labelPair.GetName()) {
return fmt.Errorf(
"collected metric %q { %s} has a label with an invalid name: %s",
metricFamily.GetName(), dtoMetric, labelPair.GetName(),
)
}
if dtoMetric.Summary != nil && labelPair.GetName() == quantileLabel {
return fmt.Errorf(
"collected metric %q { %s} must not have an explicit %q label",
metricFamily.GetName(), dtoMetric, quantileLabel,
)
}
if !utf8.ValidString(labelPair.GetValue()) { if !utf8.ValidString(labelPair.GetValue()) {
return fmt.Errorf("collected metric's label %s is not utf8: %#v", labelPair.GetName(), labelPair.GetValue()) return fmt.Errorf(
"collected metric %q { %s} has a label named %q whose value is not utf8: %#v",
metricFamily.GetName(), dtoMetric, labelPair.GetName(), labelPair.GetValue())
} }
} }
@ -809,7 +823,7 @@ func checkMetricConsistency(
} }
if _, exists := metricHashes[h]; exists { if _, exists := metricHashes[h]; exists {
return fmt.Errorf( return fmt.Errorf(
"collected metric %s %s was collected before with the same name and label values", "collected metric %q { %s} was collected before with the same name and label values",
metricFamily.GetName(), dtoMetric, metricFamily.GetName(), dtoMetric,
) )
} }

View File

@ -249,7 +249,7 @@ metric: <
expectedMetricFamilyInvalidLabelValueAsText := []byte(`An error has occurred during metrics gathering: expectedMetricFamilyInvalidLabelValueAsText := []byte(`An error has occurred during metrics gathering:
collected metric's label constname is not utf8: "\xff" collected metric "name" { label:<name:"constname" value:"\377" > label:<name:"labelname" value:"different_val" > counter:<value:42 > } has a label named "constname" whose value is not utf8: "\xff"
`) `)
type output struct { type output struct {