import { Card, Group, Table, Text, Accordion, Badge, Tooltip, Box, Stack, Input, Alert, } from "@mantine/core"; import { useSuspenseAPIQuery } from "../api/api"; import { AlertingRulesResult } from "../api/responseTypes/rules"; import badgeClasses from "../Badge.module.css"; import panelClasses from "../Panel.module.css"; import RuleDefinition from "../components/RuleDefinition"; import { humanizeDurationRelative, now } from "../lib/formatTime"; import { Fragment } from "react"; import { StateMultiSelect } from "../components/StateMultiSelect"; import { useAppDispatch, useAppSelector } from "../state/hooks"; import { IconInfoCircle, IconSearch } from "@tabler/icons-react"; import { LabelBadges } from "../components/LabelBadges"; import { updateAlertFilters } from "../state/alertsPageSlice"; import { useSettings } from "../state/settingsSlice"; export default function AlertsPage() { const { data } = useSuspenseAPIQuery({ path: `/rules`, params: { type: "alert", }, }); const dispatch = useAppDispatch(); const { showAnnotations } = useSettings(); const filters = useAppSelector((state) => state.alertsPage.filters); const ruleStatsCount = { inactive: 0, pending: 0, firing: 0, }; data.data.groups.forEach((el) => el.rules.forEach((r) => ruleStatsCount[r.state]++) ); return ( <> o === "inactive" ? badgeClasses.healthOk : o === "pending" ? badgeClasses.healthWarn : badgeClasses.healthErr } placeholder="Filter by alert state" values={filters.state} onChange={(values) => dispatch(updateAlertFilters({ state: values }))} /> } placeholder="Filter by alert name or labels" > {data.data.groups.map((g, i) => { const filteredRules = g.rules.filter( (r) => filters.state.length === 0 || filters.state.includes(r.state) ); return ( {g.name} {g.file} {filteredRules.length === 0 && ( } > No rules found that match your filter criteria. )} {filteredRules.map((r, j) => { const numFiring = r.alerts.filter( (a) => a.state === "firing" ).length; const numPending = r.alerts.filter( (a) => a.state === "pending" ).length; return ( 0 ? panelClasses.panelHealthErr : numPending > 0 ? panelClasses.panelHealthWarn : panelClasses.panelHealthOk } > {r.name} {numFiring > 0 && ( firing ({numFiring}) )} {numPending > 0 && ( pending ({numPending}) )} {r.alerts.length > 0 && ( Alert labels State Active Since Value {r.type === "alerting" && r.alerts.map((a, k) => ( {a.state} {humanizeDurationRelative( a.activeAt, now(), "" )} {a.value} {showAnnotations && (
{Object.entries( a.annotations ).map(([k, v]) => ( {k} {v} ))}
)} ))} )}
); })}
); })}
); }