/-/monitorz endpoint for system perf mon
This commit is contained in:
parent
33b22c419b
commit
1b14a9b75d
16
api/src/routes/-/monitorz.ts
Normal file
16
api/src/routes/-/monitorz.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import { Router, Response, Request } from "express";
|
||||||
|
import { route } from "@fosscord/api";
|
||||||
|
import os from "os";
|
||||||
|
|
||||||
|
const router = Router();
|
||||||
|
|
||||||
|
router.get("/", route({ right: "OPERATOR" }), async (req: Request, res: Response) => {
|
||||||
|
return res.json({
|
||||||
|
load: os.loadavg(),
|
||||||
|
procUptime: process.uptime(),
|
||||||
|
sysUptime: os.uptime(),
|
||||||
|
memPercent: 100 - ((os.freemem() / os.totalmem()) * 100),
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router;
|
@ -2,6 +2,7 @@ import "dotenv/config";
|
|||||||
import https from "https";
|
import https from "https";
|
||||||
import Fosscord from "fosscord-gopnik";
|
import Fosscord from "fosscord-gopnik";
|
||||||
import mysql from "mysql2";
|
import mysql from "mysql2";
|
||||||
|
import fetch from "node-fetch";
|
||||||
|
|
||||||
const dbConn = mysql.createConnection(process.env.DATABASE as string);
|
const dbConn = mysql.createConnection(process.env.DATABASE as string);
|
||||||
const executePromise = (sql: string, args: any[]) => new Promise((resolve, reject) => dbConn.execute(sql, args, (err, res) => { if (err) reject(err); else resolve(res); }));
|
const executePromise = (sql: string, args: any[]) => new Promise((resolve, reject) => dbConn.execute(sql, args, (err, res) => { if (err) reject(err); else resolve(res); }));
|
||||||
@ -31,11 +32,11 @@ client.on("ready", () => {
|
|||||||
console.log(`Ready on gateway as ${client.user!.tag}`);
|
console.log(`Ready on gateway as ${client.user!.tag}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
client.on("error", (error) => {
|
client.on("error", (error: any) => {
|
||||||
console.log(`Gateway error`, error);
|
console.log(`Gateway error`, error);
|
||||||
});
|
});
|
||||||
|
|
||||||
client.on("warn", (msg) => {
|
client.on("warn", (msg: any) => {
|
||||||
console.log(`Gateway warning:`, msg);
|
console.log(`Gateway warning:`, msg);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -43,13 +44,22 @@ const savePerf = async (time: number, name: string, error?: string | Error) => {
|
|||||||
if (error && typeof error != "string") error = error.message;
|
if (error && typeof error != "string") error = error.message;
|
||||||
try {
|
try {
|
||||||
await executePromise("INSERT INTO performance (value, endpoint, timestamp, error) VALUES (?, ?, ?, ?)", [time ?? 0, name, new Date(), error ?? null]);
|
await executePromise("INSERT INTO performance (value, endpoint, timestamp, error) VALUES (?, ?, ?, ?)", [time ?? 0, name, new Date(), error ?? null]);
|
||||||
await executePromise("DELETE FROM performance WHERE DATE(timestamp) < now() - interval ? DAY", [process.env.RETENTION_DAYS]);
|
// await executePromise("DELETE FROM performance WHERE DATE(timestamp) < now() - interval ? DAY", [process.env.RETENTION_DAYS]);
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
console.error(e);
|
console.error(e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const saveSystemUsage = async (load: number, procUptime: number, sysUptime: number, ram: number) => {
|
||||||
|
try {
|
||||||
|
await executePromise("INSERT INTO monitor (time, cpu, procUp, sysUp, ram) VALUES (?, ?, ?, ?, ?)", [new Date(), load, procUptime, sysUptime, ram]);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const makeTimedRequest = (path: string, body?: object): Promise<number> => new Promise((resolve, reject) => {
|
const makeTimedRequest = (path: string, body?: object): Promise<number> => new Promise((resolve, reject) => {
|
||||||
const opts = {
|
const opts = {
|
||||||
hostname: new URL(path).hostname,
|
hostname: new URL(path).hostname,
|
||||||
@ -104,6 +114,13 @@ const measureApi = async (name: string, path: string, body?: object) => {
|
|||||||
await savePerf(time, name, error);
|
await savePerf(time, name, error);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
interface monitorzSchema {
|
||||||
|
load: number[];
|
||||||
|
procUptime: number;
|
||||||
|
sysUptime: number;
|
||||||
|
memPercent: number;
|
||||||
|
}
|
||||||
|
|
||||||
const app = async () => {
|
const app = async () => {
|
||||||
await new Promise((resolve) => dbConn.connect(resolve));
|
await new Promise((resolve) => dbConn.connect(resolve));
|
||||||
console.log("Connected to db");
|
console.log("Connected to db");
|
||||||
@ -117,6 +134,14 @@ const app = async () => {
|
|||||||
await measureApi("login", `${instance.app}/login`);
|
await measureApi("login", `${instance.app}/login`);
|
||||||
// await gatewayMeasure("websocketPing");
|
// await gatewayMeasure("websocketPing");
|
||||||
|
|
||||||
|
const res = await fetch(`${instance.api}/-/monitorz`, {
|
||||||
|
headers: {
|
||||||
|
Authorization: process.env.INSTANCE_TOKEN as string,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
const json = await res.json() as monitorzSchema;
|
||||||
|
await saveSystemUsage(json.load[2], json.procUptime, json.sysUptime, json.memPercent);
|
||||||
|
|
||||||
setTimeout(doMeasurements, parseInt(process.env.MEASURE_INTERVAL as string));
|
setTimeout(doMeasurements, parseInt(process.env.MEASURE_INTERVAL as string));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user