Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
This commit is contained in:
118
src/Framework/Health/HealthCheckManager.php
Normal file
118
src/Framework/Health/HealthCheckManager.php
Normal file
@@ -0,0 +1,118 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Framework\Health;
|
||||
|
||||
final class HealthCheckManager
|
||||
{
|
||||
/** @var HealthCheckInterface[] */
|
||||
private array $healthChecks = [];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
// Default health checks will be registered via dependency injection
|
||||
}
|
||||
|
||||
public function registerHealthCheck(HealthCheckInterface $healthCheck): void
|
||||
{
|
||||
$this->healthChecks[$healthCheck->getName()] = $healthCheck;
|
||||
}
|
||||
|
||||
public function runAllChecks(): HealthReport
|
||||
{
|
||||
$results = [];
|
||||
$overallStatus = HealthStatus::HEALTHY;
|
||||
|
||||
foreach ($this->healthChecks as $name => $healthCheck) {
|
||||
try {
|
||||
$result = $this->runSingleCheck($healthCheck);
|
||||
$results[$name] = $result;
|
||||
|
||||
// Determine overall status (worst status wins)
|
||||
if ($result->status->getPriority() < $overallStatus->getPriority()) {
|
||||
$overallStatus = $result->status;
|
||||
}
|
||||
|
||||
} catch (\Throwable $e) {
|
||||
$results[$name] = HealthCheckResult::unhealthy(
|
||||
'Health check execution failed: ' . $e->getMessage(),
|
||||
exception: $e
|
||||
);
|
||||
$overallStatus = HealthStatus::UNHEALTHY;
|
||||
}
|
||||
}
|
||||
|
||||
return new HealthReport($overallStatus, $results);
|
||||
}
|
||||
|
||||
public function runCheck(string $name): ?HealthCheckResult
|
||||
{
|
||||
if (! isset($this->healthChecks[$name])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $this->runSingleCheck($this->healthChecks[$name]);
|
||||
}
|
||||
|
||||
public function runChecksByCategory(HealthCheckCategory $category): HealthReport
|
||||
{
|
||||
$results = [];
|
||||
$overallStatus = HealthStatus::HEALTHY;
|
||||
|
||||
foreach ($this->healthChecks as $name => $healthCheck) {
|
||||
if ($healthCheck->getCategory() !== $category) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$result = $this->runSingleCheck($healthCheck);
|
||||
$results[$name] = $result;
|
||||
|
||||
if ($result->status->getPriority() < $overallStatus->getPriority()) {
|
||||
$overallStatus = $result->status;
|
||||
}
|
||||
}
|
||||
|
||||
return new HealthReport($overallStatus, $results);
|
||||
}
|
||||
|
||||
private function runSingleCheck(HealthCheckInterface $healthCheck): HealthCheckResult
|
||||
{
|
||||
$timeout = $healthCheck->getTimeout() / 1000; // Convert to seconds
|
||||
|
||||
// Simple timeout implementation
|
||||
$startTime = microtime(true);
|
||||
$result = $healthCheck->check();
|
||||
$elapsed = microtime(true) - $startTime;
|
||||
|
||||
if ($elapsed > $timeout) {
|
||||
return HealthCheckResult::warning(
|
||||
"Health check '{$healthCheck->getName()}' exceeded timeout ({$timeout}s)",
|
||||
['elapsed_time' => $elapsed, 'timeout' => $timeout]
|
||||
);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function getRegisteredChecks(): array
|
||||
{
|
||||
return array_keys($this->healthChecks);
|
||||
}
|
||||
|
||||
public function getChecksByCategory(): array
|
||||
{
|
||||
$categorized = [];
|
||||
|
||||
foreach ($this->healthChecks as $name => $healthCheck) {
|
||||
$category = $healthCheck->getCategory()->value;
|
||||
$categorized[$category][] = [
|
||||
'name' => $name,
|
||||
'display_name' => $healthCheck->getName(),
|
||||
'timeout' => $healthCheck->getTimeout(),
|
||||
];
|
||||
}
|
||||
|
||||
return $categorized;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user