Files
michaelschiemer/tests/debug/test-job-anomaly-detection.php
Michael Schiemer 3b623e7afb 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
2025-10-26 14:08:07 +01:00

228 lines
9.6 KiB
PHP

<?php
declare(strict_types=1);
/**
* Manual Test for Job Anomaly Detection
*
* Tests JobAnomalyDetector with various job behavior patterns
*/
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 "=== Job Anomaly Detection Test ===\n\n";
try {
// Initialize detector with default thresholds
$detector = new JobAnomalyDetector(
anomalyThreshold: new Score(0.5), // 50% threshold
zScoreThreshold: 3.0,
iqrMultiplier: 1.5
);
echo "1. Testing Normal Job Behavior (Baseline)\n";
echo " → All features at baseline (low values)\n";
$normalFeatures = new JobFeatures(
executionTimeVariance: 0.1, // Low variance
memoryUsagePattern: 0.1, // Stable memory
retryFrequency: 0.0, // No retries
failureRate: 0.0, // No failures
queueDepthCorrelation: 0.2, // Low impact
dependencyChainComplexity: 0.1, // Simple
payloadSizeAnomaly: 0.0, // Normal size
executionTimingRegularity: 0.3 // Somewhat regular
);
$result = $detector->detect($normalFeatures);
echo " Result: " . ($result->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
echo " Confidence: " . sprintf("%.2f%%", $result->anomalyScore->value() * 100) . "\n";
echo " Risk Level: {$result->getSeverity()}\n";
if ($result->isAnomalous) {
echo " Primary Indicator: {$result->primaryIndicator}\n";
echo " Detected Patterns: " . count($result->detectedPatterns) . "\n";
}
echo "\n";
echo "2. Testing High Failure Risk Pattern\n";
echo " → High failure rate + frequent retries\n";
$highFailureFeatures = new JobFeatures(
executionTimeVariance: 0.3,
memoryUsagePattern: 0.2,
retryFrequency: 0.8, // Very high retries
failureRate: 0.7, // High failure rate
queueDepthCorrelation: 0.3,
dependencyChainComplexity: 0.2,
payloadSizeAnomaly: 0.1,
executionTimingRegularity: 0.2
);
$result = $detector->detect($highFailureFeatures);
echo " Result: " . ($result->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
echo " Confidence: " . sprintf("%.2f%%", $result->anomalyScore->value() * 100) . "\n";
echo " Risk Level: {$result->getSeverity()}\n";
if ($result->isAnomalous) {
echo " Primary Indicator: {$result->primaryIndicator}\n";
echo " Detected Patterns:\n";
foreach ($result->detectedPatterns as $pattern) {
echo " - {$pattern['type']}: " . sprintf("%.2f%% confidence", $pattern['confidence']->value() * 100) . "\n";
echo " {$pattern['description']}\n";
}
}
echo "\n";
echo "3. Testing Performance Degradation Pattern\n";
echo " → High execution variance + memory issues\n";
$performanceIssueFeatures = new JobFeatures(
executionTimeVariance: 0.85, // Very unstable
memoryUsagePattern: 0.75, // Memory anomalies
retryFrequency: 0.2,
failureRate: 0.15,
queueDepthCorrelation: 0.4,
dependencyChainComplexity: 0.3,
payloadSizeAnomaly: 0.2,
executionTimingRegularity: 0.3
);
$result = $detector->detect($performanceIssueFeatures);
echo " Result: " . ($result->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
echo " Confidence: " . sprintf("%.2f%%", $result->anomalyScore->value() * 100) . "\n";
echo " Risk Level: {$result->getSeverity()}\n";
if ($result->isAnomalous) {
echo " Primary Indicator: {$result->primaryIndicator}\n";
echo " Detected Patterns:\n";
foreach ($result->detectedPatterns as $pattern) {
echo " - {$pattern['type']}: " . sprintf("%.2f%% confidence", $pattern['confidence']->value() * 100) . "\n";
echo " {$pattern['description']}\n";
}
}
echo "\n";
echo "4. Testing Bot-like Automated Execution Pattern\n";
echo " → Very regular timing + low variance\n";
$botFeatures = new JobFeatures(
executionTimeVariance: 0.05, // Very stable (suspicious)
memoryUsagePattern: 0.1,
retryFrequency: 0.0,
failureRate: 0.0,
queueDepthCorrelation: 0.1,
dependencyChainComplexity: 0.1,
payloadSizeAnomaly: 0.05,
executionTimingRegularity: 0.95 // Extremely regular (bot-like)
);
$result = $detector->detect($botFeatures);
echo " Result: " . ($result->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
echo " Confidence: " . sprintf("%.2f%%", $result->anomalyScore->value() * 100) . "\n";
echo " Risk Level: {$result->getSeverity()}\n";
if ($result->isAnomalous) {
echo " Primary Indicator: {$result->primaryIndicator}\n";
echo " Detected Patterns:\n";
foreach ($result->detectedPatterns as $pattern) {
echo " - {$pattern['type']}: " . sprintf("%.2f%% confidence", $pattern['confidence']->value() * 100) . "\n";
echo " {$pattern['description']}\n";
}
}
echo "\n";
echo "5. Testing Resource Exhaustion Pattern\n";
echo " → High queue depth correlation + memory issues\n";
$resourceExhaustionFeatures = new JobFeatures(
executionTimeVariance: 0.4,
memoryUsagePattern: 0.8, // High memory anomalies
retryFrequency: 0.3,
failureRate: 0.25,
queueDepthCorrelation: 0.85, // Very high queue impact
dependencyChainComplexity: 0.5,
payloadSizeAnomaly: 0.3,
executionTimingRegularity: 0.2
);
$result = $detector->detect($resourceExhaustionFeatures);
echo " Result: " . ($result->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
echo " Confidence: " . sprintf("%.2f%%", $result->anomalyScore->value() * 100) . "\n";
echo " Risk Level: {$result->getSeverity()}\n";
if ($result->isAnomalous) {
echo " Primary Indicator: {$result->primaryIndicator}\n";
echo " Detected Patterns:\n";
foreach ($result->detectedPatterns as $pattern) {
echo " - {$pattern['type']}: " . sprintf("%.2f%% confidence", $pattern['confidence']->value() * 100) . "\n";
echo " {$pattern['description']}\n";
}
}
echo "\n";
echo "6. Testing Data Processing Anomaly Pattern\n";
echo " → Unusual payload sizes + memory anomalies\n";
$dataAnomalyFeatures = new JobFeatures(
executionTimeVariance: 0.3,
memoryUsagePattern: 0.7, // Memory issues
retryFrequency: 0.2,
failureRate: 0.1,
queueDepthCorrelation: 0.3,
dependencyChainComplexity: 0.2,
payloadSizeAnomaly: 0.9, // Very unusual payload
executionTimingRegularity: 0.3
);
$result = $detector->detect($dataAnomalyFeatures);
echo " Result: " . ($result->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
echo " Confidence: " . sprintf("%.2f%%", $result->anomalyScore->value() * 100) . "\n";
echo " Risk Level: {$result->getSeverity()}\n";
if ($result->isAnomalous) {
echo " Primary Indicator: {$result->primaryIndicator}\n";
echo " Detected Patterns:\n";
foreach ($result->detectedPatterns as $pattern) {
echo " - {$pattern['type']}: " . sprintf("%.2f%% confidence", $pattern['confidence']->value() * 100) . "\n";
echo " {$pattern['description']}\n";
}
}
echo "\n";
echo "7. Testing Complex Multi-Pattern Anomaly\n";
echo " → Multiple issues: high failures + performance + resource issues\n";
$complexAnomalyFeatures = new JobFeatures(
executionTimeVariance: 0.75, // High variance
memoryUsagePattern: 0.8, // Memory anomalies
retryFrequency: 0.6, // High retries
failureRate: 0.5, // High failures
queueDepthCorrelation: 0.7, // High queue impact
dependencyChainComplexity: 0.6, // Complex dependencies
payloadSizeAnomaly: 0.5, // Payload anomalies
executionTimingRegularity: 0.2
);
$result = $detector->detect($complexAnomalyFeatures);
echo " Result: " . ($result->isAnomalous ? "🚨 ANOMALOUS" : "✓ NORMAL") . "\n";
echo " Confidence: " . sprintf("%.2f%%", $result->anomalyScore->value() * 100) . "\n";
echo " Risk Level: {$result->getSeverity()}\n";
if ($result->isAnomalous) {
echo " Primary Indicator: {$result->primaryIndicator}\n";
echo " Feature Scores:\n";
foreach ($result->featureScores as $featureName => $score) {
if ($score->value() > 0.3) { // Only show significant scores
echo " - {$featureName}: " . sprintf("%.2f%%", $score->value() * 100) . "\n";
}
}
echo " Detected Patterns:\n";
foreach ($result->detectedPatterns as $pattern) {
echo " - {$pattern['type']}: " . sprintf("%.2f%% confidence", $pattern['confidence']->value() * 100) . "\n";
echo " {$pattern['description']}\n";
}
}
echo "\n";
echo "=== Job Anomaly Detection Test Completed ===\n";
echo "✓ All test scenarios executed successfully\n";
} catch (\Throwable $e) {
echo "\n!!! FATAL ERROR !!!\n";
echo "Error: " . $e->getMessage() . "\n";
echo "File: " . $e->getFile() . ":" . $e->getLine() . "\n";
echo "\nStack trace:\n" . $e->getTraceAsString() . "\n";
exit(1);
}