'Toter interner Link', self::AccessDenied => 'Zugriff verweigert (angemeldet)', self::PageExpired => 'Seite abgelaufen (419)', self::Throttled => 'Drosselung trifft angemeldeten Nutzer', ]; private const MaxReportsPerWindow = 5; private const WindowSeconds = 600; /** * @param array $context */ public function report(string $signal, string $location, array $context = []): bool { $location = Str::limit($location, 200, ''); $reported = RateLimiter::attempt( 'error-signal:'.sha1($signal.'|'.$location), self::MaxReportsPerWindow, static fn (): bool => true, self::WindowSeconds, ); if ($reported === false) { return false; } withScope(function (Scope $scope) use ($signal, $location, $context): void { $scope->setFingerprint(['error-signal', $signal, $location]); $scope->setTag('signal', $signal); $scope->setContext('signal', $context); captureMessage((self::Labels[$signal] ?? $signal).': '.$location, Severity::warning()); }); return true; } }