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]); } public function metricsHistory(Request $request, VmMetricsService $metricsService): JsonResponse { $data = $request->validate([ 'product' => 'required|string', 'from' => 'nullable|date', 'to' => 'nullable|date|after:from', ]); $to = isset($data['to']) ? Carbon::parse($data['to']) : now(); $from = isset($data['from']) ? Carbon::parse($data['from']) : $to->copy()->subDay(); if ($from->diffInDays($to) > 31) { return response()->json(['success' => false, 'message' => 'Chỉ xem được tối đa 31 ngày mỗi lần.'], 422); } $vm = $this->resolveVmById($data['product'], $request, requireActiveService: false); if ($vm instanceof JsonResponse) { return $vm; } try { $points = $metricsService->history((string) $vm->vmware_id, $from, $to); } catch (RuntimeException $exception) { $status = $exception->getCode() === 404 ? 404 : 502; return response()->json(['success' => false, 'message' => 'Không thể tải lịch sử giám sát VM.'], $status); } return response()->json(['success' => true, 'data' => $points]); } }