- Создан LogBoard клиент для отправки логов с удаленных серверов - Добавлен API эндпоинт /api/logs/remote с аутентификацией - Реализована структурированная система сохранения логов - Исправлена совместимость Docker client библиотеки - Добавлена полная документация и тестирование
138 lines
5.5 KiB
Python
138 lines
5.5 KiB
Python
#!/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())
|