logboard/client/test_client.py
Сергей Антропов 04dfe30d58 feat: Добавлена поддержка удаленных клиентов для LogBoard+
- Создан LogBoard клиент для отправки логов с удаленных серверов
- Добавлен API эндпоинт /api/logs/remote с аутентификацией
- Реализована структурированная система сохранения логов
- Исправлена совместимость Docker client библиотеки
- Добавлена полная документация и тестирование
2025-08-20 19:25:29 +03:00

138 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""
Тестовый скрипт для проверки работы LogBoard клиента
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
import asyncio
import aiohttp
import json
import os
from datetime import datetime
# Конфигурация теста
SERVER_URL = os.getenv('LOGBOARD_SERVER_URL', 'http://localhost:8000')
API_KEY = os.getenv('LOGBOARD_API_KEY', 'dev-key-123')
HOSTNAME = os.getenv('HOSTNAME', 'test-host')
async def test_remote_logs_endpoint():
"""Тестирование эндпоинта для удаленных логов"""
print(f"Тестирование подключения к серверу: {SERVER_URL}")
# Тестовые данные
test_data = {
"hostname": HOSTNAME,
"container_name": "test-nginx",
"logs": [
f"{datetime.now().isoformat()} nginx: [info] Test log line 1",
f"{datetime.now().isoformat()} nginx: [info] Test log line 2",
f"{datetime.now().isoformat()} nginx: [error] Test error log",
f"{datetime.now().isoformat()} nginx: [warn] Test warning log"
],
"timestamp": datetime.now().isoformat()
}
headers = {
'Authorization': f'Bearer {API_KEY}',
'Content-Type': 'application/json',
'User-Agent': 'LogBoard-Client-Test/1.0'
}
try:
async with aiohttp.ClientSession() as session:
async with session.post(
f"{SERVER_URL}/api/v1/logs/remote",
json=test_data,
headers=headers,
timeout=aiohttp.ClientTimeout(total=30)
) as response:
print(f"Статус ответа: {response.status}")
if response.status == 200:
result = await response.json()
print("✅ Успешно отправлены логи:")
print(f" - Хост: {result.get('hostname')}")
print(f" - Контейнер: {result.get('container_name')}")
print(f" - Количество строк: {result.get('message')}")
print(f" - Файл логов: {result.get('log_file')}")
return True
else:
error_text = await response.text()
print(f"❌ Ошибка отправки логов: {response.status}")
print(f" Ответ сервера: {error_text}")
return False
except aiohttp.ClientError as e:
print(f"❌ Ошибка подключения к серверу: {e}")
return False
except Exception as e:
print(f"❌ Неожиданная ошибка: {e}")
return False
async def test_server_health():
"""Тестирование доступности сервера"""
print(f"Проверка доступности сервера: {SERVER_URL}")
try:
async with aiohttp.ClientSession() as session:
async with session.get(
f"{SERVER_URL}/",
timeout=aiohttp.ClientTimeout(total=10)
) as response:
if response.status == 200:
print("✅ Сервер доступен")
return True
else:
print(f"❌ Сервер недоступен, статус: {response.status}")
return False
except Exception as e:
print(f"❌ Ошибка подключения к серверу: {e}")
return False
async def main():
"""Основная функция тестирования"""
print("=" * 60)
print("LogBoard Client - Тестирование")
print("=" * 60)
print(f"Сервер: {SERVER_URL}")
print(f"API ключ: {API_KEY[:10]}..." if len(API_KEY) > 10 else f"API ключ: {API_KEY}")
print(f"Хост: {HOSTNAME}")
print()
# Тест 1: Проверка доступности сервера
print("1. Проверка доступности сервера...")
server_available = await test_server_health()
print()
if not server_available:
print("❌ Сервер недоступен. Проверьте настройки и запустите сервер.")
return
# Тест 2: Отправка тестовых логов
print("2. Отправка тестовых логов...")
logs_sent = await test_remote_logs_endpoint()
print()
# Результаты тестирования
print("=" * 60)
print("РЕЗУЛЬТАТЫ ТЕСТИРОВАНИЯ")
print("=" * 60)
if server_available and logs_sent:
print("Все тесты пройдены успешно!")
print(" LogBoard клиент готов к работе.")
elif server_available and not logs_sent:
print("⚠️ Сервер доступен, но есть проблемы с отправкой логов.")
print(" Проверьте настройки API ключа.")
else:
print("❌ Тесты не пройдены.")
print(" Проверьте настройки подключения к серверу.")
print()
print("Для запуска клиента используйте: make up")
print("Для просмотра логов: make logs")
if __name__ == "__main__":
asyncio.run(main())