diff --git a/docs/available-checks/redis-memory-usage.md b/docs/available-checks/redis-memory-usage.md new file mode 100644 index 00000000..5272a5d4 --- /dev/null +++ b/docs/available-checks/redis-memory-usage.md @@ -0,0 +1,29 @@ +--- +title: Redis memory usage +weight: 17 +--- + +This check makes sure that your Redis is not consuming too much memory. + +If the memory usage is larger than the specified maximum, this check will fail. + +## Usage + +Here's how you can register the check. + +```php +use Spatie\Health\Facades\Health; +use Spatie\Health\Checks\Checks\RedisMemoryUsageCheck; + +Health::checks([ + RedisMemoryUsageCheck::new()->failWhenAboveMb(1000), +]); +``` + +### Using different connection + +To customize the monitored Redis connection name, call `connectionName`. + +```php +RedisMemoryUsageCheck::new()->connectionName('other-redis-connection-name'), +``` diff --git a/docs/available-checks/schedule.md b/docs/available-checks/schedule.md index 761d8696..6c54521f 100644 --- a/docs/available-checks/schedule.md +++ b/docs/available-checks/schedule.md @@ -1,6 +1,6 @@ --- title: Schedule -weight: 17 +weight: 18 --- This check will make sure the schedule is running. If the check detects that the schedule is not run every minute, it will fail. diff --git a/docs/available-checks/security-advisories.md b/docs/available-checks/security-advisories.md index 9f1c8ad2..5a79c82f 100644 --- a/docs/available-checks/security-advisories.md +++ b/docs/available-checks/security-advisories.md @@ -1,6 +1,6 @@ --- title: Security advisories -weight: 18 +weight: 19 --- This check will check if the PHP packages installed in your project have known security vulnerabilities. This check works using [Packagist's security vulnerability API](https://php.watch/articles/composer-audit#packagist-vuln-list-api). diff --git a/docs/available-checks/used-disk-space.md b/docs/available-checks/used-disk-space.md index beac3c66..1234ecdf 100644 --- a/docs/available-checks/used-disk-space.md +++ b/docs/available-checks/used-disk-space.md @@ -1,6 +1,6 @@ --- title: Used disk space -weight: 19 +weight: 20 --- This check will monitor the percentage of available disk space. diff --git a/src/Checks/Checks/RedisMemoryUsageCheck.php b/src/Checks/Checks/RedisMemoryUsageCheck.php new file mode 100644 index 00000000..8bde5886 --- /dev/null +++ b/src/Checks/Checks/RedisMemoryUsageCheck.php @@ -0,0 +1,50 @@ +connectionName = $connectionName; + + return $this; + } + + public function failWhenAboveMb(float $errorThresholdMb): self + { + $this->failWhenAboveMb = $errorThresholdMb; + + return $this; + } + + public function run(): Result + { + $result = Result::make()->meta([ + 'connection_name' => $this->connectionName, + ]); + + $memoryUsage = $this->getMemoryUsageInMb(); + + if ($memoryUsage >= $this->failWhenAboveMb) { + return $result->failed("Redis memory usage is {$memoryUsage} MB, which is above the threshold of {$this->failWhenAboveMb} MB."); + } + + return $result->ok(); + } + + protected function getMemoryUsageInMb(): float + { + $memoryUsage = (int) Redis::connection($this->connectionName)->info()['Memory']['used_memory']; + + return round($memoryUsage / 1024 / 1024, 2); + } +} diff --git a/tests/Checks/RedisMemoryUsageTest.php b/tests/Checks/RedisMemoryUsageTest.php new file mode 100644 index 00000000..d78e3dab --- /dev/null +++ b/tests/Checks/RedisMemoryUsageTest.php @@ -0,0 +1,30 @@ +fakeMemoryUsageInMb(999) + ->failWhenAboveMb(1000) + ->run(); + + expect($result) + ->toBeInstanceOf(Result::class) + ->status->toBe(Status::ok()); +}); + +it('will return an error if the used memory does cross the threshold', function () { + $result = FakeRedisMemoryUsageCheck::new() + ->fakeMemoryUsageInMb(1001) + ->failWhenAboveMb(1000) + ->run(); + + expect($result) + ->toBeInstanceOf(Result::class) + ->status->toEqual(Status::failed()) + ->getNotificationMessage()->toEqual('Redis memory usage is 1001 MB, which is above the threshold of 1000 MB.'); +}); diff --git a/tests/TestClasses/FakeRedisMemoryUsageCheck.php b/tests/TestClasses/FakeRedisMemoryUsageCheck.php new file mode 100644 index 00000000..266661e3 --- /dev/null +++ b/tests/TestClasses/FakeRedisMemoryUsageCheck.php @@ -0,0 +1,22 @@ +fakeMemoryUsageInMb = $fakeMemoryUsageInMb; + + return $this; + } + + public function getMemoryUsageInMb(): float + { + return $this->fakeMemoryUsageInMb; + } +}