feat(Deployment): Integrate Ansible deployment via PHP deployment pipeline
- Create AnsibleDeployStage using framework's Process module for secure command execution - Integrate AnsibleDeployStage into DeploymentPipelineCommands for production deployments - Add force_deploy flag support in Ansible playbook to override stale locks - Use PHP deployment module as orchestrator (php console.php deploy:production) - Fix ErrorAggregationInitializer to use Environment class instead of $_ENV superglobal Architecture: - BuildStage → AnsibleDeployStage → HealthCheckStage for production - Process module provides timeout, error handling, and output capture - Ansible playbook supports rollback via rollback-git-based.yml - Zero-downtime deployments with health checks
This commit is contained in:
156
tests/debug/test-queue-anomaly-simple.php
Normal file
156
tests/debug/test-queue-anomaly-simple.php
Normal file
@@ -0,0 +1,156 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
/**
|
||||
* Simplified Queue Anomaly Integration Test
|
||||
*
|
||||
* Tests the ML integration WITHOUT requiring database
|
||||
*/
|
||||
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
use App\Framework\Queue\MachineLearning\JobAnomalyDetector;
|
||||
use App\Framework\Queue\MachineLearning\ValueObjects\JobFeatures;
|
||||
use App\Framework\Core\ValueObjects\Score;
|
||||
|
||||
echo "=== Simplified Queue Anomaly Integration Test ===\n\n";
|
||||
|
||||
try {
|
||||
// Create detector
|
||||
echo "1. Creating JobAnomalyDetector with 40% threshold...\n";
|
||||
$detector = new JobAnomalyDetector(
|
||||
anomalyThreshold: new Score(0.4), // 40% threshold
|
||||
zScoreThreshold: 3.0,
|
||||
iqrMultiplier: 1.5
|
||||
);
|
||||
echo " ✓ Detector created\n";
|
||||
echo " Threshold: " . sprintf("%.0f%%", $detector->getThreshold()->value() * 100) . "\n";
|
||||
echo " Configuration: " . json_encode($detector->getConfiguration()) . "\n\n";
|
||||
|
||||
// Test Case 1: Normal Job Features
|
||||
echo "2. Test Case 1: Normal Job Execution\n";
|
||||
echo " → Baseline features with low anomaly indicators\n";
|
||||
$normalFeatures = new JobFeatures(
|
||||
executionTimeVariance: 0.15, // Low variance
|
||||
memoryUsagePattern: 0.10, // Stable memory
|
||||
retryFrequency: 0.0, // No retries
|
||||
failureRate: 0.05, // 5% failure rate (normal)
|
||||
queueDepthCorrelation: 0.10, // Low queue impact
|
||||
dependencyChainComplexity: 0.08, // Simple
|
||||
payloadSizeAnomaly: 0.05, // Normal payload
|
||||
executionTimingRegularity: 0.30 // Moderate regularity
|
||||
);
|
||||
|
||||
$result1 = $detector->detect($normalFeatures);
|
||||
echo " Result: " . ($result1->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
|
||||
echo " Confidence: " . sprintf("%.2f%%", $result1->anomalyScore->value() * 100) . "\n";
|
||||
echo " Severity: {$result1->getSeverity()}\n\n";
|
||||
|
||||
// Test Case 2: High Failure + High Retries
|
||||
echo "3. Test Case 2: High Failure Job (Queue System Stress)\n";
|
||||
echo " → Simulating job with high failures and retries\n";
|
||||
$highFailureFeatures = new JobFeatures(
|
||||
executionTimeVariance: 0.45, // Moderate variance
|
||||
memoryUsagePattern: 0.30, // Some memory issues
|
||||
retryFrequency: 0.85, // Very high retries (85%)
|
||||
failureRate: 0.65, // High failure rate (65%)
|
||||
queueDepthCorrelation: 0.40, // Queue getting backed up
|
||||
dependencyChainComplexity: 0.25, // Somewhat complex
|
||||
payloadSizeAnomaly: 0.20, // Slightly unusual payload
|
||||
executionTimingRegularity: 0.15 // Irregular timing
|
||||
);
|
||||
|
||||
$result2 = $detector->detect($highFailureFeatures);
|
||||
echo " Result: " . ($result2->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
|
||||
echo " Confidence: " . sprintf("%.2f%%", $result2->anomalyScore->value() * 100) . "\n";
|
||||
echo " Severity: {$result2->getSeverity()}\n";
|
||||
if ($result2->isAnomalous) {
|
||||
echo " Primary Indicator: {$result2->primaryIndicator}\n";
|
||||
echo " Detected Patterns (" . count($result2->detectedPatterns) . "):\n";
|
||||
foreach ($result2->detectedPatterns as $pattern) {
|
||||
echo " - {$pattern['type']}: " . sprintf("%.2f%%", $pattern['confidence']->value() * 100) . "\n";
|
||||
}
|
||||
echo " Recommended Action: {$result2->getRecommendedAction()}\n";
|
||||
echo " Requires Immediate Attention: " . ($result2->requiresImmediateAttention() ? "YES" : "NO") . "\n";
|
||||
}
|
||||
echo "\n";
|
||||
|
||||
// Test Case 3: Performance Degradation
|
||||
echo "4. Test Case 3: Performance Degradation\n";
|
||||
echo " → Simulating slow execution with memory issues\n";
|
||||
$performanceDegradationFeatures = new JobFeatures(
|
||||
executionTimeVariance: 0.85, // Very unstable execution
|
||||
memoryUsagePattern: 0.75, // Significant memory anomalies
|
||||
retryFrequency: 0.25, // Some retries
|
||||
failureRate: 0.20, // Moderate failure rate
|
||||
queueDepthCorrelation: 0.50, // Queue impact moderate
|
||||
dependencyChainComplexity: 0.30, // Moderate complexity
|
||||
payloadSizeAnomaly: 0.35, // Somewhat unusual payload
|
||||
executionTimingRegularity: 0.20 // Irregular
|
||||
);
|
||||
|
||||
$result3 = $detector->detect($performanceDegradationFeatures);
|
||||
echo " Result: " . ($result3->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
|
||||
echo " Confidence: " . sprintf("%.2f%%", $result3->anomalyScore->value() * 100) . "\n";
|
||||
echo " Severity: {$result3->getSeverity()}\n";
|
||||
if ($result3->isAnomalous) {
|
||||
echo " Primary Indicator: {$result3->primaryIndicator}\n";
|
||||
echo " Top 3 Contributors:\n";
|
||||
foreach ($result3->getTopContributors(3) as $contributor) {
|
||||
echo " - {$contributor['feature']}: " . sprintf("%.2f%%", $contributor['score']->value() * 100) . "\n";
|
||||
}
|
||||
}
|
||||
echo "\n";
|
||||
|
||||
// Test Case 4: Queue Overload (High Queue Depth)
|
||||
echo "5. Test Case 4: Queue Overload Scenario\n";
|
||||
echo " → Simulating high queue depth impact\n";
|
||||
$queueOverloadFeatures = new JobFeatures(
|
||||
executionTimeVariance: 0.50, // Unstable due to overload
|
||||
memoryUsagePattern: 0.45, // Memory pressure
|
||||
retryFrequency: 0.40, // Many retries
|
||||
failureRate: 0.30, // Elevated failure rate
|
||||
queueDepthCorrelation: 0.90, // VERY high queue depth (900+ jobs!)
|
||||
dependencyChainComplexity: 0.35, // Complex dependencies
|
||||
payloadSizeAnomaly: 0.25, // Normal-ish payload
|
||||
executionTimingRegularity: 0.10 // Very irregular due to backlog
|
||||
);
|
||||
|
||||
$result4 = $detector->detect($queueOverloadFeatures);
|
||||
echo " Result: " . ($result4->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
|
||||
echo " Confidence: " . sprintf("%.2f%%", $result4->anomalyScore->value() * 100) . "\n";
|
||||
echo " Severity: {$result4->getSeverity()}\n";
|
||||
if ($result4->isAnomalous) {
|
||||
echo " Primary Indicator: {$result4->primaryIndicator}\n";
|
||||
echo " Detected Patterns:\n";
|
||||
foreach ($result4->detectedPatterns as $pattern) {
|
||||
echo " - {$pattern['type']}\n";
|
||||
echo " Confidence: " . sprintf("%.2f%%", $pattern['confidence']->value() * 100) . "\n";
|
||||
echo " Description: {$pattern['description']}\n";
|
||||
}
|
||||
}
|
||||
echo "\n";
|
||||
|
||||
// Summary
|
||||
echo "=== Test Summary ===\n";
|
||||
echo "✓ JobAnomalyDetector: Working correctly\n";
|
||||
echo "✓ Threshold Configuration: " . sprintf("%.0f%%", $detector->getThreshold()->value() * 100) . "\n";
|
||||
echo "✓ Pattern Detection: Working\n";
|
||||
echo "✓ Severity Assessment: Working\n\n";
|
||||
|
||||
echo "Test Results:\n";
|
||||
echo " 1. Normal Job: " . ($result1->isAnomalous ? "ANOMALOUS" : "✓ NORMAL") . " (" . sprintf("%.2f%%", $result1->anomalyScore->value() * 100) . ")\n";
|
||||
echo " 2. High Failure: " . ($result2->isAnomalous ? "🚨 ANOMALOUS" : "NORMAL") . " (" . sprintf("%.2f%%", $result2->anomalyScore->value() * 100) . ")\n";
|
||||
echo " 3. Performance Degradation: " . ($result3->isAnomalous ? "🚨 ANOMALOUS" : "NORMAL") . " (" . sprintf("%.2f%%", $result3->anomalyScore->value() * 100) . ")\n";
|
||||
echo " 4. Queue Overload: " . ($result4->isAnomalous ? "🚨 ANOMALOUS" : "NORMAL") . " (" . sprintf("%.2f%%", $result4->anomalyScore->value() * 100) . ")\n\n";
|
||||
|
||||
echo "=== Queue Anomaly Integration Test PASSED ===\n";
|
||||
|
||||
} catch (\Throwable $e) {
|
||||
echo "\n!!! TEST FAILED !!!\n";
|
||||
echo "Error: " . $e->getMessage() . "\n";
|
||||
echo "File: " . $e->getFile() . ":" . $e->getLine() . "\n";
|
||||
echo "\nStack trace:\n" . $e->getTraceAsString() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
Reference in New Issue
Block a user