in webui/src/pages/monitoring/events/index.tsx [15:111]
export default function Events() {
const [eventData, setEventData] = useState<EventData[]>([]);
const [nodes, setNodes] = useState<NodeInfo[]>([]);
const [namespaces, setNamespaces] = useState<string[]>([]);
const [pods, setPods] = useState<PodInfo[]>([]);
const [timeRange, setTimeRange] = useState<Dayjs[]>([]);
const [filteredTypes, setFilteredTypes] = useState<string[]>([]);
const [filteredNodes, setFilteredNodes] = useState<string[]>([]);
const [filteredNamespaces, setFilteredNamespaces] = useState<string[]>([]);
const [filteredPods, setFilteredPods] = useState<string[]>([]);
const [isLive, setIsLive] = useState(false);
const [isLoading, setIsLoading] = useState(true);
const [controller, setController] = useState<AbortController | null>(null);
const refreshEventList = (setLoading: boolean) => {
if (setLoading) setIsLoading(true);
if (controller) controller.abort()
const newController = new AbortController();
const { signal } = newController;
setController(newController);
const start = timeRange[0], end = timeRange[1];
eventService.getRangeEvent(start?.unix(), end?.unix(), filteredTypes, filteredNodes, filteredNamespaces, filteredPods, 100, signal).then((res) => {
setEventData(res || [])
if (setLoading) setIsLoading(false);
}).catch((res) => {
Message.error(`Error fetching events: ${getErrorMessage(res)}`)
});
};
const refreshResourceList = () => {
k8sService.listNodes().then((res) => {
setNodes(res)
}).catch((res) => {
Message.error(`Error fetching node info: ${getErrorMessage(res)}`)
}
);
k8sService.listNamespace().then((res) => {
setNamespaces(res)
}).catch((res) => {
Message.error(`Error fetching namespace info: ${getErrorMessage(res)}`)
}
);
k8sService.listPods().then((res) => {
setPods(res)
}).catch((res) => {
Message.error(`Error fetching pod info: ${getErrorMessage(res)}`)
}
);
}
useEffect(() => {
refreshEventList(true);
}, [timeRange, filteredTypes, filteredNodes, filteredNamespaces, filteredPods])
useEffect(() => {
refreshResourceList();
}, [])
useEffect(() => {
if (isLive) {
const t = setInterval(() => {
refreshEventList(false);
}, 2000);
return () => {
clearInterval(t);
}
}
return () => { }
}, [isLive])
const podNames = useMemo(() => {
return filteredNamespaces?.length ?
pods.filter((i) => {
return filteredNamespaces.includes(i.namespace)
}).map(i => i.name) : pods.map(i => i.name);
}, [pods, filteredNamespaces])
const nodeNames = useMemo(() => nodes.map(i => i.name), [nodes])
const eventTypes = useMemo(() => {
return eventData.map((i) => i.type).filter((i, index) => eventData.findIndex((j) => j.type === i) === index)
}, [eventData])
return (
<div>
<PageHeader
title='Events'
breadcrumbs={[{ name: 'Console' }, { name: 'Monitoring' }, { name: 'Events' }]}
/>
<Card contentHeight="auto">
<Card.Content>
<Box direction="row" className={styles.box}>
<span className={styles.title}>Time Range</span>
<DatePicker2.RangePicker showTime disabled={isLive} onChange={v => setTimeRange(v)} />