Remove .env_example file and implement MetricsUpdater service for enhanced metrics tracking. Update bot.py to start and stop metrics updater, and improve database connection handling in CRUD operations with metrics tracking. Update README with details on metrics issues and fixes.
This commit is contained in:
69
services/infrastructure/db_metrics_decorator.py
Normal file
69
services/infrastructure/db_metrics_decorator.py
Normal file
@@ -0,0 +1,69 @@
|
||||
"""
|
||||
Декоратор для автоматического сбора метрик базы данных
|
||||
"""
|
||||
import time
|
||||
import functools
|
||||
from typing import Callable, Any
|
||||
|
||||
from .metrics import get_metrics_service
|
||||
from .logger import get_logger
|
||||
|
||||
|
||||
def track_db_operation(operation: str, table: str):
|
||||
"""
|
||||
Декоратор для отслеживания операций с базой данных
|
||||
|
||||
Args:
|
||||
operation: Тип операции (SELECT, INSERT, UPDATE, DELETE)
|
||||
table: Название таблицы
|
||||
"""
|
||||
def decorator(func: Callable) -> Callable:
|
||||
@functools.wraps(func)
|
||||
async def wrapper(*args, **kwargs) -> Any:
|
||||
metrics_service = get_metrics_service()
|
||||
logger = get_logger(__name__)
|
||||
start_time = time.time()
|
||||
|
||||
try:
|
||||
result = await func(*args, **kwargs)
|
||||
duration = time.time() - start_time
|
||||
|
||||
# Записываем успешную операцию
|
||||
metrics_service.record_db_query(operation, table, "success", duration)
|
||||
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
duration = time.time() - start_time
|
||||
|
||||
# Записываем неудачную операцию
|
||||
metrics_service.record_db_query(operation, table, "error", duration)
|
||||
metrics_service.increment_errors(type(e).__name__, "database_operation")
|
||||
|
||||
logger.error(f"Database operation failed: {operation} on {table}: {e}")
|
||||
raise
|
||||
|
||||
return wrapper
|
||||
return decorator
|
||||
|
||||
|
||||
def track_db_connection(func: Callable) -> Callable:
|
||||
"""
|
||||
Декоратор для отслеживания соединений с базой данных
|
||||
"""
|
||||
@functools.wraps(func)
|
||||
async def wrapper(*args, **kwargs) -> Any:
|
||||
metrics_service = get_metrics_service()
|
||||
logger = get_logger(__name__)
|
||||
|
||||
try:
|
||||
result = await func(*args, **kwargs)
|
||||
return result
|
||||
|
||||
except Exception as e:
|
||||
# Записываем только ошибки, не соединения
|
||||
metrics_service.increment_errors(type(e).__name__, "database_connection")
|
||||
logger.error(f"Database connection failed: {e}")
|
||||
raise
|
||||
|
||||
return wrapper
|
||||
Reference in New Issue
Block a user