Libvirt 获取每个域的上传和下载 KB 值:使用 XML API
可以使用 Libvirt 的 XML API 来获取每个域的上传和下载的 KB 值。具体步骤如下:
-
使用'Domain.GetXMLDesc()'方法获取每个域的 XML 描述。
-
解析 XML 描述,获取'
'节点下的' '节点,找到类型为'network'的网络接口。 -
获取'
'节点下的' '节点的'dev'属性的值,即该网络接口的设备名。 -
使用'Connect.GetInterfaceStats()'方法获取该设备名对应的网络接口的上传和下载的 KB 值。
-
将获取到的 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
}
原文地址: https://www.cveoy.top/t/topic/fZ3K 著作权归作者所有。请勿转载和采集!