Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 53 |
|
0.00% |
0 / 1 |
CRAP | |
0.00% |
0 / 1 |
HealthCheckController | |
0.00% |
0 / 53 |
|
0.00% |
0 / 1 |
110 | |
0.00% |
0 / 1 |
index | |
0.00% |
0 / 53 |
|
0.00% |
0 / 1 |
110 |
1 | <?php |
2 | |
3 | namespace App\Http\Controllers; |
4 | |
5 | use Illuminate\Support\Facades\DB; |
6 | use Illuminate\Support\Facades\Redis; |
7 | use Symfony\Component\Process\Process; |
8 | use Symfony\Component\Process\Exception\ProcessFailedException; |
9 | |
10 | class HealthCheckController extends Controller |
11 | { |
12 | public function index() |
13 | { |
14 | $statuses = [ |
15 | 'application' => [ |
16 | 'status' => 'OK', |
17 | 'message' => 'Application is running smoothly', |
18 | ], |
19 | 'mongodb' => [ |
20 | 'status' => 'OK', |
21 | 'message' => 'MongoDB connection established', |
22 | ], |
23 | 'redis' => [ |
24 | 'status' => 'OK', |
25 | 'message' => 'Redis connection established', |
26 | ], |
27 | 'queue' => [ |
28 | 'status' => 'OK', |
29 | 'count' => 0, |
30 | 'message' => 'Queue is operational', |
31 | ], |
32 | 'environment' => env('APP_ENV') ?? 'unknown', |
33 | ]; |
34 | |
35 | // Verificação do MongoDB |
36 | try { |
37 | DB::connection('mongodb')->getPdo(); |
38 | } catch (\Exception $e) { |
39 | $statuses['mongodb']['status'] = 'Fail'; |
40 | $statuses['mongodb']['message'] = 'MongoDB connection failed'; |
41 | $statuses['mongodb']['error'] = $e->getMessage(); |
42 | $statuses['application']['status'] = 'Partial Fail'; |
43 | $statuses['application']['message'] = 'One or more services failed'; |
44 | } |
45 | |
46 | // Verificação do Redis |
47 | try { |
48 | Redis::ping(); |
49 | $statuses['queue']['count'] = (Redis::llen('queues:default') ?? 0) + (Redis::llen('queues:high') ?? 0); |
50 | } catch (\Exception $e) { |
51 | $statuses['queue']['status'] = 'Fail'; |
52 | $statuses['queue']['message'] = 'Redis connection failed'; |
53 | $statuses['redis']['status'] = 'Fail'; |
54 | $statuses['redis']['message'] = 'Redis connection failed'; |
55 | $statuses['redis']['error'] = $e->getMessage(); |
56 | $statuses['application']['status'] = 'Partial Fail'; |
57 | $statuses['application']['message'] = 'One or more services failed'; |
58 | } |
59 | |
60 | try { |
61 | $queueRunning = $statuses['queue']['count'] < 100; |
62 | |
63 | if ($queueRunning) { |
64 | $statuses['queue']['status'] = 'OK'; |
65 | } else { |
66 | $statuses['queue']['status'] = 'ERROR'; |
67 | $statuses['queue']['message'] = 'Queue is not running'; |
68 | } |
69 | } catch (ProcessFailedException $exception) { |
70 | $statuses['queue']['status'] = 'ERROR'; |
71 | $statuses['queue']['message'] = $exception->getMessage(); |
72 | } |
73 | |
74 | // Ajusta o status geral da aplicação |
75 | if ($statuses['mongodb']['status'] === 'Fail' && $statuses['redis']['status'] === 'Fail') { |
76 | $statuses['application']['status'] = 'Fail'; |
77 | $statuses['application']['message'] = 'Both MongoDB and Redis connections failed'; |
78 | } elseif ($statuses['mongodb']['status'] === 'OK' && $statuses['redis']['status'] === 'OK') { |
79 | $statuses['application']['status'] = 'OK'; |
80 | $statuses['application']['message'] = 'All systems operational'; |
81 | } |
82 | |
83 | $httpStatus = ($statuses['application']['status'] === 'OK') ? 200 : 207; |
84 | |
85 | return response()->json($statuses, $httpStatus); |
86 | } |
87 | } |