diff --git a/src/handlers/handler_register.erl b/src/handlers/handler_register.erl index a5c0cc3..63481d7 100644 --- a/src/handlers/handler_register.erl +++ b/src/handlers/handler_register.erl @@ -78,14 +78,23 @@ register(Req) -> % Создаём верификационный токен и отправляем письмо {ok, VerificationToken, _Expires} = core_verification:create_token(User#user.id), logic_email:send_verification_email(Email, VerificationToken), - Response = #{ - user => #{ - id => User#user.id, - email => User#user.email, - role => atom_to_binary(User#user.role, utf8), - status => atom_to_binary(User#user.status, utf8) % <<"pending">> - } + BaseUser = #{ + id => User#user.id, + email => User#user.email, + role => atom_to_binary(User#user.role, utf8), + status => atom_to_binary(User#user.status, utf8) % <<"pending">> }, + %% На стендах (не prod) отдаём verification_token для loadtest/E2E + %% без доступа к почте (IFT EVENTHUB_ENV=stage). + Response = case os:getenv("EVENTHUB_ENV") of + "prod" -> + #{user => BaseUser}; + _ -> + #{ + user => BaseUser, + verification_token => VerificationToken + } + end, handler_utils:send_json(Req1, 201, Response); {error, email_exists} -> handler_utils:send_error(Req1, 409, <<"Email already exists">>); diff --git a/test/tsung/README.md b/test/tsung/README.md new file mode 100644 index 0000000..2c9447a --- /dev/null +++ b/test/tsung/README.md @@ -0,0 +1,61 @@ +# Tsung — нагрузка EventHub + +## Профили + +| Файл | Назначение | +|------|------------| +| `eventhub_ift_smoke.xml` | Короткий smoke на IFT после prepare | +| `eventhub_ift.xml` | Mix: `auth_browse` 60% + `create_flow` 40%, фазы warmup/ramp/peak | +| `eventhub_tsung.xml` | Legacy localhost (thinktime там в секундах — не использовать для IFT) | +| `eventhub_http.xml` | Legacy короткий localhost | + +Цель IFT: **HTTPS** `api.ift.eventhub.local:443` (Traefik). + +Auth path: `POST /v1/register` → `POST /v1/verify` → `POST /v1/login`. +На стендах (`EVENTHUB_ENV` ≠ `prod`) register отдаёт `verification_token` (без почты). + +## Перед прогоном (хост IFT) + +```bash +# 1 нода (default) +EVENTHUB_REPLICAS=1 bash /opt/eventhub-ift/devops/scripts/ift-loadtest-prepare.sh + +# или N нод +EVENTHUB_REPLICAS=2 bash /opt/eventhub-ift/devops/scripts/ift-loadtest-prepare.sh +``` + +Оставляет `traefik` + `eventhub×N`, гасит admin-ui / bot / observability / fallback. + +## Дех-машина (WSL) + +1. DNS: `api.ift.eventhub.local` → IP IFT (тот же, что в OpenWRT). +2. Установка: `sudo apt install tsung` (или [документация Tsung](http://tsung.erlang-projects.org/)). +3. TLS: самоподписанный сертификат стенда — импортировать CA из `EventHubDevOps/ift/traefik/certs` в trust store WSL, либо временно положить CA в `/usr/local/share/ca-certificates/` и `update-ca-certificates`. Проверка: `curl -sf https://api.ift.eventhub.local/health`. +4. Запуск из корня `EventHubBack`: + +```bash +# smoke (~1 мин) +tsung -f test/tsung/eventhub_ift_smoke.xml start + +# полный прогон (~6 мин фаз) +tsung -f test/tsung/eventhub_ift.xml start +``` + +Отчёт: `~/.tsung/log//` → `tsung_stats.pl` / HTML. + +## После прогона + +```bash +bash /opt/eventhub-ift/devops/scripts/ift-loadtest-restore.sh +``` + +## Настройка интенсивности + +В `eventhub_ift.xml` блок ``: `interarrival` (сек между стартами пользователей) и `duration` фаз. +`thinktime` — **секунды** (не мс). + +## Что сознательно убрано из hot path + +- dummy `/v1/refresh` +- reports / tickets (шум модерации) +- завышенные thinktime (старый `eventhub_tsung.xml`) diff --git a/test/tsung/eventhub_ift.xml b/test/tsung/eventhub_ift.xml new file mode 100644 index 0000000..68cc581 --- /dev/null +++ b/test/tsung/eventhub_ift.xml @@ -0,0 +1,173 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HTTP/1.[0-1] 20 + + + + + + HTTP/1.[0-1] 20 + + + + + + + HTTP/1.[0-1] 20 + + + + + + HTTP/1.[0-1] 20 + + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + + + + + + + + + + + + + HTTP/1.[0-1] 20 + + + + + + HTTP/1.[0-1] 20 + + + + + + + HTTP/1.[0-1] 20 + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + HTTP/1.[0-1] 20 + + + + + + + diff --git a/test/tsung/eventhub_ift_smoke.xml b/test/tsung/eventhub_ift_smoke.xml new file mode 100644 index 0000000..8a17e14 --- /dev/null +++ b/test/tsung/eventhub_ift_smoke.xml @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + HTTP/1.[0-1] 20 + + + + + + HTTP/1.[0-1] 20 + + + + + + + HTTP/1.[0-1] 20 + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + + HTTP/1.[0-1] 20 + + + + + + + + HTTP/1.[0-1] 20 + + + + + + +