sqrtspace-php/src/Memory/Handlers/LoggingHandler.php
2025-07-20 04:08:08 -04:00

59 lines
2.1 KiB
PHP

<?php
declare(strict_types=1);
namespace SqrtSpace\SpaceTime\Memory\Handlers;
use SqrtSpace\SpaceTime\Memory\MemoryPressureHandler;
use SqrtSpace\SpaceTime\Memory\MemoryPressureLevel;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
/**
* Log memory pressure events
*/
class LoggingHandler implements MemoryPressureHandler
{
private LoggerInterface $logger;
private MemoryPressureLevel $minLevel;
public function __construct(
?LoggerInterface $logger = null,
MemoryPressureLevel $minLevel = MemoryPressureLevel::MEDIUM
) {
$this->logger = $logger ?? new NullLogger();
$this->minLevel = $minLevel;
}
public function shouldHandle(MemoryPressureLevel $level): bool
{
return $level->isHigherThan($this->minLevel) || $level === $this->minLevel;
}
public function handle(MemoryPressureLevel $level, array $memoryInfo): void
{
$context = [
'level' => $level->value,
'usage' => $this->formatBytes($memoryInfo['usage']),
'limit' => $this->formatBytes($memoryInfo['limit']),
'percentage' => round($memoryInfo['percentage'], 2),
'available' => $this->formatBytes($memoryInfo['available']),
];
match ($level) {
MemoryPressureLevel::CRITICAL => $this->logger->critical('Critical memory pressure detected', $context),
MemoryPressureLevel::HIGH => $this->logger->error('High memory pressure detected', $context),
MemoryPressureLevel::MEDIUM => $this->logger->warning('Medium memory pressure detected', $context),
MemoryPressureLevel::LOW => $this->logger->info('Low memory pressure detected', $context),
default => $this->logger->debug('Memory pressure check', $context),
};
}
private function formatBytes(float $bytes): string
{
$units = ['B', 'KB', 'MB', 'GB'];
$factor = floor((strlen((string)(int)$bytes) - 1) / 3);
return sprintf("%.2f %s", $bytes / pow(1024, $factor), $units[$factor]);
}
}