From f6b50baa5080c6f0426a06f8e920a4508b2d8325 Mon Sep 17 00:00:00 2001 From: nns Date: Tue, 9 Jun 2026 03:47:03 +0500 Subject: [PATCH] =?UTF-8?q?docs(s28):=20=D1=81=D0=B2=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=B0=20interim=20soak=20(31min,=2091k=20iter,=200=20fail)=20+?= =?UTF-8?q?=20overnight=20work?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/sprint28-progress.md | 67 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/docs/sprint28-progress.md b/docs/sprint28-progress.md index 1a1a634..0dc762b 100644 --- a/docs/sprint28-progress.md +++ b/docs/sprint28-progress.md @@ -81,12 +81,71 @@ cross-feature suite" после regression flows+visual. На failure артеф ETA финиша: ~07:15. Финальные числа добавлю в этот файл после завершения. -## Soak: интерим-результаты +## Soak: интерим-результаты (на момент 03:46, 31 мин run) -В 03:24 (9 минут run): 28005 iterations, 0 interrupted, p95 латентность -ровная, RPS ровно 50. +| Метрика | Значение | Замечание | +|---|---|---| +| iterations | 91371 | 0 interrupted | +| iter/sec | 49.2 | target 50 (constant-arrival-rate) | +| api_mem_mb (range) | 250-465 | spike 465 — это redeploy для HSTS, нормальное | +| api_cpu_pct (steady) | 54-83% | под нагрузкой | +| pg_connections | 19-56 | spike 56 во время restart, обратно к 19 | +| disk_free_gb | 30 | без изменений | +| products p95 | 32-256ms | 256ms был во время старта (warmup) | - +Зафиксированы 0 failures (`http_req_failed.rate=0.0`). Memory не растёт +линейно — bounces around 250-300 MiB после warmup. + +Soak продолжается до ~07:15. Финальные числа в этом разделе после +завершения. + +## Дополнительная работа (overnight) + +После основных 6 пунктов чек-листа также сделано: + +### 7. fix: ApiReferenceDocsJob handle `~/path` ASP.NET convention + +`HttpPost("~/connect/token")` — ASP.NET Core конвенция «absolute from +root, ignore class [Route]». До фикса генератор клеил с base-route'ом → +`/~/connect/token` (невалидный). Теперь tilde корректно срезается. + +Виден `/connect/token` в api-reference.md. + +### 8. fix(security): HSTS header on stage + +Найдено: stage отдавал security-headers (CSP, X-Frame-Options, etc.) но +БЕЗ Strict-Transport-Security. Причина: `UseHsts()` в ASP.NET Core не +срабатывает за nginx-прокси (api видит HTTP, не HTTPS — нет +ForwardedHeaders middleware'a). + +Фикс: добавлен `add_header Strict-Transport-Security` в +`deploy/nginx.conf`. max-age=2592000 (30 дней), без includeSubDomains +и без preload — pre-emptive consent, можно безопасно убрать. + +Verified: `curl -I https://test.admin.food-market.kz/` → `strict-transport-security: max-age=2592000`. + +Integration test `tests/integration/08-security-headers.spec.ts` (2 +[Fact]) проверяет 7 security-заголовков на главной + на 404. + +### 9. test: ApiReferenceDocsJob regex lock-down + +`tests/food-market.UnitTests/ApiReferenceDocsJobTests.cs` — создаёт +временный controller-файл с double-nested generic +(`Task>>`), прогоняет GenerateAsync, +проверяет count=3 и наличие всех routes в output. + +Защищает от регрессии Sprint 28 fix'a. + +### 10. perf: integration suite workers=2 (46% speedup) + +Раньше `tests/integration/playwright.config.ts` имел `workers: 1` +из-за signup rate-limit. После Sprint 26 повышения stage до +5000/min — больше не упирается. Включил `workers: 2` → прогон 66s → 36s. + +### 11. README + ONBOARDING update до Sprint 28 + +Sprint history дополнен 25-28. Endpoint count обновлён до 240. Sprint +counter unified. ## Метрики