可以使用 Libvirt 的 XML API 来获取每个域的上传和下载的 KB 值。具体步骤如下:

  1. 使用'Domain.GetXMLDesc()'方法获取每个域的 XML 描述。

  2. 解析 XML 描述,获取''节点下的''节点,找到类型为'network'的网络接口。

  3. 获取''节点下的''节点的'dev'属性的值,即该网络接口的设备名。

  4. 使用'Connect.GetInterfaceStats()'方法获取该设备名对应的网络接口的上传和下载的 KB 值。

  5. 将获取到的 KB 值与相应的域关联起来,得到每个域的上传和下载的 KB 值。

示例代码如下:

func (c *Connect) ListAllDomainsWithStats(flags ConnectListAllDomainsFlags) ([]DomainWithStats, error) {
    domains, err := c.ListAllDomains(flags)
    if err != nil {
        return nil, err
    }
    domainStats := make([]DomainWithStats, len(domains))
    for i, domain := range domains {
        xmlDesc, err := domain.GetXMLDesc(0)
        if err != nil {
            return nil, err
        }
        doc := etree.NewDocument()
        if err := doc.ReadFromString(xmlDesc); err != nil {
            return nil, err
        }
        ifaceNodes := doc.FindElements("//devices/interface[@type='network']")
        if len(ifaceNodes) == 0 {
            continue
        }
        targetNode := ifaceNodes[0].SelectElement("target")
        if targetNode == nil {
            continue
        }
        devName := targetNode.AttrValue("dev", "")
        if devName == "" {
            continue
        }
        stats, err := c.GetInterfaceStats(devName)
        if err != nil {
            return nil, err
        }
        domainStats[i] = DomainWithStats{
            Domain: domain,
            UploadKB: stats.TxBytes / 1024,
            DownloadKB: stats.RxBytes / 1024,
        }
    }
    return domainStats, nil
}

 type DomainWithStats struct {
     Domain Domain
     UploadKB uint64
     DownloadKB uint64
 }
Libvirt 获取每个域的上传和下载 KB 值:使用 XML API

原文地址: https://www.cveoy.top/t/topic/fZ3K 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录