feat(Production): Complete production deployment infrastructure

- Add comprehensive health check system with multiple endpoints
- Add Prometheus metrics endpoint
- Add production logging configurations (5 strategies)
- Add complete deployment documentation suite:
  * QUICKSTART.md - 30-minute deployment guide
  * DEPLOYMENT_CHECKLIST.md - Printable verification checklist
  * DEPLOYMENT_WORKFLOW.md - Complete deployment lifecycle
  * PRODUCTION_DEPLOYMENT.md - Comprehensive technical reference
  * production-logging.md - Logging configuration guide
  * ANSIBLE_DEPLOYMENT.md - Infrastructure as Code automation
  * README.md - Navigation hub
  * DEPLOYMENT_SUMMARY.md - Executive summary
- Add deployment scripts and automation
- Add DEPLOYMENT_PLAN.md - Concrete plan for immediate deployment
- Update README with production-ready features

All production infrastructure is now complete and ready for deployment.
This commit is contained in:
2025-10-25 19:18:37 +02:00
parent caa85db796
commit fc3d7e6357
83016 changed files with 378904 additions and 20919 deletions

View File

@@ -14,7 +14,9 @@ use PHPUnit\Framework\TestCase;
final class DatabasePerformanceTest extends TestCase
{
private DatabaseManager $database;
private WorkerRegistry $workerRegistry;
private JobDistributionService $distributionService;
protected function setUp(): void
@@ -55,7 +57,7 @@ final class DatabasePerformanceTest extends TestCase
$randomWorker = $workers[array_rand($workers)];
$workerId = $randomWorker->id->toString();
$time = PerformanceTestHelper::measureTime(function() use ($workerId) {
$time = PerformanceTestHelper::measureTime(function () use ($workerId) {
return $this->workerRegistry->getWorker($workerId);
});
@@ -68,7 +70,7 @@ final class DatabasePerformanceTest extends TestCase
// Test getting available workers
$availableWorkerTimes = [];
for ($i = 0; $i < 100; $i++) {
$time = PerformanceTestHelper::measureTime(function() {
$time = PerformanceTestHelper::measureTime(function () {
return $this->workerRegistry->getAvailableWorkers();
});
$availableWorkerTimes[] = $time;
@@ -83,7 +85,7 @@ final class DatabasePerformanceTest extends TestCase
$randomWorker = $workers[array_rand($workers)];
$workerId = $randomWorker->id->toString();
$time = PerformanceTestHelper::measureTime(function() use ($workerId) {
$time = PerformanceTestHelper::measureTime(function () use ($workerId) {
$this->updateWorkerStatus($workerId, WorkerStatus::BUSY);
$this->updateWorkerStatus($workerId, WorkerStatus::AVAILABLE);
});
@@ -136,7 +138,7 @@ final class DatabasePerformanceTest extends TestCase
$randomJob = $jobs[array_rand($jobs)];
$jobId = $randomJob->id;
$time = PerformanceTestHelper::measureTime(function() use ($jobId) {
$time = PerformanceTestHelper::measureTime(function () use ($jobId) {
return $this->getJobById($jobId);
});
@@ -152,7 +154,7 @@ final class DatabasePerformanceTest extends TestCase
foreach ($statuses as $status) {
for ($i = 0; $i < 25; $i++) {
$time = PerformanceTestHelper::measureTime(function() use ($status) {
$time = PerformanceTestHelper::measureTime(function () use ($status) {
return $this->getJobsByStatus($status);
});
$statusQueryTimes[] = $time;
@@ -168,7 +170,7 @@ final class DatabasePerformanceTest extends TestCase
$randomWorker = $workers[array_rand($workers)];
$workerId = $randomWorker->id->toString();
$time = PerformanceTestHelper::measureTime(function() use ($workerId) {
$time = PerformanceTestHelper::measureTime(function () use ($workerId) {
return $this->getJobsByWorker($workerId);
});
@@ -199,21 +201,21 @@ final class DatabasePerformanceTest extends TestCase
// Test batch worker registration
$workers = $this->createWorkers($batchSize, 20);
$batchRegisterTime = PerformanceTestHelper::measureTime(function() use ($workers) {
$batchRegisterTime = PerformanceTestHelper::measureTime(function () use ($workers) {
$this->registerWorkers($workers);
});
// Test batch job distribution
$jobs = PerformanceTestHelper::createBulkJobs($batchSize);
$batchDistributeTime = PerformanceTestHelper::measureTime(function() use ($jobs) {
$batchDistributeTime = PerformanceTestHelper::measureTime(function () use ($jobs) {
foreach ($jobs as $job) {
$this->distributionService->distributeJob($job);
}
});
// Test batch job status updates
$batchUpdateTime = PerformanceTestHelper::measureTime(function() use ($jobs) {
$batchUpdateTime = PerformanceTestHelper::measureTime(function () use ($jobs) {
foreach ($jobs as $job) {
$this->updateJobStatus($job->id, JobStatus::COMPLETED);
}
@@ -262,22 +264,23 @@ final class DatabasePerformanceTest extends TestCase
// Test indexed queries performance
$indexTests = [
'worker_by_id' => function() use ($workers) {
'worker_by_id' => function () use ($workers) {
$randomWorker = $workers[array_rand($workers)];
return $this->workerRegistry->getWorker($randomWorker->id->toString());
},
'workers_by_status' => function() {
'workers_by_status' => function () {
return $this->workerRegistry->getWorkersByStatus(WorkerStatus::AVAILABLE);
},
'jobs_by_status' => function() {
'jobs_by_status' => function () {
return $this->getJobsByStatus(JobStatus::PENDING);
},
'jobs_by_priority' => function() {
'jobs_by_priority' => function () {
return $this->getJobsByPriority(\App\Framework\Queue\Jobs\JobPriority::HIGH);
},
'jobs_by_queue' => function() {
'jobs_by_queue' => function () {
return $this->getJobsByQueue('test_queue');
}
},
];
foreach ($indexTests as $testName => $testFunction) {
@@ -303,17 +306,19 @@ final class DatabasePerformanceTest extends TestCase
// Simulate multiple concurrent database operations
$operationTypes = [
'worker_lookup' => function() {
'worker_lookup' => function () {
$workerId = 'worker_' . rand(1, 100);
return $this->workerRegistry->getWorker($workerId);
},
'job_insertion' => function() {
'job_insertion' => function () {
$job = PerformanceTestHelper::createTestJob('pool_test_' . uniqid());
return $this->distributionService->distributeJob($job);
},
'status_query' => function() {
'status_query' => function () {
return $this->getJobsByStatus(JobStatus::PENDING);
}
},
];
$concurrencyLevels = [1, 5, 10, 20];
@@ -361,18 +366,18 @@ final class DatabasePerformanceTest extends TestCase
// Test complex queries that should benefit from optimization
$complexQueries = [
'workers_with_capacity_filter' => function() {
'workers_with_capacity_filter' => function () {
return $this->getWorkersByCapacityRange(15, 25);
},
'jobs_with_multiple_filters' => function() {
'jobs_with_multiple_filters' => function () {
return $this->getJobsWithFilters(JobStatus::PENDING, \App\Framework\Queue\Jobs\JobPriority::NORMAL);
},
'job_count_aggregation' => function() {
'job_count_aggregation' => function () {
return $this->getJobCountsByStatus();
},
'worker_utilization_stats' => function() {
'worker_utilization_stats' => function () {
return $this->getWorkerUtilizationStats();
}
},
];
foreach ($complexQueries as $queryName => $queryFunction) {
@@ -406,7 +411,7 @@ final class DatabasePerformanceTest extends TestCase
$transactionTimes = [];
for ($iteration = 0; $iteration < 20; $iteration++) {
$time = PerformanceTestHelper::measureTime(function() use ($size, $iteration) {
$time = PerformanceTestHelper::measureTime(function () use ($size, $iteration) {
$pdo = $this->database->getConnection();
try {
@@ -420,6 +425,7 @@ final class DatabasePerformanceTest extends TestCase
$pdo->commit();
} catch (\Exception $e) {
$pdo->rollBack();
throw $e;
}
});
@@ -454,6 +460,7 @@ final class DatabasePerformanceTest extends TestCase
$status
);
}
return $workers;
}
@@ -483,6 +490,7 @@ final class DatabasePerformanceTest extends TestCase
$pdo = $this->database->getConnection();
$stmt = $pdo->prepare('SELECT * FROM jobs WHERE id = ?');
$stmt->execute([$jobId]);
return $stmt->fetch(\PDO::FETCH_ASSOC) ?: null;
}
@@ -491,6 +499,7 @@ final class DatabasePerformanceTest extends TestCase
$pdo = $this->database->getConnection();
$stmt = $pdo->prepare('SELECT * FROM jobs WHERE status = ? LIMIT 100');
$stmt->execute([$status->value]);
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
@@ -499,6 +508,7 @@ final class DatabasePerformanceTest extends TestCase
$pdo = $this->database->getConnection();
$stmt = $pdo->prepare('SELECT * FROM jobs WHERE worker_id = ? LIMIT 100');
$stmt->execute([$workerId]);
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
@@ -507,6 +517,7 @@ final class DatabasePerformanceTest extends TestCase
$pdo = $this->database->getConnection();
$stmt = $pdo->prepare('SELECT * FROM jobs WHERE priority = ? LIMIT 100');
$stmt->execute([$priority->value]);
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
@@ -515,6 +526,7 @@ final class DatabasePerformanceTest extends TestCase
$pdo = $this->database->getConnection();
$stmt = $pdo->prepare('SELECT * FROM jobs WHERE queue_name = ? LIMIT 100');
$stmt->execute([$queueName]);
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
@@ -523,6 +535,7 @@ final class DatabasePerformanceTest extends TestCase
$pdo = $this->database->getConnection();
$stmt = $pdo->prepare('SELECT * FROM workers WHERE capacity BETWEEN ? AND ?');
$stmt->execute([$minCapacity, $maxCapacity]);
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
@@ -531,6 +544,7 @@ final class DatabasePerformanceTest extends TestCase
$pdo = $this->database->getConnection();
$stmt = $pdo->prepare('SELECT * FROM jobs WHERE status = ? AND priority = ? LIMIT 100');
$stmt->execute([$status->value, $priority->value]);
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
@@ -538,6 +552,7 @@ final class DatabasePerformanceTest extends TestCase
{
$pdo = $this->database->getConnection();
$stmt = $pdo->query('SELECT status, COUNT(*) as count FROM jobs GROUP BY status');
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
@@ -554,6 +569,7 @@ final class DatabasePerformanceTest extends TestCase
LEFT JOIN jobs j ON w.id = j.worker_id
GROUP BY w.status
');
return $stmt->fetchAll(\PDO::FETCH_ASSOC);
}
@@ -619,4 +635,4 @@ final class DatabasePerformanceTest extends TestCase
$pdo->exec('DELETE FROM workers');
$pdo->exec('DELETE FROM jobs');
}
}
}