From d18be2af157ee74f39b088a454764556d885b211 Mon Sep 17 00:00:00 2001 From: Lukasz Mierzwa Date: Thu, 12 Mar 2026 14:19:45 +0000 Subject: [PATCH] fix(api): use correct response for silence preview --- cmd/karma/views.go | 8 +-- cmd/karma/views_test.go | 132 ++++++++++++++++++++-------------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/cmd/karma/views.go b/cmd/karma/views.go index 9cdf787d3..027e5efa7 100644 --- a/cmd/karma/views.go +++ b/cmd/karma/views.go @@ -672,7 +672,7 @@ func silences(w http.ResponseWriter, r *http.Request) { } type AlertList struct { - Alerts []promlabels.Labels `json:"alerts"` + Alerts []models.OrderedLabels `json:"alerts"` } func alertList(w http.ResponseWriter, r *http.Request) { @@ -719,10 +719,10 @@ func alertList(w http.ResponseWriter, r *http.Request) { sort.Strings(sortKeys) al := AlertList{ - Alerts: []promlabels.Labels{}, + Alerts: []models.OrderedLabels{}, } for _, lm := range labelMap { - al.Alerts = append(al.Alerts, models.LabelsFromMap(lm)) + al.Alerts = append(al.Alerts, models.LabelsToOrderedLabels(models.LabelsFromMap(lm))) } sortSliceOfLabels(al.Alerts, sortKeys, "alertname") @@ -733,7 +733,7 @@ func alertList(w http.ResponseWriter, r *http.Request) { _, _ = w.Write(data) } -func sortSliceOfLabels(ls []promlabels.Labels, sortKeys []string, fallback string) { +func sortSliceOfLabels(ls []models.OrderedLabels, sortKeys []string, fallback string) { sort.SliceStable(ls, func(i, j int) bool { for _, k := range sortKeys { vi := ls[i].Get(k) diff --git a/cmd/karma/views_test.go b/cmd/karma/views_test.go index 13e3e7f8e..a159af03f 100644 --- a/cmd/karma/views_test.go +++ b/cmd/karma/views_test.go @@ -2582,61 +2582,61 @@ func TestAlertList(t *testing.T) { { args: "", alerts: AlertList{ - Alerts: []promlabels.Labels{ - promlabels.FromStrings("alertname", "Free_Disk_Space_Too_Low", "cluster", "staging", "disk", "sda", "instance", "server5", "job", "node_exporter"), - promlabels.FromStrings("alertname", "HTTP_Probe_Failed", "cluster", "dev", "instance", "web1", "job", "node_exporter"), - promlabels.FromStrings("alertname", "HTTP_Probe_Failed", "cluster", "dev", "instance", "web2", "job", "node_exporter"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "dev", "instance", "server6", "ip", "127.0.0.6", "job", "node_ping"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "dev", "instance", "server7", "ip", "127.0.0.7", "job", "node_ping"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "dev", "instance", "server8", "ip", "127.0.0.8", "job", "node_ping"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server1", "ip", "127.0.0.1", "job", "node_ping"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server2", "ip", "127.0.0.2", "job", "node_ping"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "staging", "instance", "server3", "ip", "127.0.0.3", "job", "node_ping"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "staging", "instance", "server4", "ip", "127.0.0.4", "job", "node_ping"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "staging", "instance", "server5", "ip", "127.0.0.5", "job", "node_ping"), - promlabels.FromStrings("alertname", "Memory_Usage_Too_High", "cluster", "prod", "instance", "server2", "job", "node_exporter"), + Alerts: []models.OrderedLabels{ + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Free_Disk_Space_Too_Low", "cluster", "staging", "disk", "sda", "instance", "server5", "job", "node_exporter")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "HTTP_Probe_Failed", "cluster", "dev", "instance", "web1", "job", "node_exporter")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "HTTP_Probe_Failed", "cluster", "dev", "instance", "web2", "job", "node_exporter")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "dev", "instance", "server6", "ip", "127.0.0.6", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "dev", "instance", "server7", "ip", "127.0.0.7", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "dev", "instance", "server8", "ip", "127.0.0.8", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server1", "ip", "127.0.0.1", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server2", "ip", "127.0.0.2", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "staging", "instance", "server3", "ip", "127.0.0.3", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "staging", "instance", "server4", "ip", "127.0.0.4", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "staging", "instance", "server5", "ip", "127.0.0.5", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Memory_Usage_Too_High", "cluster", "prod", "instance", "server2", "job", "node_exporter")), }, }, }, { args: "q=alertname=Free_Disk_Space_Too_Low", alerts: AlertList{ - Alerts: []promlabels.Labels{ - promlabels.FromStrings("alertname", "Free_Disk_Space_Too_Low", "cluster", "staging", "disk", "sda", "instance", "server5", "job", "node_exporter"), + Alerts: []models.OrderedLabels{ + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Free_Disk_Space_Too_Low", "cluster", "staging", "disk", "sda", "instance", "server5", "job", "node_exporter")), }, }, }, { args: "q=alertname=HTTP_Probe_Failed", alerts: AlertList{ - Alerts: []promlabels.Labels{ - promlabels.FromStrings("alertname", "HTTP_Probe_Failed", "cluster", "dev", "instance", "web1", "job", "node_exporter"), - promlabels.FromStrings("alertname", "HTTP_Probe_Failed", "cluster", "dev", "instance", "web2", "job", "node_exporter"), + Alerts: []models.OrderedLabels{ + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "HTTP_Probe_Failed", "cluster", "dev", "instance", "web1", "job", "node_exporter")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "HTTP_Probe_Failed", "cluster", "dev", "instance", "web2", "job", "node_exporter")), }, }, }, { args: "q=instance=server2", alerts: AlertList{ - Alerts: []promlabels.Labels{ - promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server2", "ip", "127.0.0.2", "job", "node_ping"), - promlabels.FromStrings("alertname", "Memory_Usage_Too_High", "cluster", "prod", "instance", "server2", "job", "node_exporter"), + Alerts: []models.OrderedLabels{ + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server2", "ip", "127.0.0.2", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Memory_Usage_Too_High", "cluster", "prod", "instance", "server2", "job", "node_exporter")), }, }, }, { args: "q=alertname=Host_Down&q=cluster=prod", alerts: AlertList{ - Alerts: []promlabels.Labels{ - promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server1", "ip", "127.0.0.1", "job", "node_ping"), - promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server2", "ip", "127.0.0.2", "job", "node_ping"), + Alerts: []models.OrderedLabels{ + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server1", "ip", "127.0.0.1", "job", "node_ping")), + models.LabelsToOrderedLabels(promlabels.FromStrings("alertname", "Host_Down", "cluster", "prod", "instance", "server2", "ip", "127.0.0.2", "job", "node_ping")), }, }, }, { args: "q=foo=bar", alerts: AlertList{ - Alerts: []promlabels.Labels{}, + Alerts: []models.OrderedLabels{}, }, }, } @@ -2675,85 +2675,85 @@ func TestAlertList(t *testing.T) { func TestSortSliceOfLabels(t *testing.T) { type testCaseT struct { - labels []promlabels.Labels + labels []models.OrderedLabels sortKeys []string fallback string - output []promlabels.Labels + output []models.OrderedLabels } testCases := []testCaseT{ { - labels: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert2"), - promlabels.FromStrings("alertname", "alert1"), + labels: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert2"}}, + {{Name: "alertname", Value: "alert1"}}, }, sortKeys: []string{}, fallback: "", - output: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert2"), - promlabels.FromStrings("alertname", "alert1"), + output: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert2"}}, + {{Name: "alertname", Value: "alert1"}}, }, }, { - labels: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert2"), - promlabels.FromStrings("alertname", "alert1"), + labels: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert2"}}, + {{Name: "alertname", Value: "alert1"}}, }, sortKeys: []string{"alertname"}, fallback: "alertname", - output: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert1"), - promlabels.FromStrings("alertname", "alert2"), + output: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert1"}}, + {{Name: "alertname", Value: "alert2"}}, }, }, { - labels: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert2"), - promlabels.FromStrings("alertname", "alert1"), + labels: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert2"}}, + {{Name: "alertname", Value: "alert1"}}, }, sortKeys: []string{}, fallback: "alertname", - output: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert1"), - promlabels.FromStrings("alertname", "alert2"), + output: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert1"}}, + {{Name: "alertname", Value: "alert2"}}, }, }, { - labels: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert2"), - promlabels.FromStrings("alertname", "alert1"), + labels: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert2"}}, + {{Name: "alertname", Value: "alert1"}}, }, sortKeys: []string{"foo"}, fallback: "alertname", - output: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert1"), - promlabels.FromStrings("alertname", "alert2"), + output: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert1"}}, + {{Name: "alertname", Value: "alert2"}}, }, }, { - labels: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert1"), - promlabels.FromStrings("alertname", "alert1"), + labels: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert1"}}, + {{Name: "alertname", Value: "alert1"}}, }, sortKeys: []string{"alertname"}, fallback: "alertname", - output: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert1"), - promlabels.FromStrings("alertname", "alert1"), + output: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert1"}}, + {{Name: "alertname", Value: "alert1"}}, }, }, { - labels: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert2", "job", "a"), - promlabels.FromStrings("alertname", "alert1"), - promlabels.FromStrings("alertname", "alert3", "job", "b"), + labels: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert2"}, {Name: "job", Value: "a"}}, + {{Name: "alertname", Value: "alert1"}}, + {{Name: "alertname", Value: "alert3"}, {Name: "job", Value: "b"}}, }, sortKeys: []string{"job"}, fallback: "alertname", - output: []promlabels.Labels{ - promlabels.FromStrings("alertname", "alert2", "job", "a"), - promlabels.FromStrings("alertname", "alert3", "job", "b"), - promlabels.FromStrings("alertname", "alert1"), + output: []models.OrderedLabels{ + {{Name: "alertname", Value: "alert2"}, {Name: "job", Value: "a"}}, + {{Name: "alertname", Value: "alert3"}, {Name: "job", Value: "b"}}, + {{Name: "alertname", Value: "alert1"}}, }, }, } @@ -2761,7 +2761,7 @@ func TestSortSliceOfLabels(t *testing.T) { for i, tc := range testCases { t.Run(fmt.Sprintf("%d:%v", i, tc.sortKeys), func(t *testing.T) { sortSliceOfLabels(tc.labels, tc.sortKeys, tc.fallback) - if diff := cmp.Diff(tc.output, tc.labels, cmpLabels); diff != "" { + if diff := cmp.Diff(tc.output, tc.labels); diff != "" { t.Errorf("Wrong labels order after sorting (-want +got):\n%s", diff) } })