Files
watchparty/server/timeSeries.ts
T
2026-06-21 03:53:06 +03:00

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");
}
}