feat: VM metrics via portal-monitor integration

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
baodev0
2026-10-17 13:04:35 +07:00
co-authored by Claude Sonnet 5.5
parent 0b08689ea4
commit 9ed77a85fd
15 changed files with 546 additions and 43 deletions
@@ -0,0 +1,41 @@
<?php
namespace App\Http\Controllers\Api\Service\Concerns;
use App\Models\VirtualMachines;
use App\Services\VmMetricsService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use RuntimeException;
trait ManagesVmMetrics
{
public function metrics(Request $request, VmMetricsService $metricsService): JsonResponse
{
$productId = $request->input('product');
if (!$productId) {
return response()->json(['success' => false, 'message' => 'Thiếu product id.'], 422);
}
$vm = $this->resolveVmById($productId, $request, requireActiveService: false);
if ($vm instanceof JsonResponse) {
return $vm;
}
try {
$inventory = VirtualMachines::where('vm_id', $vm->vmware_id)->first(['ram_mb', 'cpu']);
$metrics = $metricsService->get((string) $vm->vmware_id, $inventory?->ram_mb, $inventory?->cpu);
} catch (RuntimeException $exception) {
$status = $exception->getCode() === 404 ? 404 : 502;
return response()->json([
'success' => false,
'message' => $status === 404
? 'Chưa có dữ liệu giám sát cho VM.'
: 'Không thể tải dữ liệu giám sát VM.',
], $status);
}
return response()->json(['success' => true, 'data' => $metrics]);
}
}
@@ -12,6 +12,7 @@ use Illuminate\Support\Facades\Cache;
use App\Http\Controllers\Api\Service\Concerns\ManagesVmPower;
use App\Http\Controllers\Api\Service\Concerns\ManagesVmNetwork;
use App\Http\Controllers\Api\Service\Concerns\ManagesVmAccess;
use App\Http\Controllers\Api\Service\Concerns\ManagesVmMetrics;
class VmController extends Controller
{
@@ -19,6 +20,7 @@ class VmController extends Controller
use ManagesVmPower;
use ManagesVmNetwork;
use ManagesVmAccess;
use ManagesVmMetrics;
public function __construct(protected ActivityLogger $activityLogger) {}
// -------------------------------------------------------------------------