server selection

This commit is contained in:
2025-11-06 07:11:15 +09:00
parent 8bc115acf3
commit 8276c57010
24 changed files with 1964 additions and 43 deletions

View File

@@ -0,0 +1,391 @@
# 🔧 Отладка настроек сервера WellShe
## 🎯 Цель
Диагностировать и исправить проблему со сбросом настроек сервера после перезапуска приложения + добавить мониторинг здоровья серверов.
## 📊 Проблема (РЕШЕНА ✅)
Запросы периодически возвращались на старый сервер (`http://192.168.0.112:8000`) вместо нового (`http://10.0.2.2:8000`), что указывало на проблемы с сохранением настроек.
## 🎉 НОВАЯ ФУНКЦИОНАЛЬНОСТЬ: Мониторинг здоровья серверов
### 📡 Health Check система
Приложение теперь автоматически проверяет доступность и производительность серверов через эндпоинт `/api/v1/health`.
#### Индикаторы состояния:
- 🟢 **Отлично** (< 10мс) - Зеленый индикатор
- 🟡 **Хорошо** (10-200мс) - Желтый индикатор
- 🟠 **Медленно** (200-600мс) - Оранжевый индикатор
- 🔴 **Очень медленно** (600мс+) - Красный индикатор
- **Недоступен** - Серый индикатор
#### Что проверяется:
1. **Доступность сервера** - отвечает ли сервер на запросы
2. **Время отклика** - скорость ответа (пинг)
3. **Статус здоровья** - возвращает ли сервер `status: "healthy"` или `status: "ok"`
### 🔧 Новые компоненты
#### 1. Модели данных (`ServerHealth.kt`)
```kotlin
data class ServerHealthResponse(
val status: String,
val timestamp: String? = null,
val version: String? = null
)
data class ServerStatus(
val url: String,
val isHealthy: Boolean,
val pingMs: Long,
val status: HealthStatus,
val error: String? = null
)
enum class HealthStatus {
EXCELLENT, GOOD, POOR, BAD, OFFLINE
}
```
#### 2. API интерфейс (`HealthApi.kt`)
```kotlin
interface HealthApi {
@GET("api/v1/health")
suspend fun getHealth(): Response<ServerHealthResponse>
}
```
#### 3. Репозиторий (`ServerHealthRepository.kt`)
- Проверка здоровья отдельных серверов
- Массовая проверка всех серверов
- Таймауты и обработка ошибок
- Детальное логирование
#### 4. UI компоненты (`ServerStatusIndicator.kt`)
- `ServerStatusIndicator` - цветной индикатор состояния
- `ServerStatusRow` - строка сервера с информацией о статусе
- Отображение времени отклика и статуса
#### 5. Обновленный диалог (`ServerSettingsDialog.kt`)
- Кнопка обновления статуса серверов
- 📊 Отображение статуса каждого сервера
- Индикатор загрузки во время проверки
- 📖 Легенда со значениями статусов
### 🔄 Как это работает
1. **При открытии диалога** настроек автоматически запускается проверка всех серверов
2. **Параллельная проверка** - все серверы проверяются одновременно
3. **Визуальная обратная связь** - индикаторы загрузки и цветные статусы
4. **Кнопка обновления** - возможность перепроверить статус вручную
5. **Таймауты** - максимум 5 секунд на проверку каждого сервера
## 🛠️ Добавленные улучшения отладки
### 1. Детальное логирование в ServerPreferences
```kotlin
// Добавлены логи для отслеживания:
- Получения URL сервера: "Getting server URL: ..."
- Сохранения URL: "Setting server URL: ..."
- Проверки успешности: "Server URL saved successfully: ..."
- Отладочная информация: debugSettings()
```
### 2. Отслеживание в RetrofitProvider
```kotlin
// Логирование создания Retrofit:
- "Getting Retrofit for serverUrl: ..."
- "Creating new Retrofit instance. Old URL: ..., New URL: ..."
- "Retrofit instance created successfully with baseUrl: ..."
```
### 3. Диагностика при запуске приложения
```kotlin
// В WellSheApplication.onCreate():
- Логирование настроек при старте приложения
- Отслеживание ошибок инициализации
```
### 4. Health Check логирование
```kotlin
// В ServerHealthRepository:
- "Checking health for server: ..."
- "Health check for ... completed in ...ms"
- "Server ... is healthy/unhealthy, ping: ...ms"
- "Health check completed for all servers"
```
## 🕵️ Инструкции по диагностике
### Шаг 1: Установите обновленную версию
Соберите и установите приложение с новой функциональностью health check'а.
### Шаг 2: Запустите приложение
При запуске в логах должно появиться:
```
WellSheApplication: WellShe Application starting...
ServerPreferences: === Debug Server Settings ===
ServerPreferences: Current server URL: [текущий URL]
ServerSettingsViewModel: ServerSettingsViewModel initialized
ServerHealthRepository: Checking health for X servers
WellSheApplication: Application started successfully
```
### Шаг 3: Откройте диалог настроек сервера
1. Нажмите на экране входа
2. Наблюдайте автоматическую проверку серверов
**Ожидаемые логи:**
```
ServerHealthRepository: Checking health for server: http://10.0.2.2:8000
ServerHealthRepository: Health check for http://10.0.2.2:8000 completed in XXXms
ServerHealthRepository: Server http://10.0.2.2:8000 is healthy, ping: XXXms
ServerHealthRepository: Health check completed for all servers
```
### Шаг 4: Проверьте визуальные индикаторы
- Зеленые круги 🟢 для быстрых серверов (< 10мс)
- Желтые круги 🟡 для нормальных серверов (10-200мс)
- Красные круги 🔴 для медленных серверов (600мс+)
- Серые круги для недоступных серверов
### Шаг 5: Выберите сервер и сохраните
Выберите сервер с лучшим статусом и сохраните настройки.
### Шаг 6: Проверьте запрос авторизации
Попробуйте войти в систему.
**Ожидаемые логи:**
```
RetrofitProvider: Getting Retrofit for serverUrl: http://10.0.2.2:8000/api/v1/
okhttp.OkHttpClient: --> POST http://10.0.2.2:8000/api/v1/auth/login
```
## 🚨 Возможные проблемы и решения
### Проблема 1: Health check не работает
**Симптомы:**
```
ServerHealthRepository: Error checking health for http://...: Connection failed
```
**Причины:**
1. Сервер не отвечает на `/api/v1/health`
2. Неправильный формат ответа
3. Сетевые проблемы
**Решение:**
1. Проверить доступность эндпоинта в браузере
2. Убедиться что сервер возвращает JSON с полем `status`
3. Проверить сетевое подключение
### Проблема 2: Все серверы показывают "Недоступен"
**Симптомы:** Все индикаторы серые
**Причины:**
1. Проблемы с сетью
2. Блокировка запросов firewall'ом
3. Неправильные URL серверов
**Решение:**
1. Проверить подключение к интернету
2. Проверить настройки сети эмулятора
3. Убедиться что URL серверов корректны
### Проблема 3: Медленная проверка
**Симптомы:** Долгая проверка (> 5 секунд)
**Причины:**
1. Медленная сеть
2. Перегруженные серверы
3. Таймауты
**Решение:**
1. Увеличить таймауты в `ServerHealthRepository`
2. Проверить производительность сети
3. Использовать более быстрые серверы
## 🔍 Теги логов для поиска
Фильтруйте логи по следующим тегам:
- `ServerPreferences` - операции с настройками
- `RetrofitProvider` - создание/обновление Retrofit
- `WellSheApplication` - инициализация приложения
- `ServerSettingsViewModel` - состояние диалога настроек
- `ServerHealthRepository` - проверка здоровья серверов
## 📱 Команды ADB для отладки
```bash
# Очистить данные приложения
adb shell pm clear kr.smartsoltech.wellshe
# Посмотреть логи health check'а
adb logcat | grep -E "(ServerHealth|HealthApi)"
# Посмотреть все настройки сервера
adb logcat | grep -E "(ServerPreferences|RetrofitProvider|ServerSettingsViewModel)"
# Экспорт логов в файл
adb logcat -d | grep -E "(ServerHealth|ServerPreferences)" > server_health_debug.log
```
## 🎯 Ожидаемый результат
После внедрения новой системы должно работать:
1. ✅ Автоматическая проверка здоровья серверов
2. ✅ Визуальные индикаторы состояния
3. ✅ Информация о времени отклика
4. ✅ Возможность выбора лучшего сервера
5. ✅ Настройки сохраняются корректно
6. ✅ После перезапуска загружается правильный URL
7. ✅ Retrofit создается с новым baseUrl
8. ✅ HTTP запросы идут на правильный сервер
9. ✅ Нет сброса настроек между сессиями
## 🌟 Дополнительные возможности
### Будущие улучшения:
1. **Периодическая проверка** - автоматическое обновление статуса каждые N минут
2. **Уведомления** - предупреждения о недоступности текущего сервера
3. **Автопереключение** - автоматический выбор лучшего доступного сервера
4. **История статусов** - отслеживание изменений состояния серверов
5. **Региональные серверы** - группировка серверов по географическому признаку
## 📞 Обратная связь
Если проблема сохраняется, предоставьте:
1. Полные логи с перечисленными тегами
2. Шаги воспроизведения
3. Версию Android и тип устройства (эмулятор/физическое)
4. Скриншоты диалога настроек с индикаторами статуса
```kotlin
// В WellSheApplication.onCreate():
- Логирование настроек при старте приложения
- Отслеживание ошибок инициализации
```
### 4. Улучшенные Toast сообщения
```kotlin
// Теперь показывает:
"✅ Сервер изменён!
Старый: http://192.168.0.112:8000
Новый: http://10.0.2.2:8000"
```
## 🕵️ Инструкции по диагностике
### Шаг 1: Установите обновленную версию
Соберите и установите приложение с новым логированием.
### Шаг 2: Запустите приложение
При запуске в логах должно появиться:
```
WellSheApplication: WellShe Application starting...
ServerPreferences: === Debug Server Settings ===
ServerPreferences: Current server URL: [текущий URL]
WellSheApplication: Application started successfully
```
### Шаг 3: Смените сервер
1. Нажмите ⚙️ на экране входа
2. Выберите новый сервер
3. Нажмите "Сохранить"
**Ожидаемые логи:**
```
ServerPreferences: Setting server URL: http://10.0.2.2:8000
ServerPreferences: Server URL saved successfully: http://10.0.2.2:8000
ServerPreferences: Verification - saved URL: http://10.0.2.2:8000
```
### Шаг 4: Проверьте запрос авторизации
Попробуйте войти в систему.
**Ожидаемые логи:**
```
RetrofitProvider: Getting Retrofit for serverUrl: http://10.0.2.2:8000/api/v1/
okhttp.OkHttpClient: --> POST http://10.0.2.2:8000/api/v1/auth/login
```
### Шаг 5: Перезапустите приложение
Закройте и снова откройте приложение.
**Критическая проверка:**
```
ServerPreferences: Getting server URL: http://10.0.2.2:8000
(НЕ http://192.168.0.112:8000!)
```
## 🚨 Возможные проблемы и решения
### Проблема 1: Настройки не сохраняются
**Симптомы:**
```
ServerPreferences: Setting server URL: http://10.0.2.2:8000
ServerPreferences: Failed to save server URL: http://10.0.2.2:8000
```
**Решение:** Проверить права доступа к SharedPreferences
### Проблема 2: Загружается старый URL
**Симптомы:**
```
ServerPreferences: Getting server URL: http://192.168.0.112:8000
ServerPreferences: Verification - saved URL: http://10.0.2.2:8000
```
**Решение:** Конфликт значений по умолчанию, нужно изменить DEFAULT_SERVER_URL
### Проблема 3: Retrofit не обновляется
**Симптомы:**
```
RetrofitProvider: Reusing existing Retrofit instance with baseUrl: http://192.168.0.112:8000
```
**Решение:** Не вызывается recreateRetrofit() после смены настроек
## 🔍 Теги логов для поиска
Фильтруйте логи по следующим тегам:
- `ServerPreferences` - операции с настройками
- `RetrofitProvider` - создание/обновление Retrofit
- `WellSheApplication` - инициализация приложения
- `ServerSettingsViewModel` - состояние диалога настроек
## 📱 Команды ADB для отладки
```bash
# Очистить данные приложения
adb shell pm clear kr.smartsoltech.wellshe
# Посмотреть логи в реальном времени
adb logcat | grep -E "(ServerPreferences|RetrofitProvider|WellSheApplication)"
# Экспорт логов в файл
adb logcat -d | grep -E "(ServerPreferences|RetrofitProvider)" > server_debug.log
```
## 🎯 Ожидаемый результат
После исправления должно работать:
1. ✅ Настройки сохраняются корректно
2. ✅ После перезапуска загружается правильный URL
3. ✅ Retrofit создается с новым baseUrl
4. ✅ HTTP запросы идут на правильный сервер
5. ✅ Нет сброса настроек между сессиями
## 📞 Обратная связь
Если проблема сохраняется, предоставьте:
1. Полные логи с перечисленными тегами
2. Шаги воспроизведения
3. Версию Android и тип устройства (эмулятор/физическое)