func getBlockStats(domain *libvirtgo.VirDomain, virDomain *VirDomain) (types.BlkioStats, error) { stats := types.BlkioStats{ IoServiceBytesRecursive: make([]types.BlkioStatEntry, 0, 1), IoServicedRecursive: make([]types.BlkioStatEntry, 0, 1), } for _, blk := range virDomain.Devices.Disks { blkStats, err := domain.BlockStats(blk.Target.Dev) if err != nil { return stats, err } major, minor, err := getBlockNumber(blk.Source.File) if err != nil { return stats, err } sourceDevice := blk.Source.File if len(sourceDevice) == 0 { sourceDevice = blk.Source.Name } stats.IoServiceBytesRecursive = append(stats.IoServiceBytesRecursive, types.BlkioStatEntry{ Name: blk.Target.Dev, Type: blk.Type, Source: sourceDevice, Major: major, Minor: minor, Stat: map[string]uint64{ "Read": uint64(blkStats.RdBytes), "Write": uint64(blkStats.WrBytes), }, }) stats.IoServicedRecursive = append(stats.IoServicedRecursive, types.BlkioStatEntry{ Name: blk.Target.Dev, Type: blk.Type, Source: sourceDevice, Major: major, Minor: minor, Stat: map[string]uint64{ "Read": uint64(blkStats.RdReq), "Write": uint64(blkStats.WrReq), }, }) } return stats, nil }