> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Laravel Pulse

> Explicamos la instalación y configuración del dashboard de monitorización con Laravel Pulse. Cubrimos ampliamente recorders, muestreo y creación de cards personalizadas.

## ¿Qué es Laravel Pulse?

[Laravel Pulse](https://github.com/laravel/pulse) es un dashboard de monitorización que muestra de un vistazo el rendimiento y el uso de la aplicación.
Permite localizar cuellos de botella (jobs y endpoints lentos) o consultar quiénes son los usuarios más activos.

### Diferencia entre Telescope y Pulse

| Característica | Laravel Pulse                                      | Laravel Telescope                                   |
| -------------- | -------------------------------------------------- | --------------------------------------------------- |
| Objetivo       | Monitorizar tendencias y datos agregados de la app | Depurar solicitudes/eventos individuales en detalle |
| Datos          | Métricas agregadas                                 | Logs de eventos individuales                        |
| Uso adecuado   | Monitorización de rendimiento en producción        | Depuración en desarrollo/staging                    |

<Info>
  Para depuración detallada de eventos individuales, usa [Laravel Telescope](/es/blog/telescope-introduction).
</Info>

### Diagrama del flujo de datos

```mermaid theme={null}
flowchart LR
    A["Aplicación Laravel"] -->|Detección de eventos| B["Recorders"]
    B -->|Registro de entradas| C["Base de datos<br>(tablas de Pulse)"]
    C -->|Agregación/visualización| D["Dashboard<br>/pulse"]
    E["Daemon<br>pulse:check"] -->|Info del servidor| C
```

***

## Instalación

<Warning>
  La implementación de almacenamiento oficial de Pulse requiere MySQL, MariaDB o PostgreSQL. Si usas otro motor, prepara una BD MySQL, MariaDB o PostgreSQL dedicada para los datos de Pulse.
</Warning>

<Steps>
  <Step title="Instalación del paquete">
    Instala Pulse con Composer.

    ```shell theme={null}
    composer require laravel/pulse
    ```
  </Step>

  <Step title="Publicar configuración y migraciones">
    Publica los archivos con Artisan.

    ```shell theme={null}
    php artisan vendor:publish --provider="Laravel\Pulse\PulseServiceProvider"
    ```
  </Step>

  <Step title="Ejecutar migraciones">
    Crea las tablas para los datos de Pulse.

    ```shell theme={null}
    php artisan migrate
    ```
  </Step>
</Steps>

Tras la migración, accede al dashboard en la ruta `/pulse`.

### Publicar el archivo de configuración

También puedes publicar solo el archivo de configuración para personalizarlo.

```shell theme={null}
php artisan vendor:publish --tag=pulse-config
```

***

## Acceso al dashboard

### Configuración de autenticación

Por defecto, solo se accede al dashboard en el entorno `local`.
En producción, personaliza la puerta de autorización `viewPulse` para controlar el acceso.

```php theme={null}
use App\Models\User;
use Illuminate\Support\Facades\Gate;

/**
 * Arranca los servicios de la aplicación.
 */
public function boot(): void
{
    Gate::define('viewPulse', function (User $user) {
        return $user->isAdmin();
    });
}
```

Añade el código anterior al método `boot` de `app/Providers/AppServiceProvider.php`.

### Personalización del dashboard

Publica la vista del dashboard para personalizar cards y layout.

```shell theme={null}
php artisan vendor:publish --tag=pulse-dashboard
```

Después edita `resources/views/vendor/pulse/dashboard.blade.php`.
Como el dashboard funciona con [Livewire](https://livewire.laravel.com/), puedes personalizarlo sin compilar JavaScript.

```blade theme={null}
{{-- Ancho completo --}}
<x-pulse full-width>
    ...
</x-pulse>

{{-- Cambiar número de columnas --}}
<x-pulse cols="16">
    ...
</x-pulse>
```

Cada card admite `cols` y `rows` para ajustar tamaño y posición.

```blade theme={null}
<livewire:pulse.usage cols="4" rows="2" />
<livewire:pulse.slow-queries expand />
```

***

## Recorders

Los recorders capturan eventos de la aplicación y los registran en la BD de Pulse.
La configuración vive en la sección `recorders` de `config/pulse.php`.

### Requests / Slow Requests

`Requests` captura información de las solicitudes.
Puedes configurar el umbral de rutas lentas (1000 ms por defecto), la tasa de muestreo y las rutas a ignorar.

```php theme={null}
Recorders\SlowRequests::class => [
    // ...
    'threshold' => [
        '#^/admin/#' => 5000,
        'default' => env('PULSE_SLOW_REQUESTS_THRESHOLD', 1000),
    ],
],
```

### Slow Jobs

`SlowJobs` captura jobs que superan el umbral (1000 ms por defecto).
Puedes configurar umbrales distintos por job.

```php theme={null}
Recorders\SlowJobs::class => [
    // ...
    'threshold' => [
        '#^App\\Jobs\\GenerateYearlyReports$#' => 5000,
        'default' => env('PULSE_SLOW_JOBS_THRESHOLD', 1000),
    ],
],
```

### Exceptions

`Exceptions` captura las excepciones reportables. Se agrupan por clase y ubicación.

### Cache

`CacheInteractions` captura hits y misses de caché.
Puedes agrupar claves parecidas con una regex.

```php theme={null}
Recorders\CacheInteractions::class => [
    // ...
    'groups' => [
        '/:\d+/' => ':*',
    ],
],
```

### Queues

`Queues` captura el throughput de los jobs en cola (encolados, procesando, completados, liberados y fallidos).

### Servers

`Servers` captura el uso de CPU, memoria y almacenamiento de los servidores que ejecutan la app.
Para usarlo, mantén activo `pulse:check` en cada servidor monitorizado.

```shell theme={null}
php artisan pulse:check
```

Por defecto se usa el nombre devuelto por `gethostname()`. Personalízalo con una variable de entorno.

```ini theme={null}
PULSE_SERVER_NAME=load-balancer
```

### Users

`UserRequests` y `UserJobs` capturan el usuario que originó solicitudes o jobs y lo muestran en la card "Application Usage".

### Ingesta con Redis

En entornos de alto tráfico, puedes enviar las entradas a un stream de Redis y luego ingestarlas a la BD.

```ini theme={null}
PULSE_INGEST_DRIVER=redis
```

Con la ingesta por Redis, ejecuta `pulse:work` para procesar el stream.

```shell theme={null}
php artisan pulse:work
```

***

## Muestreo

En entornos de alto tráfico, capturar todos los eventos puede generar millones de filas.
Con el **muestreo** registras solo una parte y el dashboard muestra un valor aproximado.

```php theme={null}
// config/pulse.php
Recorders\UserRequests::class => [
    'sample_rate' => 0.1, // Registrar solo el 10% de las solicitudes
],
```

En el dashboard los valores aproximados se muestran precedidos de `~`.
Cuanto más grande sea el volumen de entradas, más se puede bajar la tasa manteniendo precisión.

***

## Variables de entorno

Los principales ajustes se controlan por variables de entorno.

| Variable                        | Descripción                              | Por defecto              |
| ------------------------------- | ---------------------------------------- | ------------------------ |
| `PULSE_ENABLED`                 | Activa/desactiva Pulse                   | `true`                   |
| `PULSE_DB_CONNECTION`           | Conexión de BD que usa Pulse             | La por defecto de la app |
| `PULSE_INGEST_DRIVER`           | Driver de ingesta (por ejemplo, `redis`) | `storage`                |
| `PULSE_SERVER_NAME`             | Nombre identificador del servidor        | Valor de `gethostname()` |
| `PULSE_SLOW_REQUESTS_THRESHOLD` | Umbral de solicitud lenta (ms)           | `1000`                   |
| `PULSE_SLOW_JOBS_THRESHOLD`     | Umbral de job lento (ms)                 | `1000`                   |
| `PULSE_SLOW_QUERIES_THRESHOLD`  | Umbral de consulta lenta (ms)            | `1000`                   |

***

## Cards personalizadas

Puedes crear tus propias cards de Pulse para mostrar datos específicos.
Se implementan como componentes de [Livewire](https://livewire.laravel.com/).

```php theme={null}
namespace App\Livewire\Pulse;

use Laravel\Pulse\Livewire\Card;
use Livewire\Attributes\Lazy;

#[Lazy]
class TopSellers extends Card
{
    public function render()
    {
        return view('livewire.pulse.top-sellers');
    }
}
```

En la vista usa los componentes Blade que ofrece Pulse para conservar un aspecto uniforme.

```blade theme={null}
<x-pulse::card :cols="$cols" :rows="$rows" :class="$class" wire:poll.5s="">
    <x-pulse::card-header name="Top Sellers">
        <x-slot:icon>
            ...
        </x-slot:icon>
    </x-pulse::card-header>

    <x-pulse::scroll :expand="$expand">
        ...
    </x-pulse::scroll>
</x-pulse::card>
```

Captura datos personalizados con `Pulse::record`.

```php theme={null}
use Laravel\Pulse\Facades\Pulse;

Pulse::record('user_sale', $user->id, $sale->amount)
    ->sum()
    ->count();
```

Incluye el componente en la vista del dashboard.

```blade theme={null}
<x-pulse>
    ...
    <livewire:pulse.top-sellers cols="4" />
</x-pulse>
```

***

## Resumen

| Objetivo                             | Método                                    |
| ------------------------------------ | ----------------------------------------- |
| Instalar Pulse                       | `composer require laravel/pulse`          |
| Acceder al dashboard                 | Ruta `/pulse`                             |
| Control de acceso en producción      | Definir la puerta `viewPulse`             |
| Activar monitorización de servidores | Mantener activo `php artisan pulse:check` |
| Configurar muestreo                  | Ajustar `sample_rate`                     |

## Próximos pasos

<Columns cols={2}>
  <Card title="Manejo de errores" icon="circle-x" href="/es/error-handling">
    Aprende el manejo y reporte de excepciones de la aplicación.
  </Card>

  <Card title="Logging" icon="file-text" href="/es/logging">
    Configuración y uso del sistema de logs de Laravel.
  </Card>
</Columns>


## Related topics

- [Laravel Reverb](/es/reverb.md)
- [Laravel Telescope](/es/telescope.md)
- [Laravel Pennant](/es/pennant.md)
- [Técnicas prácticas de Laravel Telescope](/es/blog/telescope-introduction.md)
- [Introducción a Laravel Nightwatch](/es/blog/nightwatch-introduction.md)
