- go1.23 v0.1.2: defer recover() в HTTP handler — panic no longer closes connection → HTTP 500 - python3.11 v0.1.5: try/except в do_GET/_handle_with_body/do_HEAD → 500 вместо EOF - python3.11 v0.1.5: ThreadingHTTPServer — concurrent requests (был single-thread) - python3.11 v0.1.6: _HighBacklogHTTPServer(request_queue_size=128) — listen(128) вместо listen(5) - context.go: go1.23 v0.1.1→v0.1.2, python3.11 v0.1.4→v0.1.6 - operator: v0.1.45 → v0.1.47 (два деплоя подряд с новыми runtime-версиями) - examples/POSTGRES: stress.tf (10 сервисов), full_test.sh (48 тестов, 4 фазы) - examples/POSTGRES: README.md, очистка от старых файлов (luceUNDnode.tf, funcs_list.py) Результат: full_test.sh 48/48 PASS - Фаза 3 PG-стресс: 40/40 parallel writer OK, 30/30 js-async OK, pgstorm 14k ops 0 err - Фаза 4 краш-шторм: 75/75 × HTTP 500 (паники не роняют платформу)
168 lines
5.8 KiB
Terraform
168 lines
5.8 KiB
Terraform
// 2026-03-21 — stress.tf: все стресс-сервисы для комплексного тестирования.
|
||
// Три рантайма: go1.23 (3), nodejs20 (2), python3.11 (5).
|
||
// Все depends_on = [sless_job.postgres_table_init_job] — таблица должна существовать.
|
||
|
||
# ── Go 1.23 ─────────────────────────────────────────────────────────────────
|
||
|
||
# Быстрая математика: факториал + числа Фибоначчи. Без PG. Проверяет Go runtime.
|
||
resource "sless_service" "stress_go_fast" {
|
||
name = "stress-go-fast"
|
||
runtime = "go1.23"
|
||
entrypoint = "handler.Handle"
|
||
memory_mb = 128
|
||
timeout_sec = 15
|
||
source_dir = "${path.module}/code/stress-go-fast"
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Намеренный nil pointer dereference. Без PG. Проверяет recover() в Go runtime.
|
||
resource "sless_service" "stress_go_nil" {
|
||
name = "stress-go-nil"
|
||
runtime = "go1.23"
|
||
entrypoint = "handler.Handle"
|
||
memory_mb = 128
|
||
timeout_sec = 10
|
||
source_dir = "${path.module}/code/stress-go-nil"
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Конкурентный PG-шторм через pgxpool: N горутин INSERT/COUNT/MAX.
|
||
# timeout_sec=660 — покрывает max duration_sec=600 с запасом.
|
||
# pgx/v5 уже в базовом образе go1.23: user go.mod не нужен.
|
||
resource "sless_service" "stress_go_pgstorm" {
|
||
name = "stress-go-pgstorm"
|
||
runtime = "go1.23"
|
||
entrypoint = "handler.Handle"
|
||
memory_mb = 256
|
||
timeout_sec = 660
|
||
source_dir = "${path.module}/code/stress-go-pgstorm"
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# ── Node.js 20 ────────────────────────────────────────────────────────────────
|
||
|
||
# 3 параллельных PG-запроса через Promise.all. Проверяет async/await + nodejs20.
|
||
resource "sless_service" "stress_js_async" {
|
||
name = "stress-js-async"
|
||
runtime = "nodejs20"
|
||
entrypoint = "stress_js_async.run"
|
||
memory_mb = 128
|
||
timeout_sec = 20
|
||
source_dir = "${path.module}/code/stress-js-async"
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# TypeError через undefined.toUpperCase(). Без PG. Проверяет перехват JS-ошибок.
|
||
resource "sless_service" "stress_js_badenv" {
|
||
name = "stress-js-badenv"
|
||
runtime = "nodejs20"
|
||
entrypoint = "stress_js_badenv.run"
|
||
memory_mb = 128
|
||
timeout_sec = 10
|
||
source_dir = "${path.module}/code/stress-js-badenv"
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# ── Python 3.11 ───────────────────────────────────────────────────────────────
|
||
|
||
# Спит N секунд. Без PG. Проверяет timeout и сосуществование долгих запросов.
|
||
resource "sless_service" "stress_slow" {
|
||
name = "stress-slow"
|
||
runtime = "python3.11"
|
||
entrypoint = "stress_slow.run"
|
||
memory_mb = 128
|
||
timeout_sec = 35
|
||
source_dir = "${path.module}/code/stress-slow"
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# CPU-нагрузка: сумма квадратов N чисел. Без PG. Проверяет compute-bound задачи.
|
||
resource "sless_service" "stress_bigloop" {
|
||
name = "stress-bigloop"
|
||
runtime = "python3.11"
|
||
entrypoint = "stress_bigloop.run"
|
||
memory_mb = 256
|
||
timeout_sec = 60
|
||
source_dir = "${path.module}/code/stress-bigloop"
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# ZeroDivisionError. Без PG. Проверяет перехват Python-исключений → HTTP 500.
|
||
resource "sless_service" "stress_divzero" {
|
||
name = "stress-divzero"
|
||
runtime = "python3.11"
|
||
entrypoint = "stress_divzero.run"
|
||
memory_mb = 128
|
||
timeout_sec = 10
|
||
source_dir = "${path.module}/code/stress-divzero"
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Параллельный INSERT в terraform_demo_table через psycopg2. Проверяет PG-write.
|
||
resource "sless_service" "stress_writer" {
|
||
name = "stress-writer"
|
||
runtime = "python3.11"
|
||
entrypoint = "stress_writer.run"
|
||
memory_mb = 128
|
||
timeout_sec = 60
|
||
source_dir = "${path.module}/code/stress-writer"
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|
||
|
||
# Агрегированная статистика terraform_demo_table (COUNT/MIN/MAX). Для мониторинга.
|
||
resource "sless_service" "pg_stats" {
|
||
name = "pg-stats"
|
||
runtime = "python3.11"
|
||
entrypoint = "pg_stats.get_stats"
|
||
memory_mb = 128
|
||
timeout_sec = 15
|
||
source_dir = "${path.module}/code/pg-stats"
|
||
|
||
env_vars = {
|
||
PGHOST = local.pg_host
|
||
PGPORT = "5432"
|
||
PGDATABASE = local.pg_database
|
||
PGUSER = local.pg_username
|
||
PGPASSWORD = local.pg_password
|
||
PGSSLMODE = "require"
|
||
}
|
||
|
||
depends_on = [sless_job.postgres_table_init_job]
|
||
}
|