You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
homepage/src/pages/api/siteMonitor.js

53 lines
1.4 KiB

import { performance } from "perf_hooks";
import { getServiceItem } from "utils/config/service-helpers";
import createLogger from "utils/logger";
import { httpProxy } from "utils/proxy/http";
const logger = createLogger("siteMonitor");
export default async function handler(req, res) {
const { group, service } = req.query;
const serviceItem = await getServiceItem(group, service);
if (!serviceItem) {
logger.debug(`No service item found for group ${group} named ${service}`);
return res.status(400).send({
error: "Unable to find service, see log for details.",
});
}
const { siteMonitor: monitorURL } = serviceItem;
if (!monitorURL) {
logger.debug("No http monitor URL specified");
return res.status(400).send({
error: "No http monitor URL given",
});
}
try {
let startTime = performance.now();
let [status] = await httpProxy(monitorURL, {
method: "HEAD",
});
let endTime = performance.now();
if (status > 403) {
// try one more time as a GET in case HEAD is rejected for whatever reason
startTime = performance.now();
[status] = await httpProxy(monitorURL);
endTime = performance.now();
}
return res.status(200).json({
status,
latency: endTime - startTime,
});
} catch (e) {
logger.debug("Error attempting http monitor: %s", e);
return res.status(400).send({
error: "Error attempting http monitor, see logs.",
});
}
}