[pve-devel] [PATCH manager v2 3/5] pvestatd: collect and distribute new pve-{type}-9.0 metrics

Aaron Lauterer a.lauterer at proxmox.com
Wed Jul 9 18:36:54 CEST 2025


If we see that the migration to the new pve-{type}-9.0 rrd format has been done
or is ongoing (new dir exists), we collect and send out the new format with additional
columns for nodes and VMs (guests).

Those are:
Nodes:
* memfree
* arcsize
* pressures:
  * cpu some
  * io some
  * io full
  * mem some
  * mem full

VMs:
* memhost (memory consumption of all processes in the guests cgroup -> host view)
* pressures:
  * cpu some
  * cpu full
  * io some
  * io full
  * mem some
  * mem full

Signed-off-by: Aaron Lauterer <a.lauterer at proxmox.com>
---

Notes:
    changes since:
    RFC:
    * switch from pve9- to pve-{type}-9.0 schema

 PVE/Service/pvestatd.pm | 342 +++++++++++++++++++++++++++++-----------
 1 file changed, 250 insertions(+), 92 deletions(-)

diff --git a/PVE/Service/pvestatd.pm b/PVE/Service/pvestatd.pm
index e3ea06bb..a22ae7bb 100755
--- a/PVE/Service/pvestatd.pm
+++ b/PVE/Service/pvestatd.pm
@@ -82,6 +82,16 @@ my $cached_kvm_version = '';
 my $next_flag_update_time;
 my $failed_flag_update_delay_sec = 120;
 
+# Checks if RRD files exist in the specified location.
+my $rrd_dir_exists = sub {
+    my ($location) = @_;
+    if (-d "/var/lib/rrdcached/db/${location}") {
+        return 1;
+    } else {
+        return 0;
+    }
+};
+
 sub update_supported_cpuflags {
     my $kvm_version = PVE::QemuServer::kvm_user_version();
 
@@ -180,32 +190,66 @@ sub update_node_status {
 
     my $meminfo = PVE::ProcFSTools::read_meminfo();
 
+    my $pressures = PVE::ProcFSTools::read_pressure();
+
     my $dinfo = df('/', 1); # output is bytes
     # everything not free is considered to be used
     my $dused = $dinfo->{blocks} - $dinfo->{bfree};
 
     my $ctime = time();
 
-    my $data = $generate_rrd_string->(
-        [
-            $uptime,
-            $sublevel,
-            $ctime,
-            $avg1,
-            $maxcpu,
-            $stat->{cpu},
-            $stat->{wait},
-            $meminfo->{memtotal},
-            $meminfo->{memused},
-            $meminfo->{swaptotal},
-            $meminfo->{swapused},
-            $dinfo->{blocks},
-            $dused,
-            $netin,
-            $netout,
-        ],
-    );
-    PVE::Cluster::broadcast_rrd("pve2-node/$nodename", $data);
+    my $data;
+    # TODO: drop old pve2- schema with PVE 10
+    if ($rrd_dir_exists->("pve-node-9.0")) {
+        $data = $generate_rrd_string->(
+            [
+                $uptime,
+                $sublevel,
+                $ctime,
+                $avg1,
+                $maxcpu,
+                $stat->{cpu},
+                $stat->{wait},
+                $meminfo->{memtotal},
+                $meminfo->{memused},
+                $meminfo->{swaptotal},
+                $meminfo->{swapused},
+                $dinfo->{blocks},
+                $dused,
+                $netin,
+                $netout,
+                $meminfo->{memavailable},
+                $meminfo->{arcsize},
+                $pressures->{cpu}->{some}->{avg10},
+                $pressures->{io}->{some}->{avg10},
+                $pressures->{io}->{full}->{avg10},
+                $pressures->{memory}->{some}->{avg10},
+                $pressures->{memory}->{full}->{avg10},
+            ],
+        );
+        PVE::Cluster::broadcast_rrd("pve-node-9.0/$nodename", $data);
+    } else {
+        $data = $generate_rrd_string->(
+            [
+                $uptime,
+                $sublevel,
+                $ctime,
+                $avg1,
+                $maxcpu,
+                $stat->{cpu},
+                $stat->{wait},
+                $meminfo->{memtotal},
+                $meminfo->{memused},
+                $meminfo->{swaptotal},
+                $meminfo->{swapused},
+                $dinfo->{blocks},
+                $dused,
+                $netin,
+                $netout,
+            ],
+        );
+        PVE::Cluster::broadcast_rrd("pve2-node/$nodename", $data);
+    }
 
     my $node_metric = {
         uptime => $uptime,
@@ -273,44 +317,101 @@ sub update_qemu_status {
         my $data;
         my $status = $d->{qmpstatus} || $d->{status} || 'stopped';
         my $template = $d->{template} ? $d->{template} : "0";
-        if ($d->{pid}) { # running
-            $data = $generate_rrd_string->([
-                $d->{uptime},
-                $d->{name},
-                $status,
-                $template,
-                $ctime,
-                $d->{cpus},
-                $d->{cpu},
-                $d->{maxmem},
-                $d->{mem},
-                $d->{maxdisk},
-                $d->{disk},
-                $d->{netin},
-                $d->{netout},
-                $d->{diskread},
-                $d->{diskwrite},
-            ]);
+
+        # TODO: drop old pve2.3- schema with PVE 10
+        if ($rrd_dir_exists->("pve-vm-9.0")) {
+            if ($d->{pid}) { # running
+                $data = $generate_rrd_string->([
+                    $d->{uptime},
+                    $d->{name},
+                    $status,
+                    $template,
+                    $ctime,
+                    $d->{cpus},
+                    $d->{cpu},
+                    $d->{maxmem},
+                    $d->{mem},
+                    $d->{maxdisk},
+                    $d->{disk},
+                    $d->{netin},
+                    $d->{netout},
+                    $d->{diskread},
+                    $d->{diskwrite},
+                    $d->{memhost},
+                    $d->{pressurecpusome},
+                    $d->{pressurecpufull},
+                    $d->{pressureiosome},
+                    $d->{pressureiofull},
+                    $d->{pressurememorysome},
+                    $d->{pressurememoryfull},
+                ]);
+            } else {
+                $data = $generate_rrd_string->([
+                    0,
+                    $d->{name},
+                    $status,
+                    $template,
+                    $ctime,
+                    $d->{cpus},
+                    undef,
+                    $d->{maxmem},
+                    undef,
+                    $d->{maxdisk},
+                    $d->{disk},
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                ]);
+            }
+            PVE::Cluster::broadcast_rrd("pve-vm-9.0/$vmid", $data);
         } else {
-            $data = $generate_rrd_string->([
-                0,
-                $d->{name},
-                $status,
-                $template,
-                $ctime,
-                $d->{cpus},
-                undef,
-                $d->{maxmem},
-                undef,
-                $d->{maxdisk},
-                $d->{disk},
-                undef,
-                undef,
-                undef,
-                undef,
-            ]);
+            if ($d->{pid}) { # running
+                $data = $generate_rrd_string->([
+                    $d->{uptime},
+                    $d->{name},
+                    $status,
+                    $template,
+                    $ctime,
+                    $d->{cpus},
+                    $d->{cpu},
+                    $d->{maxmem},
+                    $d->{mem},
+                    $d->{maxdisk},
+                    $d->{disk},
+                    $d->{netin},
+                    $d->{netout},
+                    $d->{diskread},
+                    $d->{diskwrite},
+                ]);
+            } else {
+                $data = $generate_rrd_string->([
+                    0,
+                    $d->{name},
+                    $status,
+                    $template,
+                    $ctime,
+                    $d->{cpus},
+                    undef,
+                    $d->{maxmem},
+                    undef,
+                    $d->{maxdisk},
+                    $d->{disk},
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                ]);
+            }
+            PVE::Cluster::broadcast_rrd("pve2.3-vm/$vmid", $data);
         }
-        PVE::Cluster::broadcast_rrd("pve2.3-vm/$vmid", $data);
 
         PVE::ExtMetric::update_all($transactions, 'qemu', $vmid, $d, $ctime, $nodename);
     }
@@ -506,44 +607,100 @@ sub update_lxc_status {
         my $d = $vmstatus->{$vmid};
         my $template = $d->{template} ? $d->{template} : "0";
         my $data;
-        if ($d->{status} eq 'running') { # running
-            $data = $generate_rrd_string->([
-                $d->{uptime},
-                $d->{name},
-                $d->{status},
-                $template,
-                $ctime,
-                $d->{cpus},
-                $d->{cpu},
-                $d->{maxmem},
-                $d->{mem},
-                $d->{maxdisk},
-                $d->{disk},
-                $d->{netin},
-                $d->{netout},
-                $d->{diskread},
-                $d->{diskwrite},
-            ]);
+        # TODO: drop old pve2.3-vm schema with PVE 10
+        if ($rrd_dir_exists->("pve-vm-9.0")) {
+            if ($d->{pid}) { # running
+                $data = $generate_rrd_string->([
+                    $d->{uptime},
+                    $d->{name},
+                    $d->{status},
+                    $template,
+                    $ctime,
+                    $d->{cpus},
+                    $d->{cpu},
+                    $d->{maxmem},
+                    $d->{mem},
+                    $d->{maxdisk},
+                    $d->{disk},
+                    $d->{netin},
+                    $d->{netout},
+                    $d->{diskread},
+                    $d->{diskwrite},
+                    undef,
+                    $d->{pressurecpusome},
+                    $d->{pressurecpufull},
+                    $d->{pressureiosome},
+                    $d->{pressureiofull},
+                    $d->{pressurememorysome},
+                    $d->{pressurememoryfull},
+                ]);
+            } else {
+                $data = $generate_rrd_string->([
+                    0,
+                    $d->{name},
+                    $d->{status},
+                    $template,
+                    $ctime,
+                    $d->{cpus},
+                    undef,
+                    $d->{maxmem},
+                    undef,
+                    $d->{maxdisk},
+                    $d->{disk},
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                ]);
+            }
+            PVE::Cluster::broadcast_rrd("pve-vm-9.0/$vmid", $data);
         } else {
-            $data = $generate_rrd_string->([
-                0,
-                $d->{name},
-                $d->{status},
-                $template,
-                $ctime,
-                $d->{cpus},
-                undef,
-                $d->{maxmem},
-                undef,
-                $d->{maxdisk},
-                $d->{disk},
-                undef,
-                undef,
-                undef,
-                undef,
-            ]);
+            if ($d->{status} eq 'running') { # running
+                $data = $generate_rrd_string->([
+                    $d->{uptime},
+                    $d->{name},
+                    $d->{status},
+                    $template,
+                    $ctime,
+                    $d->{cpus},
+                    $d->{cpu},
+                    $d->{maxmem},
+                    $d->{mem},
+                    $d->{maxdisk},
+                    $d->{disk},
+                    $d->{netin},
+                    $d->{netout},
+                    $d->{diskread},
+                    $d->{diskwrite},
+                ]);
+            } else {
+                $data = $generate_rrd_string->([
+                    0,
+                    $d->{name},
+                    $d->{status},
+                    $template,
+                    $ctime,
+                    $d->{cpus},
+                    undef,
+                    $d->{maxmem},
+                    undef,
+                    $d->{maxdisk},
+                    $d->{disk},
+                    undef,
+                    undef,
+                    undef,
+                    undef,
+                ]);
+            }
+            PVE::Cluster::broadcast_rrd("pve2.3-vm/$vmid", $data);
         }
-        PVE::Cluster::broadcast_rrd("pve2.3-vm/$vmid", $data);
 
         PVE::ExtMetric::update_all($transactions, 'lxc', $vmid, $d, $ctime, $nodename);
     }
@@ -568,6 +725,7 @@ sub update_storage_status {
         my $data = $generate_rrd_string->([$ctime, $d->{total}, $d->{used}]);
 
         my $key = "pve2-storage/${nodename}/$storeid";
+        $key = "pve-storage-9.0/${nodename}/$storeid" if $rrd_dir_exists->("pve-storage-9.0");
         PVE::Cluster::broadcast_rrd($key, $data);
 
         PVE::ExtMetric::update_all($transactions, 'storage', $nodename, $storeid, $d, $ctime);
-- 
2.39.5





More information about the pve-devel mailing list