Configuración - Symfony
La configuración completa
| Clave | Por defecto | Significado |
|---|---|---|
environment | %kernel.environment% | columna de entorno en el panel |
release | null | versión de la aplicación desplegada |
sample_rate | 1.0 | proporción de eventos de error enviados |
traces_sample_rate | 0.0 | proporción de transacciones enviadas; 0 desactiva la medición |
send_default_pii | false | adjunta la dirección IP y el user agent |
send_default_user | true | adjunta el usuario autenticado |
ignore_exceptions | [] | clases que nunca se notifican |
ignore_transactions | ['/_wdt', '/_profiler'] | prefijos de ruta nunca medidos |
options | {} | se pasan directamente al SDK |
Entornos
Cada entorno debería informar con un nombre inequívoco: production, staging, preview. El nombre es una columna del panel y un filtro de la lista de errores, así que sin él una caída de producción se ve igual que un error provocado en una prueba. Deja el entorno local sin credenciales: sin token ni clave la integración se carga y permanece en silencio, de modo que no necesitas desactivarla con una condición aparte.
Qué registra el bundle
| Listener | Evento | Qué hace |
|---|---|---|
ExceptionListener | kernel.exception (-128) | informa de la excepción con la que la petición realmente murió |
TracingListener | kernel.request / kernel.terminate | una transacción por petición principal |
UserListener | kernel.controller | adjunta el usuario autenticado |
ConsoleErrorListener | console.error | informa de comandos fallidos, etiquetados con el nombre del comando |
Los dos últimos solo se registran si están instalados symfony/security-core y symfony/console. La prioridad -128 en kernel.exception es intencionada: informamos de la excepción que ha pasado por todos los listeners de la aplicación, no de una que otro listener está a punto de convertir en una respuesta válida.
Qué dejar fuera de las notificaciones
En Symfony las respuestas 4xx son excepciones, así que sin exclusiones el panel se llena de eventos que no son averías:
ray:
ignore_exceptions:
- Symfony\Component\HttpKernel\Exception\NotFoundHttpException
- Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
- Symfony\Component\Security\Core\Exception\AccessDeniedException
ignore_transactions trabaja con prefijos de ruta y omite /_wdt y /_profiler por defecto: sin eso, la mitad de las transacciones de un entorno dev serían el propio profiler.
Contexto de usuario y privacidad
Si la aplicación usa el componente Security, UserListener adjunta el usuario autenticado. send_default_user: false lo desactiva. La dirección IP y el user agent son un interruptor aparte (send_default_pii) y no salen por defecto: también afectan a las peticiones anónimas.
Notificar a mano
El hub está disponible como Dock\Ray\State\HubInterface y como servicio público ray.hub:
use Dock\Ray\State\HubInterface;
final class ImportService
{
public function __construct(private HubInterface $ray)
{
}
public function import(): void
{
try {
$this->run();
} catch (\Throwable $exception) {
$this->ray->captureException($exception);
throw $exception;
}
}
}
Las funciones globales del SDK también funcionan: el bundle instala su hub como el actual mientras arranca el contenedor.
Messenger y procesos de larga duración
El hub es un singleton del contenedor, así que un worker mantiene un cliente durante toda su vida. Los mensajes con los que el propio worker muere se notifican a través de console.error; notificar por mensaje requiere tu propio middleware de Messenger alrededor de captureException().
Proteger la clave privada
La clave privada es un secreto del proyecto, no un identificador. Guárdala en variables de entorno, en un gestor de secretos o en la configuración del servidor: nunca en el repositorio, en los registros, en una captura de pantalla ni en código que llegue al navegador. Un proyecto puede tener varias claves, así que producción y preproducción deberían tener la suya: cada una se revoca por separado sin interrumpir a las demás. La sospecha de que una clave se ha filtrado ya es motivo suficiente para revocarla y generar otra.