From a868fd0698666feb4e1b3b7609615ced0b00e6df Mon Sep 17 00:00:00 2001 From: Samuel Hernandez Date: Sun, 2 May 2021 16:16:48 -0400 Subject: [PATCH 1/2] Add serving metrics for Prometheus Co-authored-by: TheEssem --- .env.example | 4 +++- shard.js | 41 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index 967e517..3f9991c 100644 --- a/.env.example +++ b/.env.example @@ -44,8 +44,10 @@ OUTPUT= TEMPDIR= # Put temporary image web server domain TMP_DOMAIN= +# Port for serving metrics. Metrics served are compatible with Prometheus. +METRICS= # Set this to true if you're using PM2 to manage the bot PMTWO=false # Set this to true if you want to use the image API -API=false \ No newline at end of file +API=false diff --git a/shard.js b/shard.js index 689b000..75e3dba 100644 --- a/shard.js +++ b/shard.js @@ -21,6 +21,7 @@ const misc = require("./utils/misc.js"); // generate help page const helpGenerator = process.env.OUTPUT !== "" ? require("./utils/help.js") : null; +const http = require("http"); class Shard extends Base { constructor(bot) { @@ -39,7 +40,7 @@ class Shard extends Base { logger.error(`Failed to register command from ${commandFile}: ${e}`); } } - + // register events const events = await readdir("./events/"); logger.log("info", `Attempting to load ${events.length} events...`); @@ -49,7 +50,7 @@ class Shard extends Base { const event = require(`./events/${file}`); this.bot.on(eventName, event.bind(null, this.bot, this.clusterID, this.ipc)); } - + // connect to image api if enabled if (process.env.API === "true") { for (const server of image.servers) { @@ -68,6 +69,40 @@ class Shard extends Base { logger.log("info", "The help docs have been generated."); } + if (process.env.METRICS !== "") { + logger.log("YES"); + const httpServer = http.createServer((req, res) => { + if (req.method !== "GET") { + res.statusCode = 405; + return res.end("GET only"); + } + res.write(`# HELP connected_workers Number of workers connected +# TYPE connected_workers guage +connected_workers ${image.connections.length} +# HELP running_jobs Number of running jobs on this worker +# TYPE running_jobs guage +# HELP queued_jobs Number of queued jobs on this worker +# TYPE queued_jobs guage +# HELP max_jobs Number of max allowed jobs on this worker +# TYPE max_jobs guage +`); + image.getStatus().then((servers) => { + for (const [i, w] of servers.entries()) { + res.write(`running_jobs{worker="${i}} ${w.runningJobs}\n`); + res.write(`queued_jobs{worker="${i}} ${w.queued}\n`); + res.write(`max_jobs{worker="${i}} ${w.max}\n`); + } + res.end(); + }).catch(e => { + res.statusCode = 500; + return res.end(e); + }); + }); + httpServer.listen(process.env.METRICS, () => { + logger.log("info", `Serving metrics at ${process.env.METRICS}`); + }); + } + // handle process stop process.on("SIGINT", () => { logger.log("warn", "SIGINT detected, shutting down..."); @@ -139,4 +174,4 @@ class Shard extends Base { } -module.exports = Shard; \ No newline at end of file +module.exports = Shard; From dd748fbc6094a8fe57e215fbf2d5d929658925ac Mon Sep 17 00:00:00 2001 From: TheEssem Date: Mon, 3 May 2021 08:30:07 -0500 Subject: [PATCH 2/2] just some fixes --- shard.js | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/shard.js b/shard.js index 75e3dba..0ce1c5c 100644 --- a/shard.js +++ b/shard.js @@ -71,32 +71,28 @@ class Shard extends Base { if (process.env.METRICS !== "") { logger.log("YES"); - const httpServer = http.createServer((req, res) => { + const httpServer = http.createServer(async (req, res) => { if (req.method !== "GET") { res.statusCode = 405; return res.end("GET only"); } res.write(`# HELP connected_workers Number of workers connected -# TYPE connected_workers guage +# TYPE connected_workers gauge connected_workers ${image.connections.length} # HELP running_jobs Number of running jobs on this worker -# TYPE running_jobs guage +# TYPE running_jobs gauge # HELP queued_jobs Number of queued jobs on this worker -# TYPE queued_jobs guage +# TYPE queued_jobs gauge # HELP max_jobs Number of max allowed jobs on this worker -# TYPE max_jobs guage +# TYPE max_jobs gauge `); - image.getStatus().then((servers) => { - for (const [i, w] of servers.entries()) { - res.write(`running_jobs{worker="${i}} ${w.runningJobs}\n`); - res.write(`queued_jobs{worker="${i}} ${w.queued}\n`); - res.write(`max_jobs{worker="${i}} ${w.max}\n`); - } - res.end(); - }).catch(e => { - res.statusCode = 500; - return res.end(e); - }); + const servers = await image.getStatus(); + for (const [i, w] of servers.entries()) { + res.write(`running_jobs{worker="${i}"} ${w.runningJobs}\n`); + res.write(`queued_jobs{worker="${i}"} ${w.queued}\n`); + res.write(`max_jobs{worker="${i}"} ${w.max}\n`); + } + res.end(); }); httpServer.listen(process.env.METRICS, () => { logger.log("info", `Serving metrics at ${process.env.METRICS}`);