From d3b95fae44bc7e0de85671f1e46e15ebf0d9bdf2 Mon Sep 17 00:00:00 2001 From: Etienne Perot Date: Mon, 21 Oct 2024 12:06:43 -0700 Subject: [PATCH] Deflake `prometheus_test:TestWriteMultipleSnapshots`. The Prometheus parser doesn't guarantee that it returns metric data in timestamp-sorted order. So sort it in the test manually. Before: Fails 7 out of 2048 times After: Fails 0 out of 2048 times PiperOrigin-RevId: 688224325 --- pkg/prometheus/prometheus_test.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pkg/prometheus/prometheus_test.go b/pkg/prometheus/prometheus_test.go index df0936bf3..0fc63844f 100644 --- a/pkg/prometheus/prometheus_test.go +++ b/pkg/prometheus/prometheus_test.go @@ -20,6 +20,7 @@ import ( "fmt" "io" "math" + "sort" "strings" "sync" "testing" @@ -1631,14 +1632,18 @@ func TestWriteMultipleSnapshots(t *testing.T) { snapshot1: {ExporterPrefix: "export_"}, snapshot2: {ExporterPrefix: "export_"}, }) + fooIntName := "export_" + fooInt.PB.GetPrometheusName() gotData, err := (&expfmt.TextParser{}).TextToMetricFamilies(&buf) if err != nil { t.Fatalf("cannot parse data written from snapshots: %v", err) } - if len(gotData) != 1 || gotData["export_"+fooInt.PB.GetPrometheusName()] == nil { + if len(gotData) != 1 || gotData[fooIntName] == nil { t.Fatalf("unexpected data: %v", gotData) } - got := reflectProto(gotData["export_"+fooInt.PB.GetPrometheusName()]) + sort.Slice(gotData[fooIntName].Metric, func(i, j int) bool { + return gotData[fooIntName].Metric[i].GetTimestampMs() < gotData[fooIntName].Metric[j].GetTimestampMs() + }) + got := reflectProto(gotData[fooIntName]) var wantBuf bytes.Buffer io.WriteString(&wantBuf, fmt.Sprintf(` # HELP export_foo_int An integer about foo @@ -1650,10 +1655,13 @@ func TestWriteMultipleSnapshots(t *testing.T) { if err != nil { t.Fatalf("cannot parse reference data: %v", err) } - if len(wantData) != 1 || wantData["export_"+fooInt.PB.GetPrometheusName()] == nil { + if len(wantData) != 1 || wantData[fooIntName] == nil { t.Fatalf("unexpected reference data: %v", gotData) } - want := reflectProto(wantData["export_"+fooInt.PB.GetPrometheusName()]) + sort.Slice(wantData[fooIntName].Metric, func(i, j int) bool { + return wantData[fooIntName].Metric[i].GetTimestampMs() < wantData[fooIntName].Metric[j].GetTimestampMs() + }) + want := reflectProto(wantData[fooIntName]) if diff := cmp.Diff(want, got, protocmp.Transform()); diff != "" { multiLineFormatter := &prototext.MarshalOptions{Multiline: true, Indent: " ", EmitUnknown: true} wantText, err := multiLineFormatter.Marshal(want)