Queue-Metrics Integration
Queue-Metrics Integration
Laravel Queue Monitor is built on top of laravel-queue-metrics and automatically integrates with its event system for enhanced resource tracking.
How Integration Works
The integration happens through event subscription:
laravel-queue-metrics fires MetricsRecorded event
↓
QueueMetricsSubscriber listens
↓
UpdateJobMetricsAction extracts data
↓
JobMonitorRepository updates job record
↓
CPU, memory, FD metrics stored
Metrics Captured
CPU Time
Source: ProcessMetrics tracking in queue-metrics
Field: cpu_time_ms (decimal)
Calculation: User + System CPU time in milliseconds
$job = QueueMonitor::getJob($uuid);
echo "CPU Time: {$job->cpu_time_ms}ms";
Memory Peak
Source: ProcessMetrics tracking in queue-metrics
Field: memory_peak_mb (decimal)
Includes: Parent + child process memory
echo "Peak Memory: {$job->memory_peak_mb}MB";
File Descriptors
Source: Custom metrics from queue-metrics (if available)
Field: file_descriptors (integer)
Note: May not be available on all systems
if ($job->file_descriptors !== null) {
echo "File Descriptors: {$job->file_descriptors}";
}
Event Flow
1. Job Processing
// Laravel Queue fires JobProcessing event
// queue-monitor records job start
// queue-metrics starts ProcessMetrics tracking
ProcessMetrics::start("job_{$jobId}");
2. Job Completion
// Job finishes executing
// queue-metrics stops tracking and fires MetricsRecorded
ProcessMetrics::stop("job_{$jobId}");
event(new MetricsRecorded($metricsData));
// queue-monitor receives event
QueueMetricsSubscriber::handleMetricsRecorded($event);
// Metrics extracted and stored
UpdateJobMetricsAction::execute($metricsData, $jobId);
3. Data Storage
The UpdateJobMetricsAction extracts relevant metrics from the JobMetricsData DTO and updates the job record:
$this->repository->update($jobMonitor->uuid, [
'cpu_time_ms' => $metricsData->execution->cpuTimeMs,
'memory_peak_mb' => $metricsData->memory->peakMb,
'file_descriptors' => $metricsData->fileDescriptors ?? null,
]);
Accessing Metrics
Via Model
use Cbox\LaravelQueueMonitor\Models\JobMonitor;
$job = JobMonitor::find($id);
echo "CPU: {$job->cpu_time_ms}ms\n";
echo "Memory: {$job->memory_peak_mb}MB\n";
echo "Duration: {$job->duration_ms}ms\n";
Via Facade
use Cbox\LaravelQueueMonitor\Facades\LaravelQueueMonitor as QueueMonitor;
$job = QueueMonitor::getJob($uuid);
if ($job->cpu_time_ms !== null) {
$cpuEfficiency = ($job->cpu_time_ms / $job->duration_ms) * 100;
echo "CPU Efficiency: {$cpuEfficiency}%\n";
}
Via API
curl /api/queue-monitor/jobs/{uuid}
Response includes metrics:
{
"data": {
"uuid": "...",
"metrics": {
"cpu_time_ms": 245.50,
"memory_peak_mb": 48.25,
"file_descriptors": 15,
"duration_ms": 1250,
"duration_seconds": 1.25
}
}
}
Analytics with Metrics
Statistics endpoints automatically include metric aggregations:
$stats = QueueMonitor::statistics();
echo "Avg CPU Time: {$stats['avg_cpu_time_ms']}ms\n";
echo "Max Memory: {$stats['max_memory_mb']}MB\n";
echo "Avg Duration: {$stats['avg_duration_ms']}ms\n";
Performance Analysis
Slow Jobs
Find jobs with high resource usage:
use Cbox\LaravelQueueMonitor\Models\JobMonitor;
// High CPU jobs
$cpuIntensive = JobMonitor::where('cpu_time_ms', '>', 1000)
->orderByDesc('cpu_time_ms')
->get();
// High memory jobs
$memoryIntensive = JobMonitor::where('memory_peak_mb', '>', 100)
->orderByDesc('memory_peak_mb')
->get();
// Slow jobs
$slowJobs = JobMonitor::slowJobs(5000) // > 5 seconds
->get();
Per-Queue Resource Usage
$queueStats = QueueMonitor::serverStatistics();
foreach ($queueStats as $stat) {
echo "Queue: {$stat['queue']}\n";
echo "Avg Duration: {$stat['avg_duration_ms']}ms\n";
echo "Total Jobs: {$stat['total']}\n";
}
Configuration
Metrics Collection
Queue-metrics has its own configuration for metrics collection:
// config/queue-metrics.php
'telemetry' => [
'enabled' => true,
'sample_rate' => 1.0, // Collect metrics for all jobs
],
Integration Settings
Queue-monitor automatically subscribes to metrics events if queue-metrics is installed:
// No configuration needed - automatic integration
Troubleshooting
Metrics Not Appearing
-
Verify queue-metrics is installed:
composer show cboxdk/laravel-queue-metrics -
Check metrics collection is enabled:
config('queue-metrics.enabled'); // Should be true -
Verify events are firing:
Event::listen(MetricsRecorded::class, function($event) { Log::info('Metrics recorded', ['data' => $event->metricsData]); });
Partial Metrics
Some metrics may be unavailable on certain systems:
- File descriptors: Requires system support
- CPU time: Available on most *nix systems
- Memory: Always available via PHP
Performance Impact
Metrics collection has minimal overhead:
- CPU tracking: <1% overhead
- Memory tracking: <0.1% overhead
- Sample rate can be adjusted to reduce load
Best Practices
- Enable in all environments - Metrics are valuable in dev, staging, and production
- Use sample rates in high-traffic - Reduce overhead with sampling
- Monitor the monitors - Track queue-monitor's own performance
- Correlate with application metrics - Combine with APM tools
- Set up alerts - React to resource anomalies automatically