generated from Grigo/AndroidTemplate
closd TG-6; Initial push after server migration
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
# Пакетная отправка логов - Серверная часть
|
||||
|
||||
## Новый endpoint для пакетной отправки логов
|
||||
|
||||
### POST `/logs/batch`
|
||||
|
||||
Принимает JSON с массивом логов и сохраняет их в базу данных одним запросом.
|
||||
|
||||
#### Формат запроса:
|
||||
|
||||
```json
|
||||
{
|
||||
"logs": [
|
||||
{
|
||||
"type": "nmea",
|
||||
"message": "$GPGGA,123456.00,5542.1234,N,03741.5678,E,1,08,1.0,545.4,M,46.9,M,,*47",
|
||||
"color": "#8AB4F8",
|
||||
"timestamp": 1642248000000
|
||||
},
|
||||
{
|
||||
"type": "errors",
|
||||
"message": "[2024-01-15 12:00:00] AIS_PARSE_ERROR: Ошибка парсинга AIS: Неверная контрольная сумма",
|
||||
"color": "#FF8A80",
|
||||
"timestamp": 1642248001000
|
||||
},
|
||||
{
|
||||
"type": "ships",
|
||||
"message": "MMSI: 123456789 | Class A: lat=55.123456, lon=37.123456, course=45.0, speed=12.5",
|
||||
"color": "#FF5733",
|
||||
"timestamp": 1642248002000
|
||||
},
|
||||
{
|
||||
"type": "ble",
|
||||
"message": "BLE Data from AA:BB:CC:DD:EE:FF: $GPGGA,123456.00,5542.1234,N,03741.5678,E,1,08,1.0,545.4,M,46.9,M,,*47",
|
||||
"color": "#8AB4F8",
|
||||
"timestamp": 1642248003000
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### Реализация на Python (Flask):
|
||||
|
||||
```python
|
||||
@app.route("/logs/batch", methods=["POST"])
|
||||
def add_logs_batch():
|
||||
try:
|
||||
data = request.get_json()
|
||||
logs = data.get("logs", [])
|
||||
|
||||
if not logs:
|
||||
return "No logs provided", 400
|
||||
|
||||
# Подготавливаем данные для batch INSERT
|
||||
log_data = []
|
||||
for log in logs:
|
||||
log_data.append((
|
||||
log.get("type", "unknown"),
|
||||
log.get("message", ""),
|
||||
log.get("color", "#FFFFFF"),
|
||||
datetime.fromtimestamp(log.get("timestamp", 0) / 1000) if log.get("timestamp") else datetime.now()
|
||||
))
|
||||
|
||||
# Batch INSERT всех логов одним запросом
|
||||
with get_conn() as conn:
|
||||
with conn.cursor() as cur:
|
||||
cur.executemany(
|
||||
"INSERT INTO logs (log_type, message, color, ts) VALUES (%s, %s, %s, %s)",
|
||||
log_data
|
||||
)
|
||||
conn.commit()
|
||||
|
||||
return f"Added {len(logs)} logs successfully", 200
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error processing batch logs: {e}")
|
||||
return f"Error: {str(e)}", 500
|
||||
```
|
||||
|
||||
## Преимущества пакетной отправки:
|
||||
|
||||
✅ **Производительность**: 1 HTTP запрос вместо N запросов
|
||||
✅ **Надежность**: Retry на уровне пакета
|
||||
✅ **Контроль нагрузки**: Отправка раз в секунду
|
||||
✅ **Все логи сохраняются**: Ничего не теряется
|
||||
✅ **Меньше нагрузки на сервер**: Batch INSERT вместо множественных INSERT
|
||||
|
||||
## Типы логов:
|
||||
|
||||
- `nmea` - NMEA сообщения (синий цвет)
|
||||
- `errors` - Ошибки парсинга (красный цвет)
|
||||
- `ships` - Информация о кораблях (уникальный цвет по MMSI)
|
||||
- `ble` - BLE данные (синий цвет)
|
||||
|
||||
## Обработка ошибок:
|
||||
|
||||
- При ошибке HTTP запроса логи возвращаются в буфер
|
||||
- Retry происходит автоматически через секунду
|
||||
- Сервер возвращает HTTP 200 при успехе, 500 при ошибке
|
||||
Reference in New Issue
Block a user