Add new file
This commit is contained in:
97
bots/handlers/health_handler.py
Normal file
97
bots/handlers/health_handler.py
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
Обработчик здоровья системы: периодическая очистка временных файлов,
|
||||||
|
проверка подключения к PostgreSQL и Qdrant.
|
||||||
|
|
||||||
|
Используется только на стороне клиентов (ботов) для локальной очистки.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class HealthHandler:
|
||||||
|
"""
|
||||||
|
Периодические задачи:
|
||||||
|
- Очистка временной директории (temp_dir) и upload_dir.
|
||||||
|
- Очистка постоянных пользовательских файлов (data/user_*).
|
||||||
|
- Healthcheck подключения к PostgreSQL и Qdrant (раз в час).
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, bot):
|
||||||
|
self.bot = bot
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# Цикл очистки файлов
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
|
||||||
|
async def cleanup_loop(self):
|
||||||
|
"""
|
||||||
|
Бесконечный цикл очистки временных файлов.
|
||||||
|
Интервал и сроки хранения берутся из конфига (cleanup.interval_seconds,
|
||||||
|
temp_cleanup_days, upload_cleanup_days, user_data_cleanup_days).
|
||||||
|
"""
|
||||||
|
while True:
|
||||||
|
await asyncio.sleep(self.bot.config.cleanup_interval)
|
||||||
|
try:
|
||||||
|
def sync_cleanup():
|
||||||
|
# Очистка временной папки (temp_dir)
|
||||||
|
self.bot.files.cleanup_old_files(days=self.bot.config.temp_cleanup_days)
|
||||||
|
|
||||||
|
# Очистка папки upload_dir
|
||||||
|
upload_dir = self.bot.config.upload_dir
|
||||||
|
if upload_dir.exists():
|
||||||
|
now = datetime.now().timestamp()
|
||||||
|
for root, dirs, files in os.walk(upload_dir, topdown=False):
|
||||||
|
for name in files:
|
||||||
|
file_path = os.path.join(root, name)
|
||||||
|
try:
|
||||||
|
if os.path.getmtime(file_path) < now - self.bot.config.upload_cleanup_days * 86400:
|
||||||
|
os.remove(file_path)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
for name in dirs:
|
||||||
|
dir_path = os.path.join(root, name)
|
||||||
|
try:
|
||||||
|
if not os.listdir(dir_path):
|
||||||
|
os.rmdir(dir_path)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Очистка постоянных пользовательских файлов в data/
|
||||||
|
data_dir = self.bot.config.data_dir
|
||||||
|
if data_dir.exists():
|
||||||
|
now = datetime.now().timestamp()
|
||||||
|
days = getattr(self.bot.config, 'user_data_cleanup_days', 30)
|
||||||
|
for file_path in data_dir.iterdir():
|
||||||
|
if file_path.is_file() and file_path.name.startswith('user_'):
|
||||||
|
if now - file_path.stat().st_mtime > days * 86400:
|
||||||
|
file_path.unlink()
|
||||||
|
logger.debug(f"Удалён старый пользовательский файл: {file_path.name}")
|
||||||
|
|
||||||
|
await asyncio.to_thread(sync_cleanup)
|
||||||
|
logger.info("Очистка временных файлов выполнена")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Ошибка в цикле очистки: {e}")
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
# Мониторинг состояния БД и Qdrant
|
||||||
|
# ------------------------------------------------------------------
|
||||||
|
|
||||||
|
async def database_health_logger(self):
|
||||||
|
"""
|
||||||
|
Бесконечный цикл: раз в час проверяет соединение с PostgreSQL и Qdrant,
|
||||||
|
логирует результат (OK или FAILED).
|
||||||
|
"""
|
||||||
|
while True:
|
||||||
|
await asyncio.sleep(3600)
|
||||||
|
|
||||||
|
# --- Проверка PostgreSQL (через RAG-сервер, бот не имеет прямой БД) ---
|
||||||
|
# В новой архитектуре бот не имеет прямого доступа к БД,
|
||||||
|
# поэтому healthcheck перенесён на RAG-сервер.
|
||||||
|
# Здесь мы просто логируем, что проверка пропущена.
|
||||||
|
logger.debug("Healthcheck БД выполняется на RAG-сервере")
|
||||||
Reference in New Issue
Block a user