aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Johannes Christ <[email protected]>2020-01-12 11:05:23 +0100
committerGravatar Johannes Christ <[email protected]>2020-01-12 11:58:57 +0100
commit52813ee63c7aa558c75e1fad320b3fc3050d1155 (patch)
tree2102144ccb33a1ddb0235dac5511694d640ff691
parentStart Prometheus HTTP server on bot start. (diff)
Add the `metrics` cog.
Diffstat (limited to '')
-rw-r--r--bot/__main__.py1
-rw-r--r--bot/cogs/metrics.py40
2 files changed, 41 insertions, 0 deletions
diff --git a/bot/__main__.py b/bot/__main__.py
index 84bc7094b..61271a692 100644
--- a/bot/__main__.py
+++ b/bot/__main__.py
@@ -40,6 +40,7 @@ bot.load_extension("bot.cogs.duck_pond")
bot.load_extension("bot.cogs.free")
bot.load_extension("bot.cogs.information")
bot.load_extension("bot.cogs.jams")
+bot.load_extension("bot.cogs.metrics")
bot.load_extension("bot.cogs.moderation")
bot.load_extension("bot.cogs.off_topic_names")
bot.load_extension("bot.cogs.reddit")
diff --git a/bot/cogs/metrics.py b/bot/cogs/metrics.py
new file mode 100644
index 000000000..79c754c21
--- /dev/null
+++ b/bot/cogs/metrics.py
@@ -0,0 +1,40 @@
+from collections import defaultdict
+
+from discord import Status
+from discord.ext.commands import Cog
+from prometheus_client import Gauge
+
+from bot.bot import Bot
+
+
+class Metrics(Cog):
+ """Exports metrics for Prometheus."""
+
+ PREFIX = 'pydis_bot_'
+
+ def __init__(self, bot: Bot) -> None:
+ self.bot = bot
+
+ self.guild_members = Gauge(
+ name=f'{self.PREFIX}server_members',
+ documentation="Total members by status.",
+ labelnames=('guild_id', 'status')
+ )
+
+ @Cog.listener()
+ async def on_ready(self) -> None:
+ members_by_status = defaultdict(lambda: defaultdict(int))
+
+ await self.bot.request_offline_members(*self.bot.guilds)
+ for guild in self.bot.guilds:
+ for member in guild.members:
+ members_by_status[guild.id][member.status] += 1
+
+ for guild_id, members in members_by_status.items():
+ for status, count in members.items():
+ self.guild_members.labels(guild_id=guild_id, status=str(status)).set(count)
+
+
+def setup(bot: Bot) -> None:
+ """Load the Metrics cog."""
+ bot.add_cog(Metrics(bot))