LoadTest v2: добавлена проверка приёма СООБЩЕНИЙ (/messages, случайное содержимое заданного размера)
This commit is contained in:
+48
@@ -86,6 +86,54 @@ def upload():
|
||||
return jsonify(result)
|
||||
|
||||
|
||||
@app.route("/messages", methods=["POST"])
|
||||
def messages():
|
||||
"""Приём СООБЩЕНИЯ в память (для проверки очередей/ИоТ).
|
||||
|
||||
От клиента приходит сырое тело запроса (raw body) нужного размера.
|
||||
Задача - проверить, ДОХОДИТ ли сообщение нужного размера до бэкенда
|
||||
(в отличие от /upload здесь нет multipart - только тело, как в очередях).
|
||||
"""
|
||||
t0 = time.time()
|
||||
|
||||
meta = {
|
||||
"server_start": time.strftime("%Y-%m-%d %H:%M:%S"),
|
||||
"remote_addr": request.remote_addr or "",
|
||||
# Заголовки, которые обычно шлёт очередь/ИоТ-клиент.
|
||||
"content_length_header": request.headers.get("Content-Length", ""),
|
||||
"content_type_header": request.headers.get("Content-Type", ""),
|
||||
"user_agent": request.headers.get("User-Agent", ""),
|
||||
"x_amz_sns_message_type": request.headers.get("X-Amz-Sns-Message-Type", ""),
|
||||
"ce_specversion": request.headers.get("Ce-Specversion", ""),
|
||||
}
|
||||
|
||||
# Читаем ВСЁ сырое тело сообщения в память и замеряем время.
|
||||
t_read = time.time()
|
||||
data = request.get_data() # сырое тело без разбора (как в SQS/IoT)
|
||||
read_s = time.time() - t_read
|
||||
|
||||
size = len(data) # сколько байт РЕАЛЬНО дошло до бэкенда
|
||||
total_s = time.time() - t0
|
||||
|
||||
result = {
|
||||
"ok": True,
|
||||
"message": {
|
||||
"size_bytes": size,
|
||||
"size_kb": round(size / 1024, 3),
|
||||
"size_mb": round(size / (1024 * 1024), 3),
|
||||
"prefix": data[:64].decode("utf-8", "replace"), # первые 64 байта для наглядности
|
||||
},
|
||||
"server": {
|
||||
"read_ms": round(read_s * 1000, 2),
|
||||
"total_ms": round(total_s * 1000, 2),
|
||||
"speed_mb_s": round(size / (1024 * 1024) / read_s, 3) if read_s > 0 else 0,
|
||||
},
|
||||
"md5": hashlib.md5(data).hexdigest(), # контрольная сумма принятых байт
|
||||
"meta": meta,
|
||||
}
|
||||
return jsonify(result)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# ОБЯЗАТЕЛЬНО для платформы: `python site/app.py` должен стартовать сервер.
|
||||
# debug=False - прод-режим, без reloader (иначе поднимается второй процесс).
|
||||
|
||||
Reference in New Issue
Block a user