- FastAPI приложение для отправки мониторинговых алертов в мессенджеры - Поддержка Telegram и MAX/VK - Интеграция с Grafana, Zabbix, AlertManager - Автоматическое создание тикетов в Jira - Управление группами мессенджеров через API - Декораторы для авторизации и скрытия эндпоинтов - Подробная документация в папке docs/ Автор: Сергей Антропов Сайт: https://devops.org.ru
115 lines
3.8 KiB
Python
115 lines
3.8 KiB
Python
"""
|
|
Эндпоинты для отладки.
|
|
|
|
Автор: Сергей Антропов
|
|
Сайт: 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)}")
|