diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/index.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/index.js
index 04bbdf4fd..72db47a43 100644
--- a/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/index.js
+++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/index.js
@@ -49,22 +49,24 @@ const Alert = observer(
BorderClassMap[alert.state] || "border-warning"
];
- let silences = {};
- for (let am of alert.alertmanager) {
+ const silences = {};
+ for (const am of alert.alertmanager) {
if (!silences[am.cluster]) {
silences[am.cluster] = {
alertmanager: am,
- silences: []
+ silences: [
+ ...new Set(
+ am.silencedBy.filter(
+ silenceID =>
+ !(
+ group.shared.silences[am.cluster] &&
+ group.shared.silences[am.cluster].includes(silenceID)
+ )
+ )
+ )
+ ]
};
}
- for (let silenceID of am.silencedBy) {
- if (
- !silences[am.cluster].silences.includes(silenceID) &&
- !(group.shared.silences[am.cluster] === silenceID)
- ) {
- silences[am.cluster].silences.push(silenceID);
- }
- }
}
return (
diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/index.test.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/index.test.js
index 158d53c64..047ed8aba 100644
--- a/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/index.test.js
+++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/Alert/index.test.js
@@ -105,7 +105,7 @@ describe("", () => {
it("renders a silence if alert is silenced", () => {
const alert = MockedAlert();
alert.alertmanager[0].silencedBy = ["silence123456789"];
- const group = MockAlertGroup({}, [alert], [], {}, {});
+ const group = MockAlertGroup({}, [alert], [], {}, { default: [] });
const tree = MountedAlert(alert, group, false, false);
const silence = tree.find("Silence");
expect(silence).toHaveLength(1);
@@ -143,6 +143,21 @@ describe("", () => {
expect(silence.html()).toMatch(/silence123456789/);
});
+ it("doesn't render shared silences", () => {
+ const alert = MockedAlert();
+ alert.alertmanager[0].silencedBy = ["silence123456789"];
+ const group = MockAlertGroup(
+ {},
+ [alert],
+ [],
+ {},
+ { default: ["silence123456789"] }
+ );
+ const tree = MountedAlert(alert, group, false, false);
+ const silence = tree.find("Silence");
+ expect(silence).toHaveLength(0);
+ });
+
it("uses BorderClassMap.active when @state=active", () => {
const alert = MockedAlert();
alert.state = "active";
diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.js
index 1b723e44f..c24feb89a 100644
--- a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.js
+++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.js
@@ -67,20 +67,23 @@ const GroupFooter = observer(
{Object.keys(group.shared.silences).length === 0 ? null : (
{Object.entries(group.shared.silences).map(
- ([cluster, silenceID]) => (
-
- a.alertmanager.filter(am => am.cluster === cluster)[0]
- )[0]
- }
- silenceID={silenceID}
- afterUpdate={afterUpdate}
- />
- )
+ ([cluster, silences]) =>
+ silences.map(silenceID => (
+
+ a.alertmanager.filter(
+ am => am.cluster === cluster
+ )[0]
+ )[0]
+ }
+ silenceID={silenceID}
+ afterUpdate={afterUpdate}
+ />
+ ))
)}
)}
diff --git a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.test.js b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.test.js
index 03b2c2446..0849fc0ea 100644
--- a/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.test.js
+++ b/ui/src/Components/Grid/AlertGrid/AlertGroup/GroupFooter/index.test.js
@@ -80,7 +80,7 @@ describe("", () => {
for (const id of Object.keys(group.alerts)) {
group.alerts[id].alertmanager[0].silencedBy = ["123456789"];
}
- group.shared.silences = { default: "123456789" };
+ group.shared.silences = { default: ["123456789"] };
const tree = MountedGroupFooter().find("GroupFooter");
expect(tree.find("Silence")).toHaveLength(1);
});
@@ -89,7 +89,7 @@ describe("", () => {
for (const id of Object.keys(group.alerts)) {
group.alerts[id].alertmanager[0].silencedBy = ["123456789"];
}
- group.shared.silences = { default: "123456789" };
+ group.shared.silences = { default: ["123456789"] };
alertStore.data.silences = {
default: {
diff --git a/ui/src/Models/API.js b/ui/src/Models/API.js
index c973fc102..7ed7ee72b 100644
--- a/ui/src/Models/API.js
+++ b/ui/src/Models/API.js
@@ -45,7 +45,7 @@ const APIGroup = PropTypes.exact({
shared: PropTypes.exact({
annotations: PropTypes.arrayOf(Annotation).isRequired,
labels: PropTypes.object.isRequired,
- silences: PropTypes.object.isRequired
+ silences: PropTypes.objectOf(PropTypes.arrayOf(PropTypes.string)).isRequired
}).isRequired
});