""" Эндпоинты для отладки. Автор: Сергей Антропов Сайт: https://devops.org.ru """ import json import logging from typing import Dict, Any from fastapi import APIRouter, HTTPException, Body import aiofiles from app.core.metrics import metrics from app.core.auth import hide_from_api # Импортируем settings в функции, чтобы избежать циклических зависимостей logger = logging.getLogger(__name__) router = APIRouter(prefix="/debug", tags=["debug"]) @hide_from_api @router.post( "/dump", name="JSON Debug dump", response_model=Dict[str, Any], include_in_schema=False, # Скрываем эндпоинт из Swagger UI responses={ 200: { "description": "Данные успешно сохранены", "content": { "application/json": { "example": { "status": "ok", "message": "Данные сохранены в dump.json", "data": { "test": "data", "timestamp": "2024-01-01T00:00:00Z", "source": "grafana", "alert": { "title": "Test alert", "state": "alerting" } } } } } }, 500: { "description": "Ошибка сохранения данных", "content": { "application/json": { "example": {"detail": "Ошибка записи в файл"} } } } } ) async def dump_request( dump: Dict[str, Any] = Body( ..., description="JSON данные для сохранения в файл dump.json", examples=[ { "test": "data", "timestamp": "2024-01-01T00:00:00Z", "source": "grafana", "alert": { "title": "Test alert", "state": "alerting" } }, { "source": "zabbix", "event": { "event-id": "8819711", "event-name": "High CPU utilization", "status": "PROBLEM" } }, { "source": "alertmanager", "status": "firing", "commonLabels": { "alertname": "HighCPUUsage", "severity": "critical" } } ] ) ) -> Dict[str, Any]: """ Сохранить JSON данные в файл для отладки. Используется для сохранения входящих webhook запросов для анализа. Подробная документация: см. docs/api/debug.md """ metrics.increment_api_endpoint("debug_dump") logger.info("Получен запрос на сохранение данных для отладки") try: dump_path = "/app/app/dump.json" async with aiofiles.open(dump_path, 'w', encoding='utf-8') as f: await f.write(json.dumps(dump, indent=4, ensure_ascii=False)) logger.info(f"Данные сохранены в {dump_path}") return { "status": "ok", "message": "Данные сохранены в dump.json", "data": dump } except Exception as e: logger.error(f"Ошибка сохранения данных: {e}") raise HTTPException(status_code=500, detail=f"Ошибка записи в файл: {str(e)}")