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