|
16 | 16 | config()->set('queue-metrics.enabled', true); |
17 | 17 | config()->set('queue-metrics.storage.driver', 'redis'); |
18 | 18 | config()->set('queue-metrics.storage.connection', 'default'); |
| 19 | + |
| 20 | + // Flush Redis before each test to ensure clean state |
| 21 | + \Illuminate\Support\Facades\Redis::connection('default')->flushdb(); |
19 | 22 | }); |
20 | 23 |
|
21 | 24 | it('calculates queue metrics from job metrics', function () { |
|
28 | 31 | $jobRepo = app(JobMetricsRepository::class); |
29 | 32 | $queueRepo = app(QueueMetricsRepository::class); |
30 | 33 |
|
31 | | - // Mark jobs as discovered |
32 | | - $jobRepo->markJobDiscovered($jobClass1, $connection, $queue); |
33 | | - $jobRepo->markJobDiscovered($jobClass2, $connection, $queue); |
34 | | - |
35 | 34 | // Mark queue as discovered |
36 | 35 | $queueRepo->markQueueDiscovered($connection, $queue); |
37 | 36 |
|
38 | 37 | // Record job completions for job 1: 10 jobs, 100ms avg duration |
| 38 | + // Note: recordStart() now handles job discovery atomically |
39 | 39 | for ($i = 0; $i < 10; $i++) { |
| 40 | + $jobId = "job-1-{$i}"; |
| 41 | + $jobRepo->recordStart($jobId, $jobClass1, $connection, $queue, \Carbon\Carbon::now()); |
40 | 42 | $jobRepo->recordCompletion( |
| 43 | + jobId: $jobId, |
41 | 44 | jobClass: $jobClass1, |
42 | 45 | connection: $connection, |
43 | 46 | queue: $queue, |
44 | 47 | durationMs: 100.0, |
45 | 48 | memoryMb: 10.0, |
46 | 49 | cpuTimeMs: 50.0, |
| 50 | + completedAt: \Carbon\Carbon::now(), |
47 | 51 | ); |
48 | 52 | } |
49 | 53 |
|
50 | 54 | // Record job completions for job 2: 5 jobs, 200ms avg duration |
51 | 55 | for ($i = 0; $i < 5; $i++) { |
| 56 | + $jobId = "job-2-{$i}"; |
| 57 | + $jobRepo->recordStart($jobId, $jobClass2, $connection, $queue, \Carbon\Carbon::now()); |
52 | 58 | $jobRepo->recordCompletion( |
| 59 | + jobId: $jobId, |
53 | 60 | jobClass: $jobClass2, |
54 | 61 | connection: $connection, |
55 | 62 | queue: $queue, |
56 | 63 | durationMs: 200.0, |
57 | 64 | memoryMb: 15.0, |
58 | 65 | cpuTimeMs: 75.0, |
| 66 | + completedAt: \Carbon\Carbon::now(), |
59 | 67 | ); |
60 | 68 | } |
61 | 69 |
|
|
70 | 78 |
|
71 | 79 | // Weighted average duration: (10 * 100 + 5 * 200) / 15 = 133.33ms |
72 | 80 | $expectedAvgDuration = (10 * 100.0 + 5 * 200.0) / 15; |
73 | | - expect($metrics['avg_duration'])->toBe($expectedAvgDuration); |
| 81 | + expect($metrics['avg_duration'])->toEqualWithDelta($expectedAvgDuration, 0.01); |
74 | 82 |
|
75 | 83 | // Throughput should be sum of both job classes |
76 | 84 | expect($metrics['throughput_per_minute'])->toBeGreaterThan(0.0); |
|
107 | 115 | $jobRepo = app(JobMetricsRepository::class); |
108 | 116 | $queueRepo = app(QueueMetricsRepository::class); |
109 | 117 |
|
110 | | - $jobRepo->markJobDiscovered($jobClass, $connection, $queue); |
111 | 118 | $queueRepo->markQueueDiscovered($connection, $queue); |
112 | 119 |
|
113 | 120 | // Record 7 successful completions |
| 121 | + // Note: recordStart() now handles job discovery atomically |
114 | 122 | for ($i = 0; $i < 7; $i++) { |
| 123 | + $jobId = "job-success-{$i}"; |
| 124 | + $jobRepo->recordStart($jobId, $jobClass, $connection, $queue, \Carbon\Carbon::now()); |
115 | 125 | $jobRepo->recordCompletion( |
| 126 | + jobId: $jobId, |
116 | 127 | jobClass: $jobClass, |
117 | 128 | connection: $connection, |
118 | 129 | queue: $queue, |
119 | 130 | durationMs: 100.0, |
120 | 131 | memoryMb: 10.0, |
121 | 132 | cpuTimeMs: 50.0, |
| 133 | + completedAt: \Carbon\Carbon::now(), |
122 | 134 | ); |
123 | 135 | } |
124 | 136 |
|
125 | 137 | // Record 3 failures |
126 | 138 | for ($i = 0; $i < 3; $i++) { |
127 | 139 | $jobRepo->recordFailure( |
| 140 | + jobId: "job-failure-{$i}", |
128 | 141 | jobClass: $jobClass, |
129 | 142 | connection: $connection, |
130 | 143 | queue: $queue, |
131 | 144 | exception: 'Test exception', |
132 | | - failedAt: time(), |
| 145 | + failedAt: \Carbon\Carbon::now(), |
133 | 146 | ); |
134 | 147 | } |
135 | 148 |
|
|
156 | 169 | foreach ($queues as $q) { |
157 | 170 | $queueRepo->markQueueDiscovered($q['connection'], $q['queue']); |
158 | 171 | $jobClass = 'App\\Jobs\\TestJob'.ucfirst($q['queue']); |
159 | | - $jobRepo->markJobDiscovered($jobClass, $q['connection'], $q['queue']); |
160 | 172 |
|
161 | 173 | // Record some completions |
| 174 | + // Note: recordStart() now handles job discovery atomically |
| 175 | + $jobId = "job-{$q['queue']}-1"; |
| 176 | + $jobRepo->recordStart($jobId, $jobClass, $q['connection'], $q['queue'], \Carbon\Carbon::now()); |
162 | 177 | $jobRepo->recordCompletion( |
| 178 | + jobId: $jobId, |
163 | 179 | jobClass: $jobClass, |
164 | 180 | connection: $q['connection'], |
165 | 181 | queue: $q['queue'], |
166 | 182 | durationMs: 150.0, |
167 | 183 | memoryMb: 12.0, |
168 | 184 | cpuTimeMs: 60.0, |
| 185 | + completedAt: \Carbon\Carbon::now(), |
169 | 186 | ); |
170 | 187 | } |
171 | 188 |
|
|
178 | 195 | foreach ($queues as $q) { |
179 | 196 | $metrics = $queueRepo->getLatestMetrics($q['connection'], $q['queue']); |
180 | 197 | expect($metrics)->not()->toBeEmpty(); |
181 | | - expect($metrics['avg_duration'])->toBe(150.0); |
| 198 | + expect($metrics['avg_duration'])->toEqualWithDelta(150.0, 0.01); |
182 | 199 | } |
183 | 200 | })->group('redis'); |
184 | 201 |
|
|
191 | 208 | $queueRepo = app(QueueMetricsRepository::class); |
192 | 209 |
|
193 | 210 | $queueRepo->markQueueDiscovered($connection, $queue); |
194 | | - $jobRepo->markJobDiscovered($jobClass, $connection, $queue); |
195 | 211 |
|
| 212 | + // Record job completion |
| 213 | + // Note: recordStart() now handles job discovery atomically |
| 214 | + $jobId = 'job-specific-1'; |
| 215 | + $jobRepo->recordStart($jobId, $jobClass, $connection, $queue, \Carbon\Carbon::now()); |
196 | 216 | $jobRepo->recordCompletion( |
| 217 | + jobId: $jobId, |
197 | 218 | jobClass: $jobClass, |
198 | 219 | connection: $connection, |
199 | 220 | queue: $queue, |
200 | 221 | durationMs: 250.0, |
201 | 222 | memoryMb: 20.0, |
202 | 223 | cpuTimeMs: 100.0, |
| 224 | + completedAt: \Carbon\Carbon::now(), |
203 | 225 | ); |
204 | 226 |
|
205 | 227 | // Execute command for specific queue |
|
211 | 233 | expect($exitCode)->toBe(0); |
212 | 234 |
|
213 | 235 | $metrics = $queueRepo->getLatestMetrics($connection, $queue); |
214 | | - expect($metrics['avg_duration'])->toBe(250.0); |
| 236 | + expect($metrics['avg_duration'])->toEqualWithDelta(250.0, 0.01); |
215 | 237 | })->group('redis'); |
216 | 238 |
|
217 | 239 | it('command fails when queue specified without connection', function () { |
|
0 commit comments