- stress.tf: 10 новых sless_service (Go: fast/nil/pgstorm, Node: async/badenv, Python: slow/bigloop/divzero/writer/pg-stats) - full_test.sh: 4 фазы — CRUD / функциональные / PG-стресс / краш-шторм (48 тестов) - stress-go-fast/handler.go: удалён дублирующий заголовок package (баг сборки) Результат: 48/48 PASS - 40× parallel writer 40/40 OK (ThreadingHTTPServer + backlog=128) - 75× краш-шторм → 75× HTTP 500 (паники не роняют платформу)
168 lines
5.8 KiB
HCL
168 lines
5.8 KiB
HCL
// 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]
|
||
}
|