PagerMaid-Pyro/pagermaid/modules/sentry.py
Akkia e9fbdb09f3
🐛 Donot report data when reloaded (#71)
确保sentry和mixpanel不会在初始配置关闭时上报数据
2024-01-03 19:44:17 +08:00

82 lines
2.3 KiB
Python

import sentry_sdk
from subprocess import run, PIPE
import sys
from time import time
from pyrogram.errors import Unauthorized, UsernameInvalid
from sentry_sdk.integrations.httpx import HttpxIntegration
from pagermaid import Config
from pagermaid.enums import Client, Message
from pagermaid.hook import Hook
from pagermaid.single_utils import safe_remove
def sentry_before_send(event, hint):
global sentry_sdk_report_time
exc_info = hint.get("exc_info")
if exc_info and isinstance(exc_info[1], (Unauthorized, UsernameInvalid)):
# The user has been deleted/deactivated or session revoked
safe_remove("pagermaid.session")
sys.exit(1)
if time() <= sentry_sdk_report_time + 30:
sentry_sdk_report_time = time()
return None
else:
sentry_sdk_report_time = time()
return event
sentry_sdk_report_time = time()
sentry_sdk_git_hash = (
run("git rev-parse HEAD", stdout=PIPE, shell=True, check=True)
.stdout.decode()
.strip()
)
# fixme: Not enough for dynamic disable sentry,
# web server will still report if pgm start with Config.ERROR_REPORT = True
if Config.ERROR_REPORT:
sentry_sdk.init(
Config.SENTRY_API,
traces_sample_rate=1.0,
release=sentry_sdk_git_hash,
before_send=sentry_before_send,
environment="production",
integrations=[
HttpxIntegration(),
],
)
else:
sentry_sdk.init()
@Hook.on_startup()
async def sentry_init_id(bot: Client):
if not bot.me:
bot.me = await bot.get_me()
data = {"id": bot.me.id, "name": bot.me.first_name, "ip_address": "{{auto}}"}
if bot.me.username:
data["username"] = bot.me.username
sentry_sdk.set_user(data)
@Hook.process_error()
async def sentry_report(message: Message, command, exc_info, **_):
if not Config.ERROR_REPORT:
return
sender_id = message.from_user.id if message.from_user else ""
sender_id = message.sender_chat.id if message.sender_chat else sender_id
sentry_sdk.set_context(
"Target",
{
"ChatID": str(message.chat.id),
"UserID": str(sender_id),
"Msg": message.text or "",
},
)
if command:
sentry_sdk.set_tag("com", command)
sentry_sdk.capture_exception(exc_info)