Implementando telemetría de rendimiento en Breniapp
En el proyecto Breniapp, recientemente hemos trabajado en la implementación de un sistema de telemetría para medir con precisión el rendimiento de nuestras generaciones de contenido. El objetivo principal es persistir métricas detalladas para cada ejecución, permitiéndonos realizar análisis de rendimiento históricos mediante consultas SQL avanzadas en nuestra base de datos PostgreSQL.
Arquitectura de registro
Hemos introducido una tabla global llamada content_generation_metrics que captura información exhaustiva, incluyendo el tiempo total por generación y un desglose por fases (imagen, texto y video). Este enfoque nos permite identificar cuellos de botella sin importar el inquilino (tenant) o el tipo de contenido.
Para asegurar que la estabilidad del sistema no se vea afectada por el proceso de registro, hemos implementado el patrón de diseño Recorder con una estrategia de 'mejor esfuerzo' (best-effort), la cual silencia cualquier excepción durante la escritura de la métrica.
Ejemplo de implementación
A continuación, un ejemplo conceptual de cómo capturamos estos tiempos dentro de nuestro servicio de generación:
public function recordMetrics(GenerationResult $result): void
{
try {
$this->recorder->save([
'tenant_id' => $result->tenantId,
'total_ms' => $result->getTotalDuration(),
'image_ms' => $result->imageDuration,
'copy_ms' => $result->textDuration,
'status' => $result->isSuccess() ? 'success' : 'failed',
]);
} catch (Throwable $e) {
// Silenciamos errores para no interrumpir el flujo principal
Log::error('Fallo al registrar métricas de generación', ['error' => $e->getMessage()]);
}
}
Análisis de datos
La estructura de la tabla está optimizada para realizar análisis estadísticos, como el cálculo de percentiles (p50, p90), lo cual es fundamental para entender la experiencia del usuario bajo diferentes cargas de trabajo. Con esta implementación, el equipo puede ahora ejecutar consultas como esta:
SELECT content_type,
percentile_cont(0.5) WITHIN GROUP (ORDER BY total_ms) AS p50_ms
FROM content_generation_metrics
WHERE status = 'success'
GROUP BY content_type;
Este desarrollo mejora significativamente nuestra observabilidad y sienta las bases para futuras optimizaciones orientadas a mejorar los tiempos de respuesta en todo el ecosistema de Breniapp.