Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 73
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 / 73
0.00% covered (danger)
0.00%
0 / 1
156
0.00% covered (danger)
0.00%
0 / 1
 index
0.00% covered (danger)
0.00%
0 / 73
0.00% covered (danger)
0.00%
0 / 1
156
1<?php
2
3namespace App\Http\Controllers;
4
5use Illuminate\Support\Facades\DB;
6use Illuminate\Support\Facades\Http;
7use Illuminate\Support\Facades\Redis;
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        // Node Sidecar check
78        $statuses['node_sidecar'] = [
79            'status' => 'OK',
80            'message' => 'Node sidecar is running!',
81        ];
82
83        try {
84            $sidecarUrl = env('NODE_SIDECAR_URL', 'http://127.0.0.1:3000');
85            $response = Http::timeout(2)->get($sidecarUrl . '/api/health');
86
87            if ($response->successful()) {
88                $statuses['node_sidecar']['message'] = $response->json('status', 'healthy');
89            } else {
90                $statuses['node_sidecar']['status'] = 'Fail';
91                $statuses['node_sidecar']['message'] = 'Node sidecar returned non-OK response';
92                $statuses['application']['status'] = 'Partial Fail';
93                $statuses['application']['message'] = 'One or more services failed';
94            }
95        } catch (\Exception $e) {
96            $statuses['node_sidecar']['status'] = 'Fail';
97            $statuses['node_sidecar']['message'] = 'Node sidecar is not responding';
98            $statuses['application']['status'] = 'Partial Fail';
99            $statuses['application']['message'] = 'One or more services failed';
100        }
101
102        // Ajusta o status geral da aplicação
103        if ($statuses['mongodb']['status'] === 'Fail' && $statuses['redis']['status'] === 'Fail') {
104            $statuses['application']['status'] = 'Fail';
105            $statuses['application']['message'] = 'Both MongoDB and Redis connections failed';
106        } elseif ($statuses['mongodb']['status'] === 'OK' && $statuses['redis']['status'] === 'OK') {
107            $statuses['application']['status'] = 'OK';
108            $statuses['application']['message'] = 'All systems operational';
109        }
110
111        $httpStatus = ($statuses['application']['status'] === 'OK') ? 200 : 207;
112
113        return response()->json($statuses, $httpStatus);
114    }
115}