src/Uniski/CMSBundle/Controller/HealthController.php line 97

Open in your IDE?
  1. <?php
  2. namespace Uniski\CMSBundle\Controller;
  3. use Symfony\Component\HttpFoundation\JsonResponse;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Uniski\ResourceBundle\Controller\BaseController;
  7. /**
  8.  * Controlador de healthcheck para monitoreo de la infraestructura.
  9.  *
  10.  * Verifica: conexión a BD, PHP-FPM, y espacio en disco.
  11.  * Usado por el healthcheck de Docker y monitoreo externo.
  12.  * Migrado a BaseController (AbstractController) para Symfony 4.4
  13.  */
  14. class HealthController extends BaseController
  15. {
  16.     /**
  17.      * Endpoint de healthcheck simple (para Docker healthcheck de Nginx).
  18.      * Devuelve "ok" si PHP-FPM responde.
  19.      *
  20.      * @Route("/health", name="health_check", methods={"GET"})
  21.      */
  22.     public function healthAction()
  23.     {
  24.         $checks = array();
  25.         $allOk true;
  26.         // 1. PHP-FPM está respondiendo (si llegamos aquí, funciona)
  27.         $checks['php_fpm'] = array(
  28.             'status' => 'ok',
  29.             'version' => PHP_VERSION,
  30.         );
  31.         // 2. Conexión a base de datos
  32.         try {
  33.             $em $this->get('doctrine.orm.entity_manager');
  34.             $conn $em->getConnection();
  35.             $conn->query('SELECT 1');
  36.             $checks['database'] = array(
  37.                 'status' => 'ok',
  38.                 'driver' => $conn->getDriver()->getName(),
  39.             );
  40.         } catch (\Exception $e) {
  41.             $checks['database'] = array(
  42.                 'status' => 'error',
  43.                 'message' => 'No se pudo conectar a la BD',
  44.             );
  45.             $allOk false;
  46.         }
  47.         // 3. Espacio en disco disponible
  48.         $diskFree disk_free_space('/var/www/uniski');
  49.         $diskTotal disk_total_space('/var/www/uniski');
  50.         $diskUsedPercent round((- ($diskFree $diskTotal)) * 1001);
  51.         $diskFreeGb round($diskFree 10737418242);
  52.         // Alerta si queda menos del 10% libre
  53.         $diskOk $diskUsedPercent 90;
  54.         $checks['disk'] = array(
  55.             'status' => $diskOk 'ok' 'warning',
  56.             'free_gb' => $diskFreeGb,
  57.             'used_percent' => $diskUsedPercent '%',
  58.         );
  59.         if (!$diskOk) {
  60.             $allOk false;
  61.         }
  62.         // 4. Directorio de cache escribible
  63.         $cacheDir $this->getParameter('kernel.cache_dir');
  64.         $cacheWritable is_writable($cacheDir);
  65.         $checks['cache'] = array(
  66.             'status' => $cacheWritable 'ok' 'error',
  67.         );
  68.         if (!$cacheWritable) {
  69.             $allOk false;
  70.         }
  71.         $response = array(
  72.             'status' => $allOk 'ok' 'degraded',
  73.             'timestamp' => date('c'),
  74.             'checks' => $checks,
  75.         );
  76.         $statusCode $allOk Response::HTTP_OK Response::HTTP_SERVICE_UNAVAILABLE;
  77.         return new JsonResponse($response$statusCode);
  78.     }
  79.     /**
  80.      * Endpoint mínimo para healthcheck rápido de Docker.
  81.      * Solo devuelve "ok" si PHP-FPM procesa la petición.
  82.      *
  83.      * @Route("/ping", name="health_ping", methods={"GET"})
  84.      */
  85.     public function pingAction()
  86.     {
  87.         return new Response('ok'Response::HTTP_OK, array(
  88.             'Content-Type' => 'text/plain',
  89.         ));
  90.     }
  91. }