package monitor import ( "fmt" "github.com/shirou/gopsutil/v3/disk" "path/filepath" "runtime" "strconv" ) // DiskInfo 磁盘分区信息(空间占用 + IO 统计) type DiskInfo struct { Device string `json:"device"` MountPoint string `json:"mountPoint"` FsType string `json:"fsType"` Path string `json:"path"` Total uint64 `json:"total"` Free uint64 `json:"free"` Used uint64 `json:"used"` UsedPercent float64 `json:"usedPercent"` UsedVolume string `json:"usedVolume"` ReadCount uint64 `json:"readCount"` WriteCount uint64 `json:"writeCount"` ReadBytes uint64 `json:"readBytes"` WriteBytes uint64 `json:"writeBytes"` ReadTime uint64 `json:"readTime"` WriteTime uint64 `json:"writeTime"` TotalReadCount uint64 `json:"totalReadCount"` TotalWriteCount uint64 `json:"totalWriteCount"` TotalReadBytes uint64 `json:"totalReadBytes"` TotalWriteBytes uint64 `json:"totalWriteBytes"` TotalReadTime uint64 `json:"totalReadTime"` TotalWriteTime uint64 `json:"totalWriteTime"` } // DiskInfoLite 精简版磁盘信息 type DiskInfoLite struct { Device string `json:"device"` MountPoint string `json:"mountPoint"` UsedPercent float64 `json:"usedPercent"` UsedVolume string `json:"usedVolume"` ReadBytes uint64 `json:"readBytes"` WriteBytes uint64 `json:"writeBytes"` } // getDiskInfo 采集所有磁盘分区信息 func getDiskInfo() ([]DiskInfo, error) { partitions, err := disk.Partitions(false) // fmt.Printf("disk partitions:%v\n\n", partitions) if err != nil { // fmt.Printf("get disk partitions err:%s\n", err.Error()) // return nil, err } names := make([]string, len(partitions)) // fmt.Println(len(names)) for i, _ := range partitions { names[i] = partitions[i].Device } // fmt.Println(names) io, err := disk.IOCounters(names...) // fmt.Printf("disk io:%v\n\n", io) if err != nil { //return nil, err // fmt.Printf("get disk IOCounters err:%s\n", err.Error()) } disks := make([]DiskInfo, len(partitions)) for i, _ := range disks { disks[i].Device = partitions[i].Device disks[i].MountPoint = partitions[i].Mountpoint disks[i].FsType = partitions[i].Fstype // 使用量 用路径获取 usage, err := disk.Usage(partitions[i].Mountpoint) if err != nil { // fmt.Printf("get disk Usage err:%s\n", err.Error()) break } disks[i].Path = usage.Path disks[i].Total = usage.Total disks[i].Free = usage.Total disks[i].Used = usage.Used disks[i].UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", usage.UsedPercent), 64) disks[i].UsedVolume = formatFileSize(usage.Used) + "/" + formatFileSize(usage.Total) name := partitions[i].Device if runtime.GOOS == "linux" { name = filepath.Base(name) } //fmt.Println(name, partitions[i].Device) disks[i].TotalReadCount = io[name].ReadCount disks[i].TotalWriteCount = io[name].WriteCount disks[i].TotalReadBytes = io[name].ReadBytes disks[i].TotalWriteBytes = io[name].WriteBytes disks[i].TotalReadTime = io[name].ReadTime disks[i].TotalWriteTime = io[name].WriteTime // FIXME:分区会变化,应该用name获取 if len(monInfo.Disk) > i { disks[i].ReadCount = io[name].ReadCount - monInfo.Disk[i].TotalReadCount disks[i].WriteCount = io[name].WriteCount - monInfo.Disk[i].TotalWriteCount disks[i].ReadBytes = io[name].ReadBytes - monInfo.Disk[i].TotalReadBytes disks[i].WriteBytes = io[name].WriteBytes - monInfo.Disk[i].TotalWriteBytes disks[i].ReadTime = io[name].ReadTime - monInfo.Disk[i].TotalReadTime disks[i].WriteTime = io[name].WriteTime - monInfo.Disk[i].TotalWriteTime } } if err != nil { return disks, err } return disks, nil }