Fix metric comparison for empty labels
reflect.DeepEqual is not suitable for zero occurrences of repeated proto messages. This changes the comparison to act on the string representation of proto messages. Signed-off-by: beorn7 <beorn@soundcloud.com>
This commit is contained in:
parent
1db43792db
commit
86702ea6b4
|
@ -37,7 +37,6 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"reflect"
|
|
||||||
|
|
||||||
"github.com/prometheus/common/expfmt"
|
"github.com/prometheus/common/expfmt"
|
||||||
|
|
||||||
|
@ -125,35 +124,45 @@ func CollectAndCompare(c prometheus.Collector, expected io.Reader, metricNames .
|
||||||
// exposition format. If any metricNames are provided, only metrics with those
|
// exposition format. If any metricNames are provided, only metrics with those
|
||||||
// names are compared.
|
// names are compared.
|
||||||
func GatherAndCompare(g prometheus.Gatherer, expected io.Reader, metricNames ...string) error {
|
func GatherAndCompare(g prometheus.Gatherer, expected io.Reader, metricNames ...string) error {
|
||||||
metrics, err := g.Gather()
|
got, err := g.Gather()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("gathering metrics failed: %s", err)
|
return fmt.Errorf("gathering metrics failed: %s", err)
|
||||||
}
|
}
|
||||||
if metricNames != nil {
|
if metricNames != nil {
|
||||||
metrics = filterMetrics(metrics, metricNames)
|
got = filterMetrics(got, metricNames)
|
||||||
}
|
}
|
||||||
var tp expfmt.TextParser
|
var tp expfmt.TextParser
|
||||||
expectedMetrics, err := tp.TextToMetricFamilies(expected)
|
wantRaw, err := tp.TextToMetricFamilies(expected)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("parsing expected metrics failed: %s", err)
|
return fmt.Errorf("parsing expected metrics failed: %s", err)
|
||||||
}
|
}
|
||||||
|
want := internal.NormalizeMetricFamilies(wantRaw)
|
||||||
|
|
||||||
if !reflect.DeepEqual(metrics, internal.NormalizeMetricFamilies(expectedMetrics)) {
|
if len(got) != len(want) {
|
||||||
// Encode the gathered output to the readable text format for comparison.
|
return notMatchingError(got, want)
|
||||||
var buf1 bytes.Buffer
|
}
|
||||||
enc := expfmt.NewEncoder(&buf1, expfmt.FmtText)
|
for i := range got {
|
||||||
for _, mf := range metrics {
|
if got[i].String() != want[i].String() {
|
||||||
if err := enc.Encode(mf); err != nil {
|
return notMatchingError(got, want)
|
||||||
return fmt.Errorf("encoding result failed: %s", err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Encode normalized expected metrics again to generate them in the same ordering
|
return nil
|
||||||
// the registry does to spot differences more easily.
|
}
|
||||||
var buf2 bytes.Buffer
|
|
||||||
enc = expfmt.NewEncoder(&buf2, expfmt.FmtText)
|
// notMatchingError encodes both provided slices of metric families into the
|
||||||
for _, mf := range internal.NormalizeMetricFamilies(expectedMetrics) {
|
// text format and creates a readable error message from the result.
|
||||||
|
func notMatchingError(got, want []*dto.MetricFamily) error {
|
||||||
|
var gotBuf, wantBuf bytes.Buffer
|
||||||
|
enc := expfmt.NewEncoder(&gotBuf, expfmt.FmtText)
|
||||||
|
for _, mf := range got {
|
||||||
if err := enc.Encode(mf); err != nil {
|
if err := enc.Encode(mf); err != nil {
|
||||||
return fmt.Errorf("encoding result failed: %s", err)
|
return fmt.Errorf("encoding gathered metrics failed: %s", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enc = expfmt.NewEncoder(&wantBuf, expfmt.FmtText)
|
||||||
|
for _, mf := range want {
|
||||||
|
if err := enc.Encode(mf); err != nil {
|
||||||
|
return fmt.Errorf("encoding expected metrics failed: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,9 +174,7 @@ metric output does not match expectation; want:
|
||||||
got:
|
got:
|
||||||
|
|
||||||
%s
|
%s
|
||||||
`, buf2.String(), buf1.String())
|
`, wantBuf.String(), gotBuf.String())
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func filterMetrics(metrics []*dto.MetricFamily, names []string) []*dto.MetricFamily {
|
func filterMetrics(metrics []*dto.MetricFamily, names []string) []*dto.MetricFamily {
|
||||||
|
|
Loading…
Reference in New Issue