tux.cogs.services.influxdblogger
¶
Classes:
Name | Description |
---|---|
InfluxLogger | |
Classes¶
InfluxLogger(bot: Tux)
¶
Bases: Cog
Methods:
Name | Description |
---|---|
init_influx | Initialize InfluxDB client for metrics logging. |
logger | Log statistics to InfluxDB at regular intervals. |
Source code in tux/cogs/services/influxdblogger.py
Functions¶
init_influx() -> bool
¶
Initialize InfluxDB client for metrics logging.
Returns:
Type | Description |
---|---|
bool | True if initialization was successful, False otherwise |
Source code in tux/cogs/services/influxdblogger.py
Python
def init_influx(self) -> bool:
"""Initialize InfluxDB client for metrics logging.
Returns
-------
bool
True if initialization was successful, False otherwise
"""
influx_token: str = CONFIG.INFLUXDB_TOKEN
influx_url: str = CONFIG.INFLUXDB_URL
self.influx_org: str = CONFIG.INFLUXDB_ORG
if (influx_token != "") and (influx_url != "") and (self.influx_org != ""):
write_client = InfluxDBClient(url=influx_url, token=influx_token, org=self.influx_org)
# Using Any type to avoid complex typing issues with InfluxDB client
self.influx_write_api = write_client.write_api(write_options=SYNCHRONOUS) # type: ignore
return True
return False
logger() -> None
async
¶
Log statistics to InfluxDB at regular intervals.
Collects data from various database models and writes metrics to InfluxDB.
Source code in tux/cogs/services/influxdblogger.py
Python
@tasks.loop(seconds=60)
async def logger(self) -> None:
"""Log statistics to InfluxDB at regular intervals.
Collects data from various database models and writes metrics to InfluxDB.
"""
if not self.influx_write_api:
logger.warning("InfluxDB writer not initialized, skipping metrics collection")
return
influx_bucket = "tux stats"
# Collect the guild list from the database
try:
guild_list = await self.db.guild.find_many(where={})
# Iterate through each guild and collect metrics
for guild in guild_list:
if not guild.guild_id:
continue
guild_id = int(guild.guild_id)
# Collect data by querying controllers
starboard_stats = await self.db.starboard.find_many(where={"guild_id": guild_id})
snippet_stats = await self.db.snippet.find_many(where={"guild_id": guild_id})
afk_stats = await self.db.afk.find_many(where={"guild_id": guild_id})
case_stats = await self.db.case.find_many(where={"guild_id": guild_id})
# Create data points with type ignores for InfluxDB methods
# The InfluxDB client's type hints are incomplete
points: list[Point] = [
Point("guild stats").tag("guild", guild_id).field("starboard count", len(starboard_stats)), # type: ignore
Point("guild stats").tag("guild", guild_id).field("snippet count", len(snippet_stats)), # type: ignore
Point("guild stats").tag("guild", guild_id).field("afk count", len(afk_stats)), # type: ignore
Point("guild stats").tag("guild", guild_id).field("case count", len(case_stats)), # type: ignore
]
# Write to InfluxDB
self.influx_write_api.write(bucket=influx_bucket, org=self.influx_org, record=points)
except Exception as e:
logger.error(f"Error collecting metrics for InfluxDB: {e}")