Files
bottohelp/metrics/setup_monitoring.py
T

245 lines
8.0 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Автоматическая настройка системы мониторинга.
Создает конфигурацию и проверяет все компоненты.
"""
import os
import json
import sys
import io
from pathlib import Path
# Установка UTF-8 кодировки
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
def print_header(text):
"""Печатает заголовок с эмодзи"""
print(f"\n🚀 {text}")
print("=" * (len(text) + 3))
def print_success(text):
"""Печатает успешное сообщение"""
print(f"✅ {text}")
def print_warning(text):
"""Печатает предупреждение"""
print(f"⚠️ {text}")
def print_error(text):
"""Печатает ошибку"""
print(f"❌ {text}")
def check_dependencies():
"""Проверка зависимостей"""
print_header("Проверка зависимостей")
required_packages = [
'prometheus_client',
'sentry-sdk',
'flask',
'requests'
]
missing_packages = []
for package in required_packages:
try:
__import__(package.replace('-', '_'))
print_success(f"{package} - установлен")
except ImportError:
missing_packages.append(package)
print_error(f"{package} - не установлен")
if missing_packages:
print_warning(f"Установите недостающие пакеты: pip install {' '.join(missing_packages)}")
return False
return True
def setup_configuration():
"""Настройка конфигурации"""
print_header("Настройка конфигурации")
config_path = "config_local.py"
if not os.path.exists(config_path):
print_warning(f"Файл {config_path} не найден. Создайте его на основе config_template.py")
return False
# Проверяем, что в конфигурации есть настройки мониторинга
with open(config_path, 'r', encoding='utf-8') as f:
config_content = f.read()
monitoring_settings = [
'ENABLE_SENTRY',
'SENTRY_DSN',
'PROMETHEUS_PORT',
'ENABLE_DEVELOPER_NOTIFICATIONS',
'DEVELOPER_CHAT_ID'
]
missing_settings = []
for setting in monitoring_settings:
if setting not in config_content:
missing_settings.append(setting)
if missing_settings:
print_warning("Добавьте настройки мониторинга в config_local.py:")
print("\n# Мониторинг ошибок")
print("ENABLE_SENTRY = True")
print('SENTRY_DSN = "http://localhost:8000/api/1/project/your-project/dsn/"')
print("PROMETHEUS_PORT = 8000")
print("ENABLE_DEVELOPER_NOTIFICATIONS = True")
print("DEVELOPER_CHAT_ID = 123456789 # Ваш Telegram ID")
return False
print_success("Конфигурация настроена правильно")
return True
def check_glitchtip_setup():
"""Проверка настройки GlitchTip"""
print_header("Проверка GlitchTip")
# Проверяем docker-compose.yml
docker_compose_path = "docker-compose.yml"
if os.path.exists(docker_compose_path):
with open(docker_compose_path, 'r', encoding='utf-8') as f:
content = f.read()
if 'glitchtip' in content.lower():
print_success("Docker Compose для GlitchTip настроен")
else:
print_warning("GlitchTip не найден в docker-compose.yml")
else:
print_warning("docker-compose.yml не найден. Создайте по инструкции в GLITCHTIP_SETUP.md")
def test_imports():
"""Тестирование импорта модулей мониторинга"""
print_header("Тестирование импорта модулей")
modules_to_test = [
('core.monitoring', 'MetricsCollector'),
('core.alerts', 'AlertManager'),
('prometheus_client', 'Counter'),
('sentry_sdk', 'init')
]
all_good = True
for module_name, class_name in modules_to_test:
try:
module = __import__(module_name, fromlist=[class_name])
getattr(module, class_name)
print_success(f"{module_name}.{class_name} - доступен")
except (ImportError, AttributeError) as e:
print_error(f"{module_name}.{class_name} - ошибка: {e}")
all_good = False
return all_good
def check_documentation():
"""Проверка наличия документации"""
print_header("Проверка документации")
required_docs = [
'MONITORING.md',
'README_MONITORING.md',
'GLITCHTIP_SETUP.md',
'WEBHOOK_ALERTS.md',
'START_MONITORING.md'
]
all_docs_present = True
for doc in required_docs:
if os.path.exists(doc):
print_success(f"{doc} - найден")
else:
print_error(f"{doc} - отсутствует")
all_docs_present = False
return all_docs_present
def create_sample_config():
"""Создание примера конфигурации"""
print_header("Создание примера конфигурации мониторинга")
sample_config = '''
# Пример настроек мониторинга для config_local.py
# Включение системы мониторинга
ENABLE_SENTRY = True
SENTRY_DSN = "http://localhost:8000/api/1/project/your-project-id/dsn/"
# Настройки Prometheus
PROMETHEUS_PORT = 8000
# Уведомления разработчиков
ENABLE_DEVELOPER_NOTIFICATIONS = True
DEVELOPER_CHAT_ID = 123456789 # Замените на ваш Telegram ID
# Логирование
LOG_CONFIG = {
"level": "INFO",
"file": "bot.log",
"format": "json",
"max_size": 10*1024*1024,
"backup_count": 5
}
'''
config_path = "config_monitoring_sample.py"
with open(config_path, 'w', encoding='utf-8') as f:
f.write(sample_config)
print_success(f"Пример конфигурации создан: {config_path}")
def main():
"""Главная функция настройки"""
print("🔧 Автоматическая настройка системы мониторинга")
print("=" * 50)
all_checks_passed = True
# Проверяем зависимости
if not check_dependencies():
all_checks_passed = False
# Проверяем конфигурацию
if not setup_configuration():
all_checks_passed = False
# Проверяем GlitchTip
check_glitchtip_setup()
# Тестируем импорты
if not test_imports():
all_checks_passed = False
# Проверяем документацию
if not check_documentation():
all_checks_passed = False
# Создаем пример конфигурации
create_sample_config()
print("\n" + "=" * 50)
if all_checks_passed:
print("🎉 Настройка завершена успешно!")
print("\n📋 Следующие шаги:")
print("1. Настройте GlitchTip по инструкции в GLITCHTIP_SETUP.md")
print("2. Получите DSN и добавьте в config_local.py")
print("3. Запустите бота: python new_bot.py")
print("4. Проверьте метрики: http://localhost:8000/metrics")
else:
print("⚠️ Требуются дополнительные настройки!")
print("\n🔧 Исправьте проблемы и запустите настройку снова")
print(f"\n📚 Документация в файлах:")
for file in ['MONITORING.md', 'README_MONITORING.md', 'GLITCHTIP_SETUP.md', 'START_MONITORING.md']:
if os.path.exists(file):
print(f"• {file}")
if __name__ == "__main__":
main()