feat: Add comprehensive testing plan for IPSExtractor, including unit, integration, E2E, stress, and resilience tests. Introduce LaTeX documentation structure with sections for architecture, test strategy, and execution guidelines. Enhance README with setup instructions and k6 stress testing scripts.
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
\chapter{Pruebas de estr\'es y carga}
|
||||
\label{ch:estres}
|
||||
|
||||
\section{Herramienta}
|
||||
Se usa \textbf{k6} (Grafana Labs) contra \texttt{http://127.0.0.1:8189}. Scripts de referencia en \texttt{docs/plan\_pruebas/scripts/}. M\'etricas complementarias: \texttt{docker stats}, \texttt{pg\_stat\_activity}, Redis INFO, logs del gateway.
|
||||
|
||||
\section{Perfiles de carga}
|
||||
Por defecto, en el host de la secci\'on~\ref{sec:host-pruebas}, aplicar el perfil \textbf{host-compartido-8gb}. El perfil \textbf{laboratorio} solo aplica si el Docker Engine est\'a dedicado a IPS (sin MLflow/Airflow/n8n, $\geq$3\,GiB libres).
|
||||
|
||||
\begin{table}[ht]
|
||||
\centering
|
||||
\begin{tabular}{@{}p{2.3cm}p{5.5cm}p{5.0cm}@{}}
|
||||
\toprule
|
||||
\textbf{ID} & \textbf{host-compartido-8gb} & \textbf{laboratorio} \\
|
||||
\midrule
|
||||
ST-GW-01 & 5$\rightarrow$15$\rightarrow$25 VUs; p95 $<$500\,ms & 50--100 VUs; p95 $<$300\,ms \\
|
||||
ST-BOT-01 & 3--8 workers / 8\,s & 20--50 workers / 8\,s \\
|
||||
ST-BOT-03 & 5--15 VUs events & hasta 40 VUs / 5k events \\
|
||||
ST-COUNT-01 & 1 rps, max 3--5 VUs; evitar si RAM libre $<$3\,GiB & 5--20 lotes $\times$10 \\
|
||||
ST-EXT-01 & 20--50 tasks; 1 r\'eplica worker & 100--500 tasks; 2 r\'eplicas \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\caption{Cargas por perfil de entorno.}
|
||||
\label{tab:perfiles-carga}
|
||||
\end{table}
|
||||
|
||||
Con el zoo Docker actual (MLflow $\sim$1{,}86\,GiB + Airflow + n8n, etc.) \textbf{no} ejecutar ST-COUNT-01 ni ST-EXT agresivo sin liberar memoria primero.
|
||||
|
||||
\section{Escenarios (cat\'alogo completo)}
|
||||
\begin{longtable}{@{}p{2.4cm}p{3.2cm}p{3.5cm}p{3.2cm}@{}}
|
||||
\caption{Escenarios de estr\'es.}\\
|
||||
\toprule
|
||||
\textbf{ID} & \textbf{Objetivo} & \textbf{Carga (laboratorio)} & \textbf{Observar} \\
|
||||
\midrule
|
||||
\endhead
|
||||
ST-GW-01 & Gateway concurrente & 50--100 VUs \texttt{/health/live} & p95, 5xx \\
|
||||
ST-BOT-01 & Heartbeats masivos & 20--50 workers / 8\,s & PG, offline falsos \\
|
||||
ST-BOT-02 & Claim contention & 10 workers, cola jobs & Un claim/job \\
|
||||
ST-BOT-03 & Event storm & Hasta 5k events/job & Escritura PG \\
|
||||
ST-BOT-04 & Excel grande & 10--50\,MB upload & Timeout 600\,s \\
|
||||
ST-MINIO-01 & PutObject paralelo & N PCs & Errores S3 \\
|
||||
ST-COUNT-01 & OCR paralelo & 5--20 lotes $\times$10 & RAM, OOM \\
|
||||
ST-EXT-01 & Cola ARQ & 100--500 tasks (LLM mock) & Backlog \\
|
||||
ST-EXT-02 & LLM real & 20--50 PDFs & 429, costos \\
|
||||
ST-DES-01 & Polling desktop & 10 clientes poll & CPU gateway \\
|
||||
ST-DB-01 & PG saturaci\'on & Mezcla ST-BOT+EXT & Locks \\
|
||||
\bottomrule
|
||||
\end{longtable}
|
||||
|
||||
\section{Scripts k6 incluidos}
|
||||
\begin{table}[h]
|
||||
\centering
|
||||
\begin{tabular}{@{}llp{4.8cm}@{}}
|
||||
\toprule
|
||||
\textbf{Archivo} & \textbf{ID} & \textbf{Target} \\
|
||||
\midrule
|
||||
\texttt{k6\_gateway\_health.js} & ST-GW-01 & \texttt{GET /health/live} \\
|
||||
\texttt{k6\_bot\_heartbeats.js} & ST-BOT-01 & \texttt{POST .../workers/heartbeat} \\
|
||||
\texttt{k6\_bot\_events.js} & ST-BOT-03 & \texttt{POST .../jobs/\{id\}/events} \\
|
||||
\texttt{k6\_count\_batches.js} & ST-COUNT-01 & \texttt{POST /count/v1/count} \\
|
||||
\bottomrule
|
||||
\end{tabular}
|
||||
\caption{Mapeo script $\leftrightarrow$ escenario.}
|
||||
\end{table}
|
||||
|
||||
Los scripts aceptan \texttt{PROFILE=shared8g} (default recomendado en este host) o \texttt{PROFILE=lab}.
|
||||
|
||||
\section{SLOs de aceptaci\'on}
|
||||
\subsection{Perfil host-compartido-8gb (default)}
|
||||
\begin{itemize}
|
||||
\item Gateway \texttt{/health/live} p95 $<$\,\SI{500}{\milli\second}; error rate $<$\,1\,\%.
|
||||
\item No usar el health \emph{agregado} (\texttt{/health}) como SLO de latencia (puede superar 10\,s en este host).
|
||||
\item Heartbeat: 0 workers offline falsos con $\leq$8 workers y poll $\leq$8\,s.
|
||||
\item Claim: 0 jobs con dos workers en \texttt{RUNNING}.
|
||||
\item Count-api: sin OOM; detener la prueba si el host entra en swap sostenido.
|
||||
\end{itemize}
|
||||
|
||||
\subsection{Perfil laboratorio}
|
||||
\begin{itemize}
|
||||
\item Gateway p95 salud: $<$\,\SI{300}{\milli\second}; error rate $<$\,0,1\,\%.
|
||||
\item Extracci\'on (LLM mock): backlog ARQ drenado con \texttt{WORKER\_REPLICAS=2}.
|
||||
\item Count-api: sin OOM en carga acordada; PDFs oversized $\rightarrow$ 4xx.
|
||||
\end{itemize}
|
||||
|
||||
\section{Ejecuci\'on ejemplo}
|
||||
\begin{lstlisting}[language=bash,caption={Estr\'es gateway en host compartido}]
|
||||
cd docs/plan_pruebas/scripts
|
||||
# Documentar entorno: free -h && docker stats --no-stream
|
||||
k6 run -e BASE_URL=http://127.0.0.1:8189 -e PROFILE=shared8g k6_gateway_health.js
|
||||
\end{lstlisting}
|
||||
Reference in New Issue
Block a user