Files
michaelschiemer/examples/action-profiling-usage.php
Michael Schiemer fc3d7e6357 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.
2025-10-25 19:18:37 +02:00

310 lines
9.7 KiB
PHP

<?php
declare(strict_types=1);
/**
* LiveComponent Action Profiling Usage Examples
*
* Dieses Script demonstriert die erweiterten Action-Profiling-Funktionen
* mit dem ActionProfiler für detaillierte Performance-Analyse.
*
* Ausführung: php examples/action-profiling-usage.php
*/
require_once __DIR__ . '/../vendor/autoload.php';
use App\Framework\Performance\NestedPerformanceTracker;
use App\Framework\LiveComponents\Performance\ActionProfiler;
use App\Framework\LiveComponents\ValueObjects\ComponentId;
use App\Framework\DateTime\SystemClock;
use App\Framework\DateTime\SystemHighResolutionClock;
use App\Framework\Performance\MemoryMonitor;
// Initialize tracker and profiler
$tracker = new NestedPerformanceTracker(
new SystemClock(),
new SystemHighResolutionClock(),
new MemoryMonitor()
);
$profiler = new ActionProfiler($tracker);
echo "=== LiveComponent Action Profiling Examples ===\n\n";
// Example 1: Profiling einzelner Action Execution
echo "Example 1: Detailed Action Execution Profiling\n";
echo str_repeat('-', 50) . "\n";
$componentId = ComponentId::create('counter', 'demo-123');
// Simuliere vollständige Action Execution mit allen Sicherheits-Checks
$profiler->profileCsrfValidation(
$componentId,
'increment',
function () {
usleep(200); // 0.2ms - CSRF validation
}
);
$profiler->profileAuthorizationCheck(
$componentId,
'increment',
function () {
usleep(300); // 0.3ms - Authorization check
}
);
$profiler->profileRateLimitCheck(
$componentId,
'increment',
function () {
usleep(150); // 0.15ms - Rate limit check
}
);
$profiler->profileParameterBinding(
$componentId,
'increment',
function () {
usleep(400); // 0.4ms - Parameter binding with reflection
return ['value' => 1];
}
);
// Haupte Action execution (simuliert in executeActionAndBuildUpdate)
$tracker->measure(
"livecomponent.counter.increment",
\App\Framework\Performance\PerformanceCategory::CUSTOM,
function () use ($tracker) {
$tracker->measure(
"livecomponent.action.execute",
\App\Framework\Performance\PerformanceCategory::CUSTOM,
function () {
usleep(2000); // 2ms - Business logic
}
);
$tracker->measure(
"livecomponent.state.validate",
\App\Framework\Performance\PerformanceCategory::CUSTOM,
function () {
usleep(500); // 0.5ms - State validation
}
);
},
['component' => 'counter', 'action' => 'increment']
);
echo "\nAction Execution Timeline:\n";
$timeline = $tracker->generateTimeline();
foreach ($timeline as $event) {
$indent = str_repeat(' ', $event['depth']);
echo sprintf(
" %s[%s] %s (%.2fms)\n",
$indent,
$event['category'],
$event['name'],
$event['duration_ms']
);
}
echo "\n" . str_repeat('=', 50) . "\n\n";
// Example 2: Action Metrics Analysis
echo "Example 2: Action Metrics Analysis\n";
echo str_repeat('-', 50) . "\n";
// Simuliere mehrere Action Executions
for ($i = 0; $i < 3; $i++) {
$profiler->profileCsrfValidation($componentId, 'increment', fn() => usleep(200));
$profiler->profileAuthorizationCheck($componentId, 'increment', fn() => usleep(300));
$profiler->profileParameterBinding($componentId, 'increment', fn() => usleep(400));
$tracker->measure(
"livecomponent.counter.increment",
\App\Framework\Performance\PerformanceCategory::CUSTOM,
function () use ($tracker) {
$tracker->measure("livecomponent.action.execute", \App\Framework\Performance\PerformanceCategory::CUSTOM, fn() => usleep(2000));
$tracker->measure("livecomponent.state.validate", \App\Framework\Performance\PerformanceCategory::CUSTOM, fn() => usleep(500));
},
['component' => 'counter', 'action' => 'increment']
);
}
$metrics = $profiler->getActionMetrics('counter', 'increment');
echo "\nAction Metrics for counter.increment:\n";
echo " Executions: {$metrics['executions']}\n";
echo " Total Time: " . number_format($metrics['total_time_ms'], 2) . "ms\n";
echo " Avg Time per Execution: " . number_format($metrics['avg_time_per_execution_ms'], 2) . "ms\n";
echo "\n Phase Timings:\n";
foreach ($metrics['phase_timings'] as $phase => $timing) {
echo sprintf(
" • %s: %.2fms avg (%d calls)\n",
$phase,
$timing['avg_ms'],
$timing['count']
);
}
echo "\n" . str_repeat('=', 50) . "\n\n";
// Example 3: Component Summary
echo "Example 3: Component Performance Summary\n";
echo str_repeat('-', 50) . "\n";
$tracker->reset();
// Simuliere verschiedene Operations für mehrere Components
$components = ['counter', 'search', 'user-card'];
$actions = ['increment', 'updateQuery', 'refresh'];
foreach ($components as $index => $componentName) {
$compId = ComponentId::create($componentName, "instance-{$index}");
$action = $actions[$index];
// Simuliere 2-3 Action executions
for ($i = 0; $i < rand(2, 3); $i++) {
$profiler->profileCsrfValidation($compId, $action, fn() => usleep(rand(150, 250)));
$profiler->profileAuthorizationCheck($compId, $action, fn() => usleep(rand(250, 350)));
$tracker->measure(
"livecomponent.{$componentName}.{$action}",
\App\Framework\Performance\PerformanceCategory::CUSTOM,
function () use ($tracker) {
$tracker->measure("livecomponent.action.execute", \App\Framework\Performance\PerformanceCategory::CUSTOM, fn() => usleep(rand(1500, 2500)));
},
['component' => $componentName, 'action' => $action]
);
}
}
echo "\nComponent Performance Summaries:\n\n";
foreach ($components as $componentName) {
$summary = $profiler->getComponentSummary($componentName);
echo " {$summary['component']}:\n";
echo " Total Operations: {$summary['total_operations']}\n";
echo " Total Time: " . number_format($summary['total_time_ms'], 2) . "ms\n";
echo " Operations:\n";
foreach ($summary['operations'] as $opName => $stats) {
echo sprintf(
" • %s: %.2fms avg (min: %.2fms, max: %.2fms, count: %d)\n",
basename($opName),
$stats['avg_time_ms'],
$stats['min_time_ms'],
$stats['max_time_ms'],
$stats['count']
);
}
echo "\n";
}
echo str_repeat('=', 50) . "\n\n";
// Example 4: System-Wide Performance Report
echo "Example 4: System-Wide Performance Report\n";
echo str_repeat('-', 50) . "\n";
$report = $profiler->generatePerformanceReport();
echo "\nSystem-Wide Performance Report\n";
echo " Generated at: {$report['generated_at']}\n";
echo " Total Components: {$report['total_components']}\n";
echo " Total Operations: {$report['total_operations']}\n\n";
echo " Component Breakdown:\n";
foreach ($report['components'] as $componentName => $data) {
echo " {$componentName}:\n";
echo " Operations: {$data['operations']}\n";
echo " Total Time: " . number_format($data['total_time_ms'], 2) . "ms\n";
echo " Actions: " . implode(', ', array_keys($data['actions'])) . "\n";
echo "\n";
}
echo str_repeat('=', 50) . "\n\n";
// Example 5: Profiling mit Idempotency
echo "Example 5: Idempotency Profiling\n";
echo str_repeat('-', 50) . "\n";
$tracker->reset();
$componentId = ComponentId::create('payment', 'order-456');
// Erste Ausführung - kein Cache
$profiler->profileIdempotencyCheck(
$componentId,
'processPayment',
function () {
usleep(500); // 0.5ms - Check cache, not found
return null;
}
);
$tracker->measure(
"livecomponent.payment.processPayment",
\App\Framework\Performance\PerformanceCategory::CUSTOM,
function () use ($tracker) {
$tracker->measure("livecomponent.action.execute", \App\Framework\Performance\PerformanceCategory::CUSTOM, fn() => usleep(5000)); // 5ms - Actual processing
},
['component' => 'payment', 'action' => 'processPayment']
);
// Zweite Ausführung - Cache Hit
$profiler->profileIdempotencyCheck(
$componentId,
'processPayment',
function () {
usleep(200); // 0.2ms - Cache hit, return cached result
return ['cached' => true];
}
);
echo "\nIdempotency Profiling Timeline:\n";
$idempotencyTimeline = $tracker->generateTimeline();
foreach ($idempotencyTimeline as $event) {
$indent = str_repeat(' ', $event['depth']);
echo sprintf(
" %s[%s] %s (%.2fms)\n",
$indent,
$event['category'],
$event['name'],
$event['duration_ms']
);
}
echo "\n 💡 Cache hit reduced execution from 5.5ms to 0.2ms (96% faster)\n";
echo "\n" . str_repeat('=', 50) . "\n\n";
// Summary
echo "✅ Action Profiling Examples completed!\n\n";
echo "Key Insights:\n";
echo " • Security checks (CSRF, Auth, Rate Limit) add ~0.5-0.7ms overhead\n";
echo " • Parameter binding with reflection typically ~0.4ms\n";
echo " • Action execution is the main bottleneck (varies by business logic)\n";
echo " • Idempotency caching can provide 90%+ performance improvement\n";
echo " • ActionProfiler provides detailed metrics for optimization\n\n";
echo "Use Cases:\n";
echo " 1. Identify slow security checks\n";
echo " 2. Optimize parameter binding for complex DTOs\n";
echo " 3. Monitor action execution performance over time\n";
echo " 4. Validate idempotency cache effectiveness\n";
echo " 5. Generate system-wide performance reports\n\n";
echo "Next Steps:\n";
echo " 1. Integrate ActionProfiler into production monitoring\n";
echo " 2. Set performance budgets for each action phase\n";
echo " 3. Alert on performance degradation\n";
echo " 4. Use metrics for optimization priority\n\n";