From 744543da42704ae188b6c8f798c117f1522bb27b Mon Sep 17 00:00:00 2001 From: wangqing Date: Thu, 6 Nov 2025 18:17:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=9C=A8=20Web=20?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E4=B8=AD=E6=98=BE=E7=A4=BA=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=9C=BA=E6=80=BB=E6=95=B0=E5=92=8C=E6=B4=BB=E8=B7=83=E8=99=9A?= =?UTF-8?q?=E6=8B=9F=E6=9C=BA=E6=95=B0=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangqing --- collector/collector.go | 46 ++++++++++++++++++++++++++++++++++++++++++ server/server.go | 12 +++++++---- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/collector/collector.go b/collector/collector.go index 81ce4c1..389a6a8 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -203,3 +203,49 @@ func (c *LibvirtCollector) Close() { slogx.Debug("No libvirt connection to close") } } + +// GetDomainCounts returns the total number of domains and the number of active domains +func (c *LibvirtCollector) GetDomainCounts() (total int, active int, err error) { + c.mutex.Lock() + defer c.mutex.Unlock() + + // Check connection health and attempt reconnection if needed + alive, err := c.conn.IsAlive() + if err != nil || !alive { + slogx.Warn("Connection to libvirt lost when getting domain counts", "uri", c.uri) + c.conn.Close() + + conn, err := libvirt.NewConnect(c.uri) + if err != nil { + slogx.Error("Failed to reconnect to libvirt when getting domain counts", "uri", c.uri, "error", err) + return 0, 0, err + } + c.conn = conn + slogx.Info("Libvirt connection restored successfully when getting domain counts", "uri", c.uri) + } + + // Get all domains (both active and inactive) + domains, err := c.conn.ListAllDomains( + libvirt.CONNECT_LIST_DOMAINS_ACTIVE | libvirt.CONNECT_LIST_DOMAINS_INACTIVE, + ) + if err != nil { + slogx.Error("Failed to list domains when getting domain counts", "error", err) + return 0, 0, err + } + defer func() { + for _, domain := range domains { + domain.Free() + } + }() + + total = len(domains) + active = 0 + for _, domain := range domains { + isActive, _ := domain.IsActive() + if isActive { + active++ + } + } + + return total, active, nil +} diff --git a/server/server.go b/server/server.go index fb8e40c..68add00 100644 --- a/server/server.go +++ b/server/server.go @@ -145,10 +145,14 @@ func (s *Server) handleRoot(w http.ResponseWriter, r *http.Request) { // Get libvirt URI from collector data.LibvirtURI = s.libvirtCollector.GetURI() - // TODO: Add methods to get VM stats - // For now, we'll leave these as 0 - data.TotalVMs = 0 - data.ActiveVMs = 0 + // Get domain counts (total and active) + totalVMs, activeVMs, err := s.libvirtCollector.GetDomainCounts() + if err == nil { + data.TotalVMs = totalVMs + data.ActiveVMs = activeVMs + } else { + slogx.Warn("Failed to get domain counts", "error", err) + } } // Execute the template -- Gitee