Ir al contenido

SDK Laravel

Páginas vistas automáticas del lado del servidor (middleware), una fachada para los eventos. El seguimiento se hace 100 % del lado del servidor, sin cookies de rastreo ni JS, invisible para los bloqueadores. Compatible con Laravel 10 a 13, PHP ≥ 8.1.

Instalación

composer require quiet-metrics/laravel-metrics

El service provider y el alias de fachada se registran automáticamente (package discovery).

Actualizar

Cada versión menor 0.x del puente exige la versión menor correspondiente del SDK base quiet-metrics/php-metrics: actualice ambos a la vez, y solo esos dos.

composer require quiet-metrics/laravel-metrics:^0.5 --no-update
composer update quiet-metrics/laravel-metrics quiet-metrics/php-metrics

Un simple composer require falla, porque el SDK base está bloqueado en composer.lock. El mensaje de error de Composer propone entonces -W: esa opción actualiza todas las dependencias del proyecto, Laravel incluido. Lea el CHANGELOG del paquete antes de actualizar: señala los cambios en lo que se cuenta.

Configuración

Las variables de entorno bastan en la mayoría de los casos:

QUIET_METRICS_PUBLIC_KEY=qm_pub_XXXXXXXXXXXXXXXXX
QUIET_METRICS_SECRET_KEY=qm_sec_XXXXXXXXXXXXXXXX
# QUIET_METRICS_ENDPOINT=https://quietmetrics.dev/api/v1/collect

Archivo de configuración publicable si es necesario (config/quiet-metrics.php):

php artisan vendor:publish --tag=quiet-metrics-config

Páginas vistas automáticas

El middleware quiet-metrics envía la página vista en terminate(), después del envío de la respuesta: ningún impacto en la latencia percibida. Por ruta o por grupo:

Route::middleware('quiet-metrics')->group(function () {
    Route::get('/', HomeController::class);
    // …
});

Para medir todo el tráfico web de una vez (Laravel 11+):

// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->appendToGroup('web', \QuietMetrics\Laravel\Middleware\TrackPageview::class);
})

Las páginas vistas automáticas son documentos HTML/XHTML mostrados como respuesta a un GET, incluidos los errores 404/500 generados por una ruta de su aplicación (abort(404), modelo no encontrado). Se excluyen las redirecciones, las respuestas vacías (204/205), los PDF, JSON y archivos adjuntos, además de AJAX, precargas anunciadas y visitantes excluidos.

Las direcciones que no corresponden a ninguna ruta no se miden con la integración en el grupo web: cuando ninguna ruta corresponde, Laravel no ejecuta ningún middleware de grupo. Estos 404 incluyen los enlaces rotos y las direcciones antiguas, pero también la mayoría de las peticiones de robots que sondean los sitios (/wp-login.php, /.env). Para medirlos de todos modos, declare el middleware en la pila global, en lugar del grupo web:

// bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->append(\QuietMetrics\Laravel\Middleware\TrackPageview::class);
})

La pila global también cubre las rutas fuera del grupo web, como un panel de administración: apártelas con las rutas excluidas en los ajustes del sitio. No declare el middleware en ambos sitios, o cada página se contaría dos veces.

Desde la versión 0.4.0, 'track_404' => true también emite un evento 404 con la ruta de la página, solo en los 404 que ve el middleware. Está desactivado por defecto: cada evento adicional consume cuota. Actívelo en el servidor o mediante data-404 en el script de una misma página para evitar duplicados. El seguimiento no ve las páginas servidas por una caché que evita PHP.

Eventos

use QuietMetrics\Laravel\Facades\QuietMetrics;

QuietMetrics::event('registro', ['plan' => 'pro']);

Desde un job, un comando o un listener (fuera de una petición HTTP), no hay URL actual: pásela explícitamente; de lo contrario, no se envía nada (abandono silencioso):

QuietMetrics::event('importacion-terminada', ['filas' => 1200], [
    'url' => 'https://misitio.es/imports',
]);

Casos particulares

Caché de página completa (Varnish, Cloudflare, caché de respuestas…). Una página servida desde una caché situada delante de su aplicación no ejecuta PHP: su visita no se cuenta. Deje esas páginas fuera de la caché o añada también el script qm.js: ambas mediciones conviven sin contar dos veces.

Octane, workers persistentes. El contexto (URL, referrer, IP, User-Agent, idioma) proviene del objeto Request de cada petición, nunca de las superglobales. No hay nada que configurar.

Reverse proxy / CDN. El middleware lee $request->ip(): configure los trusted proxies de su aplicación Laravel como de costumbre, y la IP real del visitante llegará correctamente. La opción trust_proxy_headers del SDK base solo sirve fuera de Laravel.

Entornos. Utilice una clave de sitio distinta por entorno (.env de staging vs producción), o simplemente no ponga ninguna clave en staging: sin clave pública, no se envía nada.

Lo que se transmite. Desde la versión 0.5.0, el SDK solo transmite lo que Quiet Metrics lee: la dirección de la página reducida a su origen, su ruta y sus parámetros de campaña, y el referente reducido a su origen. Detalle en el SDK PHP.

Tests. Desde la versión 0.5.0, QuietMetrics::fake() sustituye el cliente por un falso que registra en lugar de enviar. Las páginas vistas del middleware también pasan por él.

use QuietMetrics\Laravel\Facades\QuietMetrics;

QuietMetrics::fake();

$this->post('/register', [...])->assertRedirect();

QuietMetrics::assertEventSent('registro', ['plan' => 'pro']);
QuietMetrics::assertPageviewSent();

Otras aserciones: assertEventNotSent('nombre') y assertNothingSent(). El falso registra lo que su aplicación pide, antes de la minimización aplicada al enviar. Si su código recibe el cliente por inyección, tipe QuietMetrics\Tracker en lugar de QuietMetrics\Client: es lo que lo hace sustituible. Para que una suite sin el falso no envíe nada, vacíe la clave pública en phpunit.xml (<env name="QUIET_METRICS_PUBLIC_KEY" value=""/>).

Contrato de robustez

El envío es no bloqueante (socket fire-and-forget, ~1 ms percibido, respaldo cURL corto) y cualquier fallo es silencioso: la analítica nunca rompe el sitio anfitrión, incluso si la plataforma está inaccesible.

¿No encuentra su respuesta?

El soporte responde en días laborables.