profiler

  • Testing
  • monitoreo

  • conceptos
    • capturar eventos
    • Performance y load Testing
    • whitebox
    • blackbox
    • greybox
    • flujo de datos

🧩 Conceptos Fundamentales

Los profilers son herramientas y técnicas para analizar el rendimiento interno de un sistema o aplicación.
Permiten detectar cuellos de botella, fugas de memoria, latencia, y optimizar el consumo de recursos.
Su objetivo principal es entender cómo se comporta el código durante la ejecución, tanto en pruebas controladas como en producción.


🎯 Capturar eventos

Consiste en registrar la ejecución del programa en tiempo real para obtener métricas precisas de rendimiento.
Los profilers pueden medir tiempos, llamadas a funciones, consumo de CPU, memoria, I/O o acceso a base de datos.

Tipos principales de capturas:

  • Sampling profiler: realiza capturas periódicas del estado del programa. Ligero, pero menos preciso.
  • Tracing profiler: registra cada llamada y evento del sistema. Preciso, aunque más costoso en rendimiento.

Aplicaciones prácticas:

  • Identificar funciones que consumen más CPU.
  • Medir la latencia de llamadas a la base de datos.
  • Determinar la frecuencia de ejecución de un evento.

💻 Ejemplo (Node.js)

node --prof app.js
node --prof-process isolate-*.log > report.txt

`

Analiza el archivo report.txt para detectar funciones que más tiempo consumen.


⚙️ Performance y Load Testing

El Performance Testing mide la velocidad, estabilidad y capacidad de una aplicación bajo condiciones normales.
El Load Testing lleva al sistema a su límite para conocer su comportamiento bajo carga intensa o prolongada.

Métricas clave:

  • Latencia: tiempo medio de respuesta.
  • Throughput: número de peticiones procesadas por segundo.
  • Errores: porcentaje de fallos o timeouts.
  • Uso de recursos: CPU, memoria, red, disco.

Herramientas comunes: k6, JMeter, Gatling, Locust.

💻 Ejemplo (k6)

import http from 'k6/http';
import { check, sleep } from 'k6';

export let options = {
	stages: [
		{ duration: '30s', target: 50 },
		{ duration: '1m', target: 100 },
		{ duration: '20s', target: 0 },
	],
};

export default function () {
	const res = http.get('https://api.example.com');
	check(res, { 'status 200': (r) => r.status === 200 });
	sleep(1);
}

🧠 Whitebox Testing

En este enfoque, el tester conoce la estructura interna del sistema.
Permite analizar rutas de código, condiciones, ciclos y dependencias.
Es ideal para optimizar funciones críticas o mejorar la cobertura de pruebas.

Ventajas:

  • Detecta errores lógicos y de rendimiento.
  • Permite identificar funciones mal optimizadas.
  • Facilita la mejora continua del código.

Técnicas usadas:

  • Cobertura de sentencias o ramas.
  • Instrumentación del código.
  • Integración con profilers internos (como cProfile en Python o Perf en Linux).

💻 Ejemplo (Python + pytest)

pytest --durations=10

Muestra los 10 tests más lentos, permitiendo detectar cuellos de rendimiento.


🎩 Blackbox Testing

En este enfoque, el tester no tiene acceso al código fuente.
Solo se evalúan entradas y salidas, centrándose en el comportamiento funcional.
Es muy usado en E2E - End to End Testing y integration test.

Ventajas:

  • Simula el uso real del usuario.
  • Ideal para validar APIs, microservicios y frontends.
  • No requiere conocimiento técnico del sistema interno.

Desventajas:

  • No muestra el origen exacto del problema.
  • Puede omitir fallos internos de bajo nivel.

💻 Ejemplo (REST Assured)

given()
  .contentType("application/json")
  .body("{\"email\": \"user@test.com\", \"password\": \"1234\"}")
.when()
  .post("/login")
.then()
  .statusCode(200)
  .body("token", notNullValue());

⚖️ Greybox Testing

El enfoque greybox combina lo mejor de los dos anteriores.
El tester conoce parcialmente la arquitectura o ciertos módulos del sistema.
Se aplica en entornos donde se necesita una visión parcial interna, por ejemplo, APIs privadas, microservicios o middleware.

Ventajas:

  • Permite validar la lógica y las dependencias.
  • Identifica vulnerabilidades o ineficiencias internas.
  • Se usa mucho en auditorías de rendimiento y seguridad.

💻 Ejemplo (API con token simulado)

import request from 'supertest';
import app from '../app';

const TOKEN = process.env.MOCK_TOKEN;

describe('Greybox API test', () => {
	it('should validate token and return user data', async () => {
		const res = await request(app)
			.get('/user')
			.set('Authorization', `Bearer ${TOKEN}`);
		expect(res.statusCode).toBe(200);
	});
});

🔄 Flujo de datos

El análisis de flujo de datos permite observar cómo la información se mueve a través del sistema:
desde la entrada del usuario hasta la base de datos, memoria o red.

Objetivos:

  • Detectar puntos de bloqueo, duplicación o pérdida de datos.
  • Analizar tiempos de transferencia y dependencia entre módulos.
  • Validar consistencia e integridad de datos.

Usos típicos:

  • Aplicaciones distribuidas o de microservicios.
  • Pipelines de datos o ETL.
  • API y sistemas event-driven.

💻 Ejemplo (Python + cProfile)

import cProfile
import pstats

def process_data():
	data = [x**2 for x in range(100000)]
	return sum(data)

with cProfile.Profile() as pr:
	process_data()

stats = pstats.Stats(pr)
stats.sort_stats(pstats.SortKey.TIME).print_stats(10)

🧭 Resumen general

Los profilers y técnicas asociadas permiten:

  • Entender el rendimiento real del sistema.
  • Optimizar funciones críticas y consumo de recursos.
  • Evaluar estabilidad bajo carga o estrés.
  • Mejorar la calidad de software mediante pruebas mixtas (whitebox, blackbox, greybox).
  • Integrar métricas y monitoreo con monitoreo continuo o pipelines CI/CD. En conjunto, son esenciales para asegurar un software rápido, estable y mantenible, especialmente en entornos productivos.