From ac53c42452fd1c40597c07c7b762c58fb41f8f00 Mon Sep 17 00:00:00 2001 From: Rafael Bradley Date: Sun, 16 Mar 2025 02:18:52 -0300 Subject: [PATCH] feat(shard): :loud_sound: Set up sentry (GlitchTip). --- payphone/bot.py | 23 ++++++++++++++++++++ payphone/core/constants.py | 14 +++++++++++- pyproject.toml | 18 ++++++++++++++-- uv.lock | 44 ++++++++++++++++++++++++++++++++------ 4 files changed, 90 insertions(+), 9 deletions(-) diff --git a/payphone/bot.py b/payphone/bot.py index e23fa29..36caad2 100644 --- a/payphone/bot.py +++ b/payphone/bot.py @@ -2,6 +2,8 @@ from typing import Literal from datetime import datetime, timezone +import sys + import discord from discord.ext import commands from discord.ext.commands import errors @@ -10,6 +12,8 @@ from tortoise import expressions import redis.asyncio as redis +import sentry_sdk + from payphone.db import setup, models from payphone.core import constants, logging, exceptions, formatting, help_command @@ -57,6 +61,8 @@ class Payphone(commands.AutoShardedBot): self.log.info("Ready! Logged in as %s.", self.user.display_name) + raise Exception("HEYYY") + async def set_presence(self, shard_id: int) -> None: """Sets the presence of the bot back to online. @@ -380,8 +386,12 @@ class Payphone(commands.AutoShardedBot): return else: + sentry_sdk.capture_exception(exception) return await super().on_command_error(context, exception) + async def on_error(self, *args, **kwargs): + sentry_sdk.capture_exception(sys.exc_info()) + @property def embed_author(self) -> discord.EmbedAuthor: """The author of the embeds.""" @@ -440,6 +450,19 @@ class Payphone(commands.AutoShardedBot): def run(): """Runs the bot.""" + sentry_sdk.init( + constants.SENTRY_DSN, + environment="development" if constants.IS_DEBUG else "production", + debug=constants.IS_DEBUG, + server_name=f"Shard #{constants.SHARD_ID + 1}", + attach_stacktrace=True, + send_default_pii=True, + enable_tracing=True, + traces_sample_rate=1.0, + profiles_sample_rate=1.0, + release=constants.VERSION, + ) + bot = Payphone() try: diff --git a/payphone/core/constants.py b/payphone/core/constants.py index a8c3176..63df104 100644 --- a/payphone/core/constants.py +++ b/payphone/core/constants.py @@ -1,5 +1,7 @@ import os +import toml + try: import dotenv @@ -23,7 +25,7 @@ SHARD_COUNT = int(os.getenv("SHARD_COUNT", "1")) REDIS_HOST = os.getenv("REDIS_HOST", "localhost") REDIS_PORT = int(os.getenv("REDIS_PORT", "6379")) -INVISIBLE_CHARACTER = "\u200B" +INVISIBLE_CHARACTER = "\u200b" BRAILE_CHARACTER = "\u2800" PRIMARY_COLOR = 0xE2D9D0 @@ -32,3 +34,13 @@ MODERATOR_COLOR = 0xFF8787 MASK_COLOR = 0xFFC868 DISCORD_SERVER_INVITE = "https://discord.gg/fKuZty23pm" + +SENTRY_DSN = os.getenv( + "SENTRY_DSN", "https://d01de210c7684974a9d09697df15639c@errors.nyeki.dev/67" +) + +VERSION = None + +with open("pyproject.toml", "r", encoding="UTF-8") as f: + data = toml.load(f) + VERSION = "v" + data["project"]["version"].split(".")[1] diff --git a/pyproject.toml b/pyproject.toml index a7e1349..cfb0a81 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,10 +4,24 @@ version = "0.47.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" -dependencies = [ "aerich>=0.8.2", "aiohttp>=3.10.10", "orjson>=3.10.11", "py-cord>=2.6.1", "redis[hiredis]>=5.2.0", "rich>=13.9.4", "tortoise-orm[accel,asyncpg]>=0.21.7", "typer>=0.13.0",] +dependencies = [ + "aerich>=0.8.2", + "aiohttp>=3.10.10", + "orjson>=3.10.11", + "py-cord>=2.6.1", + "redis[hiredis]>=5.2.0", + "rich>=13.9.4", + "sentry-sdk>=2.22.0", + "toml>=0.10.2", + "tortoise-orm[accel,asyncpg]>=0.21.7", + "typer>=0.13.0", +] [dependency-groups] -dev = [ "python-dotenv>=1.0.1", "pyyaml>=6.0.2", "toml>=0.10.2",] +dev = [ + "python-dotenv>=1.0.1", + "pyyaml>=6.0.2", +] [tool.aerich] tortoise_orm = "payphone.db.setup.CONFIG" diff --git a/uv.lock b/uv.lock index 35ad0b2..abe3c05 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,4 @@ version = 1 -revision = 1 requires-python = ">=3.12" [[package]] @@ -128,7 +127,7 @@ version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cb/b5/e1e5fdf1c1bb7e6e614987c120a98d9324bf8edfaa5f5cd16a6235c9d91b/asyncclick-8.1.8.tar.gz", hash = "sha256:0f0eb0f280e04919d67cf71b9fcdfb4db2d9ff7203669c40284485c149578e4c", size = 232900 } wheels = [ @@ -169,6 +168,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, ] +[[package]] +name = "certifi" +version = "2025.1.31" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, +] + [[package]] name = "ciso8601" version = "2.3.2" @@ -189,7 +197,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -405,7 +413,7 @@ wheels = [ [[package]] name = "payphone" -version = "0.46.0" +version = "0.47.0" source = { virtual = "." } dependencies = [ { name = "aerich" }, @@ -414,6 +422,8 @@ dependencies = [ { name = "py-cord" }, { name = "redis", extra = ["hiredis"] }, { name = "rich" }, + { name = "sentry-sdk" }, + { name = "toml" }, { name = "tortoise-orm", extra = ["accel", "asyncpg"] }, { name = "typer" }, ] @@ -422,7 +432,6 @@ dependencies = [ dev = [ { name = "python-dotenv" }, { name = "pyyaml" }, - { name = "toml" }, ] [package.metadata] @@ -433,6 +442,8 @@ requires-dist = [ { name = "py-cord", specifier = ">=2.6.1" }, { name = "redis", extras = ["hiredis"], specifier = ">=5.2.0" }, { name = "rich", specifier = ">=13.9.4" }, + { name = "sentry-sdk", specifier = ">=2.22.0" }, + { name = "toml", specifier = ">=0.10.2" }, { name = "tortoise-orm", extras = ["accel", "asyncpg"], specifier = ">=0.21.7" }, { name = "typer", specifier = ">=0.13.0" }, ] @@ -441,7 +452,6 @@ requires-dist = [ dev = [ { name = "python-dotenv", specifier = ">=1.0.1" }, { name = "pyyaml", specifier = ">=6.0.2" }, - { name = "toml", specifier = ">=0.10.2" }, ] [[package]] @@ -655,6 +665,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, ] +[[package]] +name = "sentry-sdk" +version = "2.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/b6/662988ecd2345bf6c3a5c306a9a3590852742eff91d0a78a143398b816f3/sentry_sdk-2.22.0.tar.gz", hash = "sha256:b4bf43bb38f547c84b2eadcefbe389b36ef75f3f38253d7a74d6b928c07ae944", size = 303539 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/7f/0e4459173e9671ba5f75a48dda2442bcc48a12c79e54e5789381c8c6a9bc/sentry_sdk-2.22.0-py2.py3-none-any.whl", hash = "sha256:3d791d631a6c97aad4da7074081a57073126c69487560c6f8bffcf586461de66", size = 325815 }, +] + [[package]] name = "shellingham" version = "1.5.4" @@ -731,6 +754,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] +[[package]] +name = "urllib3" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, +] + [[package]] name = "uvloop" version = "0.21.0"