Konfiguracja - Symfony
Na tej stronie Pełna konfiguracja
Pełna konfiguracja
| Klucz | Domyślnie | Znaczenie |
|---|---|---|
environment | %kernel.environment% | kolumna środowiska w panelu |
release | null | wersja wdrożonej aplikacji |
sample_rate | 1.0 | udział wysyłanych zdarzeń błędów |
traces_sample_rate | 0.0 | udział wysyłanych transakcji; 0 wyłącza pomiar |
send_default_pii | false | dołącza adres IP i user agenta |
send_default_user | true | dołącza uwierzytelnionego użytkownika |
ignore_exceptions | [] | klasy nigdy nieraportowane |
ignore_transactions | ['/_wdt', '/_profiler'] | prefiksy ścieżek pomijane w pomiarze |
options | {} | przekazywane wprost do SDK |
Środowiska
Każde środowisko powinno raportować pod jednoznaczną nazwą - production, staging, preview. Nazwa jest kolumną w panelu i filtrem na liście błędów, więc bez niej awaria z produkcji wygląda dokładnie tak samo jak błąd wywołany w testach. Środowisko lokalne zostaw bez poświadczeń: bez tokenu i klucza integracja ładuje się i milczy, więc nie musisz jej wyłączać osobnym warunkiem.
Co bundle rejestruje
| Listener | Zdarzenie | Co robi |
|---|---|---|
ExceptionListener | kernel.exception (-128) | raportuje wyjątek, na którym żądanie faktycznie padło |
TracingListener | kernel.request / kernel.terminate | jedna transakcja na główne żądanie |
UserListener | kernel.controller | dołącza uwierzytelnionego użytkownika |
ConsoleErrorListener | console.error | raportuje błędy komend, oznaczone nazwą komendy |
Dwa ostatnie rejestrują się tylko wtedy, gdy w projekcie są symfony/security-core i symfony/console. Priorytet -128 przy kernel.exception jest celowy: raportujemy wyjątek, który przeszedł przez wszystkie listenery aplikacji, a nie ten, który jeden z nich zaraz zamieni na poprawną odpowiedź.
Co wykluczyć z raportowania
Odpowiedzi 4xx w Symfony są wyjątkami, więc bez wykluczeń panel wypełnią zdarzenia, które nie są awariami:
ray:
ignore_exceptions:
- Symfony\Component\HttpKernel\Exception\NotFoundHttpException
- Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
- Symfony\Component\Security\Core\Exception\AccessDeniedException
ignore_transactions działa na prefiksach ścieżek i domyślnie pomija /_wdt i /_profiler - bez tego połowa transakcji ze środowiska dev dotyczyłaby samego profilera.
Kontekst użytkownika i prywatność
Jeżeli aplikacja używa komponentu Security, UserListener dołącza uwierzytelnionego użytkownika. send_default_user: false to wyłącza. Adres IP i user agent są osobnym przełącznikiem (send_default_pii) i domyślnie nie wychodzą - dotyczą także żądań anonimowych.
Ręczne raportowanie
Hub jest dostępny jako Dock\Ray\State\HubInterface i jako publiczny serwis 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;
}
}
}
Globalne funkcje SDK też działają - bundle instaluje swój hub jako bieżący w czasie budowania kontenera.
Messenger i długo żyjące procesy
Hub jest singletonem kontenera, więc worker trzyma jednego klienta przez całe swoje życie. Wiadomości, na których worker sam padnie, są raportowane przez console.error; raportowanie per wiadomość wymaga własnego middleware Messengera wokół captureException().
Ochrona klucza prywatnego
Klucz prywatny jest sekretem projektu, a nie identyfikatorem. Trzymaj go w zmiennych środowiskowych, w menedżerze sekretów albo w konfiguracji serwera - nigdy w repozytorium, w logach, na zrzucie ekranu ani w kodzie wysyłanym do przeglądarki. Jeden projekt może mieć wiele kluczy, więc produkcja i środowisko testowe powinny dostać osobne: każdy odwołuje się niezależnie, bez przerywania raportowania z pozostałych. Podejrzenie ujawnienia klucza jest wystarczającym powodem, aby go odwołać i wygenerować nowy.