app/panels/PlutoCoreHealthcheck.tsx (84 lines of code) (raw):
import React, { SetStateAction, useEffect, useState } from "react";
import axios from "axios";
import { Alert } from "@material-ui/lab";
interface PlutoCoreHealthcheckProps {
onConnectionRestored?: () => void;
}
const PlutoCoreHealthcheck: React.FC<PlutoCoreHealthcheckProps> = (props) => {
const [healthcheckStatus, setHealthcheckStatus] = useState(true);
const [dbStatus, setDbStatus] = useState(true);
useEffect(() => {
console.log("initiating pluto core healthchecker");
const timerId = window.setInterval(checkHealthStatus, 10000);
checkHealthStatus();
return () => {
console.log("removing pluto core healthchecker");
window.clearInterval(timerId);
};
}, []);
const checkDidPass: SetStateAction<boolean> = (prevValue: boolean) => {
if (!prevValue && props.onConnectionRestored) {
props.onConnectionRestored();
}
return true;
};
const checkHealthStatus = async () => {
try {
const response = await axios.get("/pluto-core/api/healthcheck", {
validateStatus: () => true,
});
switch (response.status) {
case 200:
setHealthcheckStatus(checkDidPass);
if (response.data.hasOwnProperty("database")) {
if (response.data.database === "ok") {
setDbStatus(true);
} else {
setDbStatus(false);
}
}
break;
case 404:
console.error(
"Could not perform pluto-core healthcheck, got 404. This should not happen."
);
break;
case 500:
case 502:
case 503:
case 504:
console.error(
"Pluto-core healthcheck returned ",
response.status,
" something is wrong"
);
setHealthcheckStatus(false);
break;
default:
console.error(
"pluto-core healthcheck returned an unexpected response ",
response.status,
" don't know what to do about that."
);
break;
}
} catch (err) {
console.error("Could not perform pluto-core healthcheck: ", err);
}
};
if (!healthcheckStatus) {
return (
<Alert severity="error">
pluto-core may have problems, contact multimediatech if you are
experiencing difficulties
</Alert>
);
}
if (!dbStatus) {
return (
<Alert severity="error">
pluto-core is having database issues, you may experience problems
</Alert>
);
}
return <></>;
};
export default PlutoCoreHealthcheck;