From bd40d7d590eca4e35cce31a790cf0ec27c1fabcf Mon Sep 17 00:00:00 2001 From: "S. Simeonov" Date: Wed, 17 Jul 2019 14:33:30 +0300 Subject: [PATCH] DiskUsage Check --- src/Checks/Filesystem/DiskSpace.php | 28 ++----------- src/Checks/Filesystem/DiskUsage.php | 63 +++++++++++++++++++++++++++++ src/Checks/Traits/FormatTrait.php | 31 ++++++++++++++ tests/Checks/CheckTestCase.php | 1 + tests/Checks/DiskUsageTest.php | 21 ++++++++++ 5 files changed, 119 insertions(+), 25 deletions(-) create mode 100644 src/Checks/Filesystem/DiskUsage.php create mode 100644 src/Checks/Traits/FormatTrait.php create mode 100644 tests/Checks/DiskUsageTest.php diff --git a/src/Checks/Filesystem/DiskSpace.php b/src/Checks/Filesystem/DiskSpace.php index d3a64c2..f14504c 100644 --- a/src/Checks/Filesystem/DiskSpace.php +++ b/src/Checks/Filesystem/DiskSpace.php @@ -3,10 +3,13 @@ use Health\Checks\BaseCheck; use Health\Checks\HealthCheckInterface; +use Health\Checks\Traits\FormatTrait; class DiskSpace extends BaseCheck implements HealthCheckInterface { + use FormatTrait; + /** * Default disk space threshold of 100 MB * @@ -48,29 +51,4 @@ public function call() return $builder->build(); } - - /** - * Format bytes to kb, mb, gb, tb - * - * @param integer $size - * @param integer $precision - * @return string - */ - private function formatBytes($size, $precision = 2) - { - $size = (int) $size; - $base = $size > 0 ? log($size) / log(1024) : 0; - - $suffixes = [ - ' bytes', - ' KB', - ' MB', - ' TB', - ' GB' - ]; - - $value = $size > 0 ? round(pow(1024, $base - floor($base)), $precision) : 0; - - return $value . $suffixes[floor($base)]; - } } \ No newline at end of file diff --git a/src/Checks/Filesystem/DiskUsage.php b/src/Checks/Filesystem/DiskUsage.php new file mode 100644 index 0000000..52868f7 --- /dev/null +++ b/src/Checks/Filesystem/DiskUsage.php @@ -0,0 +1,63 @@ +getBuilder(); + + $path = $this->getParam('path', self::DEFAULT_PATH); + $threshold = $this->getParam('threshold', self::DEFAULT_THRESHOLD); + + if ($threshold > 100 || $threshold < 0) { + return $builder->down()->withData('error', 'Invalid Threshold - ' . $threshold); + } + + $free = disk_free_space($path); + $total = disk_total_space($path); + $usage = $total - $free; + $percentage = ($usage / $total) * 100; + + if ($percentage >= $threshold) { + $builder->up(); + } else { + $builder->down(); + } + + $builder->withData('free_bytes', $free) + ->withData('free_human', $this->formatBytes($free)) + ->withData('usage', $usage) + ->withData('usage_human', $this->formatBytes($usage)) + ->withData('path', $path) + ->withData('threshold', $threshold); + + return $builder->build(); + } +} \ No newline at end of file diff --git a/src/Checks/Traits/FormatTrait.php b/src/Checks/Traits/FormatTrait.php new file mode 100644 index 0000000..7e56dda --- /dev/null +++ b/src/Checks/Traits/FormatTrait.php @@ -0,0 +1,31 @@ + 0 ? log($size) / log(1024) : 0; + + $suffixes = [ + ' bytes', + ' KB', + ' MB', + ' TB', + ' GB' + ]; + + $value = $size > 0 ? round(pow(1024, $base - floor($base)), $precision) : 0; + + return $value . $suffixes[floor($base)]; + } +} \ No newline at end of file diff --git a/tests/Checks/CheckTestCase.php b/tests/Checks/CheckTestCase.php index 595d786..baa8452 100755 --- a/tests/Checks/CheckTestCase.php +++ b/tests/Checks/CheckTestCase.php @@ -9,6 +9,7 @@ class CheckTestCase extends \Orchestra\Testbench\TestCase protected function assertCheck($health, string $state = 'UP') { // dump($health); + $this->assertInstanceOf(HealthCheck::class, $health); $this->assertNotEmpty($health->getName()); $this->assertEquals($state, $health->getState()); diff --git a/tests/Checks/DiskUsageTest.php b/tests/Checks/DiskUsageTest.php new file mode 100644 index 0000000..4243f0e --- /dev/null +++ b/tests/Checks/DiskUsageTest.php @@ -0,0 +1,21 @@ +assertCheck($this->runCheck(DiskUsage::class, [ + 'path' => '/', + 'threshold' => 1 + ]), 'UP'); + + $this->assertCheck($this->runCheck(DiskUsage::class, [ + 'path' => '/', + 'threshold' => 100 + ]), 'DOWN'); + } +} \ No newline at end of file