From 994469c2e361a43acaf1eea17b1a49f65983921d Mon Sep 17 00:00:00 2001 From: Untone Date: Fri, 16 Feb 2024 12:34:39 +0300 Subject: [PATCH] cleaner-main --- main.py | 62 ++++++++++------------------------------------ pyproject.toml | 2 +- services/sentry.py | 33 ++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 50 deletions(-) create mode 100644 services/sentry.py diff --git a/main.py b/main.py index f0e2503b..5b113434 100644 --- a/main.py +++ b/main.py @@ -2,14 +2,8 @@ import os from importlib import import_module from os.path import exists -import sentry_sdk from ariadne import load_schema_from_path, make_executable_schema from ariadne.asgi import GraphQL -from sentry_sdk.integrations.aiohttp import AioHttpIntegration -from sentry_sdk.integrations.ariadne import AriadneIntegration -from sentry_sdk.integrations.redis import RedisIntegration -from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration -from sentry_sdk.integrations.starlette import StarletteIntegration from starlette.applications import Starlette from starlette.routing import Route @@ -18,57 +12,27 @@ from services.schema import resolvers from services.search import search_service from services.viewed import ViewedStorage from services.webhook import WebhookEndpoint -from settings import DEV_SERVER_PID_FILE_NAME, MODE, SENTRY_DSN +from settings import DEV_SERVER_PID_FILE_NAME, MODE import_module('resolvers') - schema = make_executable_schema(load_schema_from_path('schema/'), resolvers) -async def start_up(): - print(f'[main] starting in {MODE} mode') - - with sentry_sdk.start_transaction(op='task', name='Redis Connection'): - await redis.connect() - - # start viewed service - await ViewedStorage.init() - - # start search service - search_service.info() - - if MODE == 'development': - # pid file management - if not exists(DEV_SERVER_PID_FILE_NAME): - with open(DEV_SERVER_PID_FILE_NAME, 'w', encoding='utf-8') as f: - f.write(str(os.getpid())) - - if MODE == 'production': - # sentry monitoring - try: - sentry_sdk.init( - SENTRY_DSN, - enable_tracing=True, - integrations=[ - StarletteIntegration(), - AriadneIntegration(), - SqlalchemyIntegration(), - RedisIntegration(), - AioHttpIntegration(), - ], - ) - except Exception as e: - print('[sentry] init error') - print(e) - - -async def shutdown(): - await redis.disconnect() - +async def dev_pid(): + # pid file management + if MODE == 'development' and not exists(DEV_SERVER_PID_FILE_NAME): + with open(DEV_SERVER_PID_FILE_NAME, 'w', encoding='utf-8') as f: + f.write(str(os.getpid())) + print(f'[main] started in {MODE} mode') routes = [ Route('/', GraphQL(schema, debug=True)), Route('/new-author', WebhookEndpoint), ] -app = Starlette(routes=routes, debug=True, on_startup=[start_up], on_shutdown=[shutdown]) +app = Starlette(routes=routes, debug=True, on_startup=[ + redis.connect, + ViewedStorage.init, + search_service.info, + dev_pid + ], on_shutdown=[redis.disconnect]) diff --git a/pyproject.toml b/pyproject.toml index e0031b25..a600cfdd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ python = "^3.12" SQLAlchemy = "^2.0.22" psycopg2-binary = "^2.9.9" redis = {extras = ["hiredis"], version = "^5.0.1"} -sentry-sdk = "^1.4.1" +sentry-sdk = { version = "^1.4.1", extras = ["starlette", "aiohttp", "ariadne", "sqlalchemy"] } starlette = "^0.36.1" gql = "^3.4.1" ariadne = "^0.21" diff --git a/services/sentry.py b/services/sentry.py new file mode 100644 index 00000000..84995111 --- /dev/null +++ b/services/sentry.py @@ -0,0 +1,33 @@ +import sentry_sdk +from sentry_sdk.integrations.aiohttp import AioHttpIntegration +from sentry_sdk.integrations.ariadne import AriadneIntegration +from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration +from sentry_sdk.integrations.starlette import StarletteIntegration + +from settings import SENTRY_DSN + + +def start_sentry(): + # sentry monitoring + try: + sentry_sdk.init( + SENTRY_DSN, + # Set traces_sample_rate to 1.0 to capture 100% + # of transactions for performance monitoring. + traces_sample_rate=1.0, + # Set profiles_sample_rate to 1.0 to profile 100% + # of sampled transactions. + # We recommend adjusting this value in production. + profiles_sample_rate=1.0, + enable_tracing=True, + integrations=[ + StarletteIntegration(), + AriadneIntegration(), + SqlalchemyIntegration(), + # RedisIntegration(), + AioHttpIntegration() + ] + ) + except Exception as e: + print('[sentry] init error') + print(e)