feat: reject problematic histograms early · GoogleCloudPlatform/prometheus-engine@d4edf98 (original) (raw)
`@@ -64,14 +64,14 @@ func TestSampleBuilder(t *testing.T) {
`
64
64
` })
`
65
65
``
66
66
`cases := []struct {
`
67
``
`-
doc string
`
68
``
`-
metadata MetadataFunc
`
69
``
`-
series seriesMap
`
70
``
`-
samples [][]record.RefSample
`
71
``
`-
exemplars []map[storage.SeriesRef]record.RefExemplar
`
72
``
`-
matchers Matchers
`
73
``
`-
wantSeries []*monitoring_pb.TimeSeries
`
74
``
`-
wantFail bool
`
``
67
`+
doc string
`
``
68
`+
metadata MetadataFunc
`
``
69
`+
series seriesMap
`
``
70
`+
samples [][]record.RefSample
`
``
71
`+
exemplars []map[storage.SeriesRef]record.RefExemplar
`
``
72
`+
matchers Matchers
`
``
73
`+
wantSeries []*monitoring_pb.TimeSeries
`
``
74
`+
wantFailOnLastSample bool
`
75
75
` }{
`
76
76
` {
`
77
77
`doc: "convert gauge",
`
`@@ -1277,6 +1277,42 @@ func TestSampleBuilder(t *testing.T) {
`
1277
1277
` },
`
1278
1278
` },
`
1279
1279
` },
`
``
1280
`+
{
`
``
1281
`+
// Regression test for b/387200417.
`
``
1282
`+
doc: "histogram with conversion error for boundaries",
`
``
1283
`+
metadata: testMetadataFunc(metricMetadataMap{
`
``
1284
`+
"metric1": {Type: textparse.MetricTypeHistogram, Help: "metric1 help text"},
`
``
1285
`+
}),
`
``
1286
`+
series: seriesMap{
`
``
1287
`+
1: labels.FromStrings("job", "job1", "instance", "instance1", "name", "metric1_sum"),
`
``
1288
`+
2: labels.FromStrings("job", "job1", "instance", "instance1", "name", "metric1_count"),
`
``
1289
`+
3: labels.FromStrings("job", "job1", "instance", "instance1", "name", "metric1_bucket", "le", "0.5"),
`
``
1290
`+
4: labels.FromStrings("job", "job1", "instance", "instance1", "name", "metric1_bucket", "le", "0.50000000000000001"),
`
``
1291
`+
5: labels.FromStrings("job", "job1", "instance", "instance1", "name", "metric1_bucket", "le", "1"),
`
``
1292
`+
6: labels.FromStrings("job", "job1", "instance", "instance1", "name", "metric1_bucket", "le", "1.0"),
`
``
1293
`+
7: labels.FromStrings("job", "job1", "instance", "instance1", "name", "metric1_bucket", "le", "+Inf"),
`
``
1294
`+
},
`
``
1295
`+
samples: [][]record.RefSample{
`
``
1296
`+
{
`
``
1297
`+
{Ref: 3, T: 1000, V: 1}, // 0.5
`
``
1298
`+
{Ref: 4, T: 1000, V: 1}, // 0.50000000000000001
`
``
1299
`+
{Ref: 5, T: 1000, V: 5}, // 1
`
``
1300
`+
{Ref: 6, T: 1000, V: 5}, // 1.0
`
``
1301
`+
{Ref: 7, T: 1000, V: 10}, // +Inf
`
``
1302
`+
{Ref: 1, T: 1000, V: 8}, // sum
`
``
1303
`+
{Ref: 2, T: 1000, V: 10}, // count
`
``
1304
`+
}, {
`
``
1305
`+
{Ref: 3, T: 2000, V: 2}, // 0.5
`
``
1306
`+
{Ref: 4, T: 2000, V: 2}, // 0.50000000000000001
`
``
1307
`+
{Ref: 5, T: 2000, V: 6}, // 1
`
``
1308
`+
{Ref: 6, T: 2000, V: 6}, // 1.0
`
``
1309
`+
{Ref: 7, T: 2000, V: 11}, // +Inf
`
``
1310
`+
{Ref: 1, T: 2000, V: 9.5}, // sum
`
``
1311
`+
{Ref: 2, T: 2000, V: 11}, // count
`
``
1312
`+
},
`
``
1313
`+
},
`
``
1314
`+
wantFailOnLastSample: true,
`
``
1315
`+
},
`
1280
1316
` {
`
1281
1317
`doc: "convert histogram with exemplars",
`
1282
1318
`metadata: testMetadataFunc(metricMetadataMap{
`
`@@ -1497,14 +1533,13 @@ func TestSampleBuilder(t *testing.T) {
`
1497
1533
`exemplars = c.exemplars[i]
`
1498
1534
` }
`
1499
1535
`out, tail, err := b.next(c.metadata, externalLabels, batch, exemplars)
`
1500
``
`-
if err == nil && c.wantFail {
`
1501
``
`-
t.Fatal("expected error but got none")
`
1502
``
`-
}
`
1503
``
`-
if err != nil && !c.wantFail {
`
1504
``
`-
t.Fatalf("unexpected error: %s", err)
`
1505
``
`-
}
`
1506
``
`-
if err != nil {
`
``
1536
`+
if c.wantFailOnLastSample && len(c.samples) == i+1 {
`
``
1537
`+
if err == nil {
`
``
1538
`+
t.Fatal("expected error but got none")
`
``
1539
`+
}
`
1507
1540
`break
`
``
1541
`+
} else if err != nil {
`
``
1542
`+
t.Fatalf("unexpected error: %s %d", err, i)
`
1508
1543
` }
`
1509
1544
`if len(tail) >= len(batch) {
`
1510
1545
`t.Fatalf("no sample was consumed")
`