# πŸ“Š БистСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ошибок ## ΠžΠ±Π·ΠΎΡ€ БистСма ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-Π±ΠΎΡ‚Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя комплСксноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для отслСТивания ошибок, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π°Π»Π΅Ρ€Ρ‚ΠΎΠ². Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° с использованиСм Prometheus, Sentry ΠΈ кастомной систСмы Π°Π»Π΅Ρ€Ρ‚ΠΎΠ². ## πŸš€ ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ систСмы ### 1. Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Structured Logging) - **Π€ΠΎΡ€ΠΌΠ°Ρ‚**: JSON для Π»Π΅Π³ΠΊΠΎΠ³ΠΎ парсинга - **Π£Ρ€ΠΎΠ²Π½ΠΈ**: DEBUG, INFO, WARNING, ERROR, CRITICAL - **Ротация**: АвтоматичСская ротация Π»ΠΎΠ³ΠΎΠ² - **Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ**: ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ERROR ΠΈ Π²Ρ‹ΡˆΠ΅ Π² Sentry ### 2. ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ (Prometheus) - **Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ**: HTTP endpoint Π½Π° ΠΏΠΎΡ€Ρ‚Ρƒ 8000 (настраиваСмо) - **Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ**: - `telegram_bot_errors_total` - количСство ошибок ΠΏΠΎ Ρ‚ΠΈΠΏΠ°ΠΌ - `telegram_bot_command_duration_seconds` - врСмя выполнСния ΠΊΠΎΠΌΠ°Π½Π΄ - `telegram_bot_active_users` - количСство Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ - `telegram_bot_messages_total` - ΠΎΠ±Ρ‰Π΅Π΅ количСство сообщСний - `telegram_bot_api_response_time_seconds` - врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° Π²Π½Π΅ΡˆΠ½ΠΈΡ… API - `telegram_bot_status` - статус Π±ΠΎΡ‚Π° (1=Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, 0=остановлСн) ### 3. ΠœΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ошибок (Sentry) - **АвтоматичСский Π·Π°Ρ…Π²Π°Ρ‚**: ВсС Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ - **Performance monitoring**: ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ - **Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ**: Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ тСстовых Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ - **ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚**: Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π±ΠΎΡ‚Π΅ ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ### 4. БистСма Π°Π»Π΅Ρ€Ρ‚ΠΎΠ² (AlertManager) - **Π’ΠΈΠΏΡ‹ Π°Π»Π΅Ρ€Ρ‚ΠΎΠ²**: - Высокая частота ошибок (>10 Π² ΠΌΠΈΠ½ΡƒΡ‚Ρƒ) - ПадСниС Π±ΠΎΡ‚Π° - ВысокоС врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° (>5 сСкунд) - ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Π‘Π” - **ΠšΠ°Π½Π°Π»Ρ‹ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΉ**: - Telegram (Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ) - Email - Webhook ## πŸ›  Настройка ### 1. Установка зависимостСй ```bash pip install prometheus_client sentry-sdk ``` ### 2. ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² `config_local.py`: ```python # Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ENABLE_SENTRY = True SENTRY_DSN = "https://your-dsn@sentry.io/project-id" # Настройки Prometheus PROMETHEUS_PORT = 8000 # УвСдомлСния Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ENABLE_DEVELOPER_NOTIFICATIONS = True DEVELOPER_CHAT_ID = 123456789 # ID Ρ‡Π°Ρ‚Π° для Π°Π»Π΅Ρ€Ρ‚ΠΎΠ² ``` ### 3. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния ```bash export ENABLE_SENTRY=true export SENTRY_DSN="https://your-dsn@sentry.io/project-id" export PROMETHEUS_PORT=8000 export DEVELOPER_CHAT_ID=123456789 ``` ## πŸ“ˆ ИспользованиС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ### Prometheus endpoint ``` http://localhost:8000/metrics ``` ### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ запросов ΠΊ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°ΠΌ ```promql # ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ошибок Π² ΠΌΠΈΠ½ΡƒΡ‚Ρƒ rate(telegram_bot_errors_total[1m]) # Π‘Ρ€Π΅Π΄Π½Π΅Π΅ врСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ rate(telegram_bot_command_duration_seconds_sum[5m]) / rate(telegram_bot_command_duration_seconds_count[5m]) # АктивныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ telegram_bot_active_users # Бтатус Π±ΠΎΡ‚Π° telegram_bot_status ``` ## 🎯 Настройка Π°Π»Π΅Ρ€Ρ‚ΠΎΠ² ### Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π°Π»Π΅Ρ€Ρ‚Π° ```python from core.alerts import AlertManager # Π’ Application ΠΈΠ»ΠΈ Π³Π΄Π΅-Ρ‚ΠΎ Π΅Ρ‰Π΅ alert_manager = AlertManager(config, metrics) # ДобавляСм Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ alert_manager.add_alert_rule('custom_rule', { 'enabled': True, 'threshold': 100, 'cooldown': 600, # 10 ΠΌΠΈΠ½ΡƒΡ‚ 'last_alert': None }) ``` ### ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π°Π»Π΅Ρ€Ρ‚Π° ```python alert_manager.disable_alert_rule('high_error_rate') ``` ## πŸ”§ Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ Π² ΠΊΠΎΠ΄ ### ИспользованиС Π΄Π΅ΠΊΠΎΡ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ```python from core.monitoring import measure_time, error_handler class MyHandler(BaseHandler): @measure_time(metrics, 'weather_api') async def call_external_api(self): # Код API Π²Ρ‹Π·ΠΎΠ²Π° pass @error_handler(metrics, 'my_handler') async def risky_operation(self): # Рискованный ΠΊΠΎΠ΄ pass ``` ### Ручная запись ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ```python # Π—Π°ΠΏΠΈΡΡŒ ошибки metrics.record_error('DatabaseError', 'user_handler', exception) # Π—Π°ΠΏΠΈΡΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ metrics.record_command('start', 'user_handler', duration) # Π—Π°ΠΏΠΈΡΡŒ сообщСния metrics.record_message('text') # ОбновлСниС Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ metrics.update_active_users(150) ``` ## πŸ“Š Grafana Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Ρ‹ ### Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ°Π½Π΅Π»ΠΈ 1. **ΠžΠ±Π·ΠΎΡ€ ошибок** - Π“Ρ€Π°Ρ„ΠΈΠΊ количСства ошибок ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ - Π Π°Π·Π±ΠΈΠ²ΠΊΠ° ΠΏΠΎ Ρ‚ΠΈΠΏΠ°ΠΌ ошибок - Π’ΠΎΠΏ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² с ошибками 2. **ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ** - ВрСмя ΠΎΡ‚ΠΊΠ»ΠΈΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄ - Π‘Ρ€Π΅Π΄Π½Π΅Π΅ врСмя API Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² - Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° систСмы 3. **ΠΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ** - ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ - ΠžΠ±Ρ‰Π΅Π΅ количСство сообщСний - Π’ΠΎΠΏ ΠΊΠΎΠΌΠ°Π½Π΄ 4. **БистСмныС ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ** - Бтатус Π±ΠΎΡ‚Π° - ИспользованиС памяти/CPU - БостояниС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ ### ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ datasource ```json { "name": "Telegram Bot Prometheus", "type": "prometheus", "url": "http://localhost:8000", "access": "proxy" } ``` ## πŸ§ͺ ВСстированиС ### Запуск тСстов ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° ```bash pytest tests/test_monitoring.py -v ``` ### Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ ошибок для тСстирования ```python # Π’ ΠΊΠΎΠ΄Π΅ для тСстирования import time async def test_error_scenario(): # Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡ‚Π²Π΅Ρ‚Π° await asyncio.sleep(6) # > 5 сСкунд для Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Π° Π°Π»Π΅Ρ€Ρ‚Π° # Π˜ΠΌΠΈΡ‚Π°Ρ†ΠΈΡ ошибки raise ValueError("Test error for monitoring") ``` ## 🚨 Troubleshooting ### ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Prometheus 1. **ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π΅ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ** - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΡ€Ρ‚ 8000 - Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ `prometheus_client` установлСн 2. **Высокая Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ°** - Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ частоту сбора ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ - Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ sampling для высоконагруТСнных endpoint'ΠΎΠ² ### ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Sentry 1. **Ошибки Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ** - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ SENTRY_DSN - Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ENABLE_SENTRY=true - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ сСтСвыС настройки 2. **Блишком ΠΌΠ½ΠΎΠ³ΠΎ событий** - НастройтС Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ Π² `_before_send_sentry` - Π£Π²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ `traces_sample_rate` ### ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с Π°Π»Π΅Ρ€Ρ‚Π°ΠΌΠΈ 1. **АлСрты Π½Π΅ приходят** - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ DEVELOPER_CHAT_ID - Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΡ€Π°Π²Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСний 2. **Блишком ΠΌΠ½ΠΎΠ³ΠΎ Π°Π»Π΅Ρ€Ρ‚ΠΎΠ²** - Π£Π²Π΅Π»ΠΈΡ‡ΡŒΡ‚Π΅ cooldown Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… - НастройтС ΠΏΠΎΡ€ΠΎΠ³ΠΈ срабатывания ## πŸ“‹ TODO для ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π° - [ ] ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ рСсурсов сСрвСра (CPU, ΠΏΠ°ΠΌΡΡ‚ΡŒ, диск) - [ ] Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ health checks endpoint - [ ] Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с внСшними систСмами ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° - [ ] ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ retention ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ для ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΈ Π»ΠΎΠ³ΠΎΠ² - [ ] Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ A/B тСстированиС Π°Π»Π΅Ρ€Ρ‚ΠΎΠ² - [ ] Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ runbook для рСагирования Π½Π° Π°Π»Π΅Ρ€Ρ‚Ρ‹ ## 🀝 Π’ΠΊΠ»Π°Π΄ Π² Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²Ρ‹Ρ… ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΈΠ»ΠΈ Π°Π»Π΅Ρ€Ρ‚ΠΎΠ²: 1. Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ описаниС Π² эту Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ 2. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ тСсты 3. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости 4. ΠŸΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π² staging ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ ## πŸ“ž ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠŸΡ€ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°Ρ… с систСмой ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°: 1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π»ΠΎΠ³ΠΈ Π² `bot.log` 2. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π² Prometheus 3. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ настройки Π² Sentry 4. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ΡΡŒ ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ --- *ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: ΠžΠΊΡ‚ΡΠ±Ρ€ΡŒ 2025*