@@ -3326,20 +3326,133 @@ public function deleteDiskType(string $node, string $type, $name)
33263326 * QEMU monitor commands...
33273327 * @throws Exception
33283328 */
3329- public function vmMonitor (string $ node , int $ vmid )
3329+ public function vmMonitor (string $ node , int $ vmid, $ params )
33303330 {
3331- $ params = ['command ' => 'query-cpus ' ];
3332- $ response = $ this ->makeRequest ('GET ' , "nodes/ {$ node }/qemu/ {$ vmid }}/status/current " );
3331+ $ params = ['command ' => 'info ' ];
3332+ $ response = $ this ->makeRequest ('POST ' , "nodes/ {$ node }/qemu/ {$ vmid }/monitor " , $ params );
33333333
33343334 if (!isset ($ response ['data ' ])){
3335- return ResponseHelper::generate (false ,'Disk delete failed ! ' , $ response ['data ' ]);
3335+ return ResponseHelper::generate (false ,'Failed to fetch monitoring data ! ' , $ response ['data ' ]);
33363336 }
33373337
33383338 $ successResponse = [
33393339 'node ' => $ node ,
33403340 'data ' => $ response ['data ' ]
33413341 ];
33423342
3343- return ResponseHelper::generate (true ,'Disk deleted successfully ' , $ successResponse );
3343+ return ResponseHelper::generate (true ,'Data retrieved successfully ' , $ successResponse );
3344+ }
3345+
3346+ /**
3347+ * QEMU VM RRDdata (Round Robin Database data)...
3348+ * @throws Exception
3349+ */
3350+ public function vmRrddata (string $ node , int $ vmid , $ params )
3351+ {
3352+ try {
3353+ // Fixed URL by removing extra curly brace
3354+ $ response = $ this ->makeRequest ('GET ' , "nodes/ {$ node }/qemu/ {$ vmid }/rrddata " , $ params );
3355+
3356+ if (!isset ($ response ['data ' ])) {
3357+ return ResponseHelper::generate (
3358+ false ,
3359+ 'No monitoring data available ' ,
3360+ []
3361+ );
3362+ }
3363+
3364+ $ successResponse = [
3365+ 'node ' => $ node ,
3366+ 'vmid ' => $ vmid ,
3367+ 'data ' => array_map (function ($ entry ) {
3368+ return [
3369+ 'time ' => isset ($ entry ['time ' ]) ? date ('Y-m-d H:i:s ' , $ entry ['time ' ]) : null ,
3370+ 'cpu ' => $ entry ['cpu ' ] ?? null ,
3371+ 'mem ' => $ entry ['mem ' ] ?? null ,
3372+ 'netin ' => $ entry ['netin ' ] ?? null ,
3373+ 'netout ' => $ entry ['netout ' ] ?? null ,
3374+ 'diskread ' => $ entry ['diskread ' ] ?? null ,
3375+ 'diskwrite ' => $ entry ['diskwrite ' ] ?? null
3376+ ];
3377+ }, $ response ['data ' ])
3378+ ];
3379+
3380+ return ResponseHelper::generate (true , 'Data retrieved successfully ' , $ successResponse );
3381+
3382+ } catch (Exception $ e ) {
3383+ return ResponseHelper::generate (
3384+ false ,
3385+ 'Failed to fetch monitoring data: ' . $ e ->getMessage (),
3386+ []
3387+ );
3388+ }
3389+ }
3390+
3391+ public function getVMMetrics (string $ node , int $ vmid , $ params )
3392+ {
3393+ try {
3394+ $ response = $ this ->makeRequest ('GET ' , "nodes/ {$ node }/qemu/ {$ vmid }/rrddata " , $ params );
3395+
3396+ if (!isset ($ response ['data ' ]) || empty ($ response ['data ' ])) {
3397+ return ResponseHelper::generate (false , 'No metrics data available ' , []);
3398+ }
3399+
3400+ // Process and format the metrics
3401+ $ formattedMetrics = array_map (function ($ entry ) {
3402+ return [
3403+ 'timestamp ' => date ('Y-m-d H:i:s ' , $ entry ['time ' ]),
3404+
3405+ // CPU Metrics
3406+ 'cpu ' => [
3407+ 'usage_percentage ' => isset ($ entry ['cpu ' ]) ? round ($ entry ['cpu ' ] * 100 , 2 ) : null ,
3408+ ],
3409+
3410+ // Memory Metrics
3411+ 'memory ' => [
3412+ 'used_bytes ' => $ entry ['mem ' ] ?? null ,
3413+ 'used_gb ' => isset ($ entry ['mem ' ]) ? round ($ entry ['mem ' ] / (1024 * 1024 * 1024 ), 2 ) : null ,
3414+ 'total_bytes ' => $ entry ['maxmem ' ] ?? null ,
3415+ 'total_gb ' => isset ($ entry ['maxmem ' ]) ? round ($ entry ['maxmem ' ] / (1024 * 1024 * 1024 ), 2 ) : null ,
3416+ ],
3417+
3418+ // Network Metrics
3419+ 'network ' => [
3420+ 'in_bytes ' => $ entry ['netin ' ] ?? null ,
3421+ 'in_mb ' => isset ($ entry ['netin ' ]) ? round ($ entry ['netin ' ] / (1024 * 1024 ), 2 ) : null ,
3422+ 'out_bytes ' => $ entry ['netout ' ] ?? null ,
3423+ 'out_mb ' => isset ($ entry ['netout ' ]) ? round ($ entry ['netout ' ] / (1024 * 1024 ), 2 ) : null ,
3424+ ],
3425+
3426+ // Disk I/O Metrics
3427+ 'disk ' => [
3428+ 'read_bytes ' => $ entry ['diskread ' ] ?? null ,
3429+ 'read_mb ' => isset ($ entry ['diskread ' ]) ? round ($ entry ['diskread ' ] / (1024 * 1024 ), 2 ) : null ,
3430+ 'write_bytes ' => $ entry ['diskwrite ' ] ?? null ,
3431+ 'write_mb ' => isset ($ entry ['diskwrite ' ]) ? round ($ entry ['diskwrite ' ] / (1024 * 1024 ), 2 ) : null ,
3432+ ]
3433+ ];
3434+ }, $ response ['data ' ]);
3435+
3436+ $ successResponse = [
3437+ 'node ' => $ node ,
3438+ 'vmid ' => $ vmid ,
3439+ 'metrics ' => $ formattedMetrics ,
3440+ 'summary ' => [
3441+ 'latest_cpu_usage ' => end ($ formattedMetrics )['cpu ' ]['usage_percentage ' ] ?? null ,
3442+ 'latest_memory_used_gb ' => end ($ formattedMetrics )['memory ' ]['used_gb ' ] ?? null ,
3443+ 'latest_network_in_mb ' => end ($ formattedMetrics )['network ' ]['in_mb ' ] ?? null ,
3444+ 'latest_network_out_mb ' => end ($ formattedMetrics )['network ' ]['out_mb ' ] ?? null ,
3445+ ]
3446+ ];
3447+
3448+ return ResponseHelper::generate (true , 'Metrics retrieved successfully ' , $ successResponse );
3449+
3450+ } catch (Exception $ e ) {
3451+ return ResponseHelper::generate (
3452+ false ,
3453+ 'Failed to fetch metrics: ' . $ e ->getMessage (),
3454+ []
3455+ );
3456+ }
33443457 }
33453458}
0 commit comments