histograms: Modify test to expose bug #12552

Signed-off-by: beorn7 <beorn@grafana.com>
This commit is contained in:
beorn7 2023-07-12 18:17:35 +02:00
parent 162612ea86
commit 1c3bd04bea
1 changed files with 263 additions and 34 deletions

View File

@ -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++