From 1c3bd04beae91e7abae55903c814b67869cd7186 Mon Sep 17 00:00:00 2001 From: beorn7 Date: Wed, 12 Jul 2023 18:17:35 +0200 Subject: [PATCH] histograms: Modify test to expose bug #12552 Signed-off-by: beorn7 --- model/textparse/protobufparse_test.go | 297 +++++++++++++++++++++++--- 1 file changed, 263 insertions(+), 34 deletions(-) diff --git a/model/textparse/protobufparse_test.go b/model/textparse/protobufparse_test.go index 882cce59d..88ad9f221 100644 --- a/model/textparse/protobufparse_test.go +++ b/model/textparse/protobufparse_test.go @@ -408,6 +408,61 @@ metric: < > > +`, + `name: "test_histogram_family" +help: "Test histogram metric family with two very simple histograms." +type: HISTOGRAM +metric: < + label: < + name: "foo" + value: "bar" + > + histogram: < + sample_count: 5 + sample_sum: 12.1 + bucket: < + cumulative_count: 2 + upper_bound: 1.1 + > + bucket: < + cumulative_count: 3 + upper_bound: 2.2 + > + schema: 3 + positive_span: < + offset: 8 + length: 2 + > + positive_delta: 2 + positive_delta: 1 + > +> +metric: < + label: < + name: "foo" + value: "baz" + > + histogram: < + sample_count: 6 + sample_sum: 13.1 + bucket: < + cumulative_count: 1 + upper_bound: 1.1 + > + bucket: < + cumulative_count: 5 + upper_bound: 2.2 + > + schema: 3 + positive_span: < + offset: 8 + length: 2 + > + positive_delta: 1 + positive_delta: 4 + > +> + `, `name: "rpc_durations_seconds" help: "RPC latency distributions." @@ -751,6 +806,50 @@ func TestProtobufParse(t *testing.T) { "le", "+Inf", ), }, + { + m: "test_histogram_family", + help: "Test histogram metric family with two very simple histograms.", + }, + { + m: "test_histogram_family", + typ: MetricTypeHistogram, + }, + { + m: "test_histogram_family\xfffoo\xffbar", + shs: &histogram.Histogram{ + CounterResetHint: histogram.UnknownCounterReset, + Count: 5, + Sum: 12.1, + Schema: 3, + PositiveSpans: []histogram.Span{ + {Offset: 8, Length: 2}, + }, + NegativeSpans: []histogram.Span{}, + PositiveBuckets: []int64{2, 1}, + }, + lset: labels.FromStrings( + "__name__", "test_histogram_family", + "foo", "bar", + ), + }, + { + m: "test_histogram_family\xfffoo\xffbaz", + shs: &histogram.Histogram{ + CounterResetHint: histogram.UnknownCounterReset, + Count: 6, + Sum: 13.1, + Schema: 3, + PositiveSpans: []histogram.Span{ + {Offset: 8, Length: 2}, + }, + NegativeSpans: []histogram.Span{}, + PositiveBuckets: []int64{1, 4}, + }, + lset: labels.FromStrings( + "__name__", "test_histogram_family", + "foo", "baz", + ), + }, { m: "rpc_durations_seconds", help: "RPC latency distributions.", @@ -1321,14 +1420,144 @@ func TestProtobufParse(t *testing.T) { ), }, { // 53 + m: "test_histogram_family", + help: "Test histogram metric family with two very simple histograms.", + }, + { // 54 + m: "test_histogram_family", + typ: MetricTypeHistogram, + }, + { // 55 + m: "test_histogram_family\xfffoo\xffbar", + shs: &histogram.Histogram{ + CounterResetHint: histogram.UnknownCounterReset, + Count: 5, + Sum: 12.1, + Schema: 3, + PositiveSpans: []histogram.Span{ + {Offset: 8, Length: 2}, + }, + NegativeSpans: []histogram.Span{}, + PositiveBuckets: []int64{2, 1}, + }, + lset: labels.FromStrings( + "__name__", "test_histogram_family", + "foo", "bar", + ), + }, + { // 56 + m: "test_histogram_family_count\xfffoo\xffbar", + v: 5, + lset: labels.FromStrings( + "__name__", "test_histogram_family_count", + "foo", "bar", + ), + }, + { // 57 + m: "test_histogram_family_sum\xfffoo\xffbar", + v: 12.1, + lset: labels.FromStrings( + "__name__", "test_histogram_family_sum", + "foo", "bar", + ), + }, + { // 58 + m: "test_histogram_family_bucket\xfffoo\xffbar\xffle\xff1.1", + v: 2, + lset: labels.FromStrings( + "__name__", "test_histogram_family_bucket", + "foo", "bar", + "le", "1.1", + ), + }, + { // 59 + m: "test_histogram_family_bucket\xfffoo\xffbar\xffle\xff2.2", + v: 3, + lset: labels.FromStrings( + "__name__", "test_histogram_family_bucket", + "foo", "bar", + "le", "2.2", + ), + }, + { // 60 + m: "test_histogram_family_bucket\xfffoo\xffbar\xffle\xff+Inf", + v: 5, + lset: labels.FromStrings( + "__name__", "test_histogram_family_bucket", + "foo", "bar", + "le", "+Inf", + ), + }, + { // 61 + m: "test_histogram_family\xfffoo\xffbaz", + shs: &histogram.Histogram{ + CounterResetHint: histogram.UnknownCounterReset, + Count: 6, + Sum: 13.1, + Schema: 3, + PositiveSpans: []histogram.Span{ + {Offset: 8, Length: 2}, + }, + NegativeSpans: []histogram.Span{}, + PositiveBuckets: []int64{1, 4}, + }, + lset: labels.FromStrings( + "__name__", "test_histogram_family", + "foo", "baz", + ), + }, + { // 62 + m: "test_histogram_family_count\xfffoo\xffbaz", + v: 6, + lset: labels.FromStrings( + "__name__", "test_histogram_family_count", + "foo", "baz", + ), + }, + { // 63 + m: "test_histogram_family_sum\xfffoo\xffbaz", + v: 13.1, + lset: labels.FromStrings( + "__name__", "test_histogram_family_sum", + "foo", "baz", + ), + }, + { // 64 + m: "test_histogram_family_bucket\xfffoo\xffbaz\xffle\xff1.1", + v: 1, + lset: labels.FromStrings( + "__name__", "test_histogram_family_bucket", + "foo", "baz", + "le", "1.1", + ), + }, + { // 65 + m: "test_histogram_family_bucket\xfffoo\xffbaz\xffle\xff2.2", + v: 5, + lset: labels.FromStrings( + "__name__", "test_histogram_family_bucket", + "foo", "baz", + "le", "2.2", + ), + }, + { // 66 + m: "test_histogram_family_bucket\xfffoo\xffbaz\xffle\xff+Inf", + v: 6, + lset: labels.FromStrings( + "__name__", "test_histogram_family_bucket", + "foo", "baz", + "le", "+Inf", + ), + }, + { // 67 m: "rpc_durations_seconds", help: "RPC latency distributions.", }, - { // 54 + { // 68 m: "rpc_durations_seconds", typ: MetricTypeSummary, }, - { // 55 + { // 69 m: "rpc_durations_seconds_count\xffservice\xffexponential", v: 262, lset: labels.FromStrings( @@ -1336,7 +1565,7 @@ func TestProtobufParse(t *testing.T) { "service", "exponential", ), }, - { // 56 + { // 70 m: "rpc_durations_seconds_sum\xffservice\xffexponential", v: 0.00025551262820703587, lset: labels.FromStrings( @@ -1344,7 +1573,7 @@ func TestProtobufParse(t *testing.T) { "service", "exponential", ), }, - { // 57 + { // 71 m: "rpc_durations_seconds\xffservice\xffexponential\xffquantile\xff0.5", v: 6.442786329648548e-07, lset: labels.FromStrings( @@ -1353,7 +1582,7 @@ func TestProtobufParse(t *testing.T) { "service", "exponential", ), }, - { // 58 + { // 72 m: "rpc_durations_seconds\xffservice\xffexponential\xffquantile\xff0.9", v: 1.9435742936658396e-06, lset: labels.FromStrings( @@ -1362,7 +1591,7 @@ func TestProtobufParse(t *testing.T) { "service", "exponential", ), }, - { // 59 + { // 73 m: "rpc_durations_seconds\xffservice\xffexponential\xffquantile\xff0.99", v: 4.0471608667037015e-06, lset: labels.FromStrings( @@ -1371,22 +1600,22 @@ func TestProtobufParse(t *testing.T) { "service", "exponential", ), }, - { // 60 + { // 74 m: "without_quantiles", help: "A summary without quantiles.", }, - { // 61 + { // 75 m: "without_quantiles", typ: MetricTypeSummary, }, - { // 62 + { // 76 m: "without_quantiles_count", v: 42, lset: labels.FromStrings( "__name__", "without_quantiles_count", ), }, - { // 63 + { // 77 m: "without_quantiles_sum", v: 1.234, lset: labels.FromStrings( @@ -1420,61 +1649,61 @@ func TestProtobufParse(t *testing.T) { var e exemplar.Exemplar p.Metric(&res) found := p.Exemplar(&e) - require.Equal(t, exp[i].m, string(m)) + require.Equal(t, exp[i].m, string(m), "i: %d", i) if ts != nil { - require.Equal(t, exp[i].t, *ts) + require.Equal(t, exp[i].t, *ts, "i: %d", i) } else { - require.Equal(t, exp[i].t, int64(0)) + require.Equal(t, exp[i].t, int64(0), "i: %d", i) } - require.Equal(t, exp[i].v, v) - require.Equal(t, exp[i].lset, res) + require.Equal(t, exp[i].v, v, "i: %d", i) + require.Equal(t, exp[i].lset, res, "i: %d", i) if len(exp[i].e) == 0 { - require.Equal(t, false, found) + require.Equal(t, false, found, "i: %d", i) } else { - require.Equal(t, true, found) - require.Equal(t, exp[i].e[0], e) + require.Equal(t, true, found, "i: %d", i) + require.Equal(t, exp[i].e[0], e, "i: %d", i) } case EntryHistogram: m, ts, shs, fhs := p.Histogram() p.Metric(&res) - require.Equal(t, exp[i].m, string(m)) + require.Equal(t, exp[i].m, string(m), "i: %d", i) if ts != nil { - require.Equal(t, exp[i].t, *ts) + require.Equal(t, exp[i].t, *ts, "i: %d", i) } else { - require.Equal(t, exp[i].t, int64(0)) + require.Equal(t, exp[i].t, int64(0), "i: %d", i) } - require.Equal(t, exp[i].lset, res) - require.Equal(t, exp[i].m, string(m)) + require.Equal(t, exp[i].lset, res, "i: %d", i) + require.Equal(t, exp[i].m, string(m), "i: %d", i) if shs != nil { - require.Equal(t, exp[i].shs, shs) + require.Equal(t, exp[i].shs, shs, "i: %d", i) } else { - require.Equal(t, exp[i].fhs, fhs) + require.Equal(t, exp[i].fhs, fhs, "i: %d", i) } j := 0 for e := (exemplar.Exemplar{}); p.Exemplar(&e); j++ { - require.Equal(t, exp[i].e[j], e) + require.Equal(t, exp[i].e[j], e, "i: %d", i) e = exemplar.Exemplar{} } - require.Equal(t, len(exp[i].e), j, "not enough exemplars found") + require.Equal(t, len(exp[i].e), j, "not enough exemplars found, i: %d", i) case EntryType: m, typ := p.Type() - require.Equal(t, exp[i].m, string(m)) - require.Equal(t, exp[i].typ, typ) + require.Equal(t, exp[i].m, string(m), "i: %d", i) + require.Equal(t, exp[i].typ, typ, "i: %d", i) case EntryHelp: m, h := p.Help() - require.Equal(t, exp[i].m, string(m)) - require.Equal(t, exp[i].help, string(h)) + require.Equal(t, exp[i].m, string(m), "i: %d", i) + require.Equal(t, exp[i].help, string(h), "i: %d", i) case EntryUnit: m, u := p.Unit() - require.Equal(t, exp[i].m, string(m)) - require.Equal(t, exp[i].unit, string(u)) + require.Equal(t, exp[i].m, string(m), "i: %d", i) + require.Equal(t, exp[i].unit, string(u), "i: %d", i) case EntryComment: - require.Equal(t, exp[i].comment, string(p.Comment())) + require.Equal(t, exp[i].comment, string(p.Comment()), "i: %d", i) } i++