From 9cb4bba1363356b6d98fa77ee7ac9c37bacd34bd Mon Sep 17 00:00:00 2001 From: Alex Bouma Date: Tue, 6 May 2025 16:59:06 +0200 Subject: [PATCH 1/2] Allow passing arbitrary event types to the rate limiter --- src/Transport/HttpTransport.php | 2 +- src/Transport/RateLimiter.php | 13 +++++-------- tests/Transport/RateLimiterTest.php | 4 ++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/Transport/HttpTransport.php b/src/Transport/HttpTransport.php index db9ef1046..f47867fe8 100644 --- a/src/Transport/HttpTransport.php +++ b/src/Transport/HttpTransport.php @@ -91,7 +91,7 @@ public function send(Event $event): Result $this->logger->info(\sprintf('Sending %s to %s.', $eventDescription, $targetDescription), ['event' => $event]); $eventType = $event->getType(); - if ($this->rateLimiter->isRateLimited($eventType)) { + if ($this->rateLimiter->isRateLimited((string) $eventType)) { $this->logger->warning( \sprintf('Rate limit exceeded for sending requests of type "%s".', (string) $eventType), ['event' => $event] diff --git a/src/Transport/RateLimiter.php b/src/Transport/RateLimiter.php index 9a3d6d0f5..6f00cd911 100644 --- a/src/Transport/RateLimiter.php +++ b/src/Transport/RateLimiter.php @@ -6,7 +6,6 @@ use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; -use Sentry\EventType; use Sentry\HttpClient\Response; final class RateLimiter @@ -93,22 +92,20 @@ public function handleResponse(Response $response): bool return false; } - public function isRateLimited(EventType $eventType): bool + public function isRateLimited(string $eventType): bool { $disabledUntil = $this->getDisabledUntil($eventType); return $disabledUntil > time(); } - public function getDisabledUntil(EventType $eventType): int + public function getDisabledUntil(string $eventType): int { - $category = (string) $eventType; - - if ($eventType === EventType::event()) { - $category = self::DATA_CATEGORY_ERROR; + if ($eventType === 'event') { + $eventType = self::DATA_CATEGORY_ERROR; } - return max($this->rateLimits['all'] ?? 0, $this->rateLimits[$category] ?? 0); + return max($this->rateLimits['all'] ?? 0, $this->rateLimits[$eventType] ?? 0); } private function parseRetryAfterHeader(int $currentTime, string $header): int diff --git a/tests/Transport/RateLimiterTest.php b/tests/Transport/RateLimiterTest.php index 19f9a9f89..441aa2eff 100644 --- a/tests/Transport/RateLimiterTest.php +++ b/tests/Transport/RateLimiterTest.php @@ -116,13 +116,13 @@ public function testIsRateLimited(): void private function assertEventTypesAreRateLimited(array $eventTypesLimited): void { foreach ($eventTypesLimited as $eventType) { - $this->assertTrue($this->rateLimiter->isRateLimited($eventType)); + $this->assertTrue($this->rateLimiter->isRateLimited((string) $eventType)); } $eventTypesNotLimited = array_diff(EventType::cases(), $eventTypesLimited); foreach ($eventTypesNotLimited as $eventType) { - $this->assertFalse($this->rateLimiter->isRateLimited($eventType)); + $this->assertFalse($this->rateLimiter->isRateLimited((string) $eventType)); } } } From b543d93fd76a29c13f2f674bceae7d8ba4fa4c53 Mon Sep 17 00:00:00 2001 From: Alex Bouma Date: Tue, 6 May 2025 17:03:19 +0200 Subject: [PATCH 2/2] Prevent making a breaking change --- src/Transport/RateLimiter.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Transport/RateLimiter.php b/src/Transport/RateLimiter.php index 6f00cd911..ce0becfd1 100644 --- a/src/Transport/RateLimiter.php +++ b/src/Transport/RateLimiter.php @@ -6,6 +6,7 @@ use Psr\Log\LoggerInterface; use Psr\Log\NullLogger; +use Sentry\EventType; use Sentry\HttpClient\Response; final class RateLimiter @@ -92,15 +93,23 @@ public function handleResponse(Response $response): bool return false; } - public function isRateLimited(string $eventType): bool + /** + * @param string|EventType $eventType + */ + public function isRateLimited($eventType): bool { $disabledUntil = $this->getDisabledUntil($eventType); return $disabledUntil > time(); } - public function getDisabledUntil(string $eventType): int + /** + * @param string|EventType $eventType + */ + public function getDisabledUntil($eventType): int { + $eventType = $eventType instanceof EventType ? (string) $eventType : $eventType; + if ($eventType === 'event') { $eventType = self::DATA_CATEGORY_ERROR; }