54 lines
2.0 KiB
TypeScript
54 lines
2.0 KiB
TypeScript
import config from "./config.ts";
|
|
import axios from "axios";
|
|
import { redis } from "./utils/redis.ts";
|
|
import { getStats } from "./utils/getStats.ts";
|
|
|
|
statsTimeSeries();
|
|
setInterval(statsTimeSeries, 5 * 60 * 1000);
|
|
|
|
async function statsTimeSeries() {
|
|
if (redis) {
|
|
console.time("timeSeries");
|
|
try {
|
|
const stats = await getStats();
|
|
const isFreePoolFull = (
|
|
await axios.get(
|
|
"http://localhost:" + config.VMWORKER_PORT + "/isFreePoolFull",
|
|
)
|
|
).data.isFull;
|
|
const datapoint: AnyDict = {
|
|
time: new Date(),
|
|
currentUsers: stats.counts.currentUsers,
|
|
currentVBrowser: stats.counts.currentVBrowser,
|
|
currentVBrowserLarge: stats.counts.currentVBrowserLarge,
|
|
currentHttp: stats.counts.currentHttp,
|
|
currentScreenShare: stats.counts.currentScreenShare,
|
|
currentFileShare: stats.counts.currentFileShare,
|
|
currentVideoChat: stats.counts.currentVideoChat,
|
|
chatMessages: stats.counts.chatMessages,
|
|
redisUsage: stats.counts.redisUsage,
|
|
hetznerApiRemaining: stats.counts.hetznerApiRemaining,
|
|
avgStartMS:
|
|
(stats.vBrowserStartMS || []).map(Number).reduce((a, b) => a + b, 0) /
|
|
(stats.vBrowserStartMS?.length ?? 0),
|
|
vBrowserStarts: stats.counts.vBrowserStarts,
|
|
vBrowserLaunches: stats.counts.vBrowserLaunches,
|
|
vBrowserFails: stats.counts.vBrowserFails,
|
|
vBrowserStagingFails: stats.counts.vBrowserStagingFails,
|
|
isFreePoolFull: Number(isFreePoolFull),
|
|
};
|
|
Object.keys(stats.vmManagerStats).forEach((key) => {
|
|
if (stats.vmManagerStats[key]) {
|
|
datapoint[key] =
|
|
stats.vmManagerStats[key]?.availableVBrowsers?.length;
|
|
}
|
|
});
|
|
await redis.lpush("timeSeries", JSON.stringify(datapoint));
|
|
await redis.ltrim("timeSeries", 0, 288);
|
|
} catch (e: any) {
|
|
console.warn(`[TIMESERIES] %s when collecting stats`, e.code);
|
|
}
|
|
console.timeEnd("timeSeries");
|
|
}
|
|
}
|