Skip to content

Commit ca9acd2

Browse files
authored
Merge pull request prometheus#497 from prometheus/beorn7/testing
Fix testutil metric comparison
2 parents abad2d1 + 86702ea commit ca9acd2

File tree

2 files changed

+53
-24
lines changed

2 files changed

+53
-24
lines changed

prometheus/testutil/testutil.go

+31-24
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import (
3737
"bytes"
3838
"fmt"
3939
"io"
40-
"reflect"
4140

4241
"github.com/prometheus/common/expfmt"
4342

@@ -125,49 +124,57 @@ func CollectAndCompare(c prometheus.Collector, expected io.Reader, metricNames .
125124
// exposition format. If any metricNames are provided, only metrics with those
126125
// names are compared.
127126
func GatherAndCompare(g prometheus.Gatherer, expected io.Reader, metricNames ...string) error {
128-
metrics, err := g.Gather()
127+
got, err := g.Gather()
129128
if err != nil {
130129
return fmt.Errorf("gathering metrics failed: %s", err)
131130
}
132131
if metricNames != nil {
133-
metrics = filterMetrics(metrics, metricNames)
132+
got = filterMetrics(got, metricNames)
134133
}
135134
var tp expfmt.TextParser
136-
expectedMetrics, err := tp.TextToMetricFamilies(expected)
135+
wantRaw, err := tp.TextToMetricFamilies(expected)
137136
if err != nil {
138137
return fmt.Errorf("parsing expected metrics failed: %s", err)
139138
}
139+
want := internal.NormalizeMetricFamilies(wantRaw)
140140

141-
if !reflect.DeepEqual(metrics, internal.NormalizeMetricFamilies(expectedMetrics)) {
142-
// Encode the gathered output to the readable text format for comparison.
143-
var buf1 bytes.Buffer
144-
enc := expfmt.NewEncoder(&buf1, expfmt.FmtText)
145-
for _, mf := range metrics {
146-
if err := enc.Encode(mf); err != nil {
147-
return fmt.Errorf("encoding result failed: %s", err)
148-
}
141+
if len(got) != len(want) {
142+
return notMatchingError(got, want)
143+
}
144+
for i := range got {
145+
if got[i].String() != want[i].String() {
146+
return notMatchingError(got, want)
149147
}
150-
// Encode normalized expected metrics again to generate them in the same ordering
151-
// the registry does to spot differences more easily.
152-
var buf2 bytes.Buffer
153-
enc = expfmt.NewEncoder(&buf2, expfmt.FmtText)
154-
for _, mf := range internal.NormalizeMetricFamilies(expectedMetrics) {
155-
if err := enc.Encode(mf); err != nil {
156-
return fmt.Errorf("encoding result failed: %s", err)
157-
}
148+
}
149+
return nil
150+
}
151+
152+
// notMatchingError encodes both provided slices of metric families into the
153+
// text format and creates a readable error message from the result.
154+
func notMatchingError(got, want []*dto.MetricFamily) error {
155+
var gotBuf, wantBuf bytes.Buffer
156+
enc := expfmt.NewEncoder(&gotBuf, expfmt.FmtText)
157+
for _, mf := range got {
158+
if err := enc.Encode(mf); err != nil {
159+
return fmt.Errorf("encoding gathered metrics failed: %s", err)
160+
}
161+
}
162+
enc = expfmt.NewEncoder(&wantBuf, expfmt.FmtText)
163+
for _, mf := range want {
164+
if err := enc.Encode(mf); err != nil {
165+
return fmt.Errorf("encoding expected metrics failed: %s", err)
158166
}
167+
}
159168

160-
return fmt.Errorf(`
169+
return fmt.Errorf(`
161170
metric output does not match expectation; want:
162171
163172
%s
164173
165174
got:
166175
167176
%s
168-
`, buf2.String(), buf1.String())
169-
}
170-
return nil
177+
`, wantBuf.String(), gotBuf.String())
171178
}
172179

173180
func filterMetrics(metrics []*dto.MetricFamily, names []string) []*dto.MetricFamily {

prometheus/testutil/testutil_test.go

+22
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,28 @@ func TestCollectAndCompare(t *testing.T) {
143143
}
144144
}
145145

146+
func TestCollectAndCompareNoLabel(t *testing.T) {
147+
const metadata = `
148+
# HELP some_total A value that represents a counter.
149+
# TYPE some_total counter
150+
`
151+
152+
c := prometheus.NewCounter(prometheus.CounterOpts{
153+
Name: "some_total",
154+
Help: "A value that represents a counter.",
155+
})
156+
c.Inc()
157+
158+
expected := `
159+
160+
some_total 1
161+
`
162+
163+
if err := CollectAndCompare(c, strings.NewReader(metadata+expected), "some_total"); err != nil {
164+
t.Errorf("unexpected collecting result:\n%s", err)
165+
}
166+
}
167+
146168
func TestNoMetricFilter(t *testing.T) {
147169
const metadata = `
148170
# HELP some_total A value that represents a counter.

0 commit comments

Comments
 (0)