Files
pika/pkg/agent/collector/disk.go
T
yumusbandClaude Opus 4.6 ab22f9bd57 fix: 修复指标采集空数据时误报0%的问题
当磁盘或网卡采集不到有效数据时,空列表会被写入缓存导致
磁盘占用率和网络流量显示为0%,与真实值混淆。

修复方案:
- Agent端:空列表不发送,与GPU/温度采集器保持一致
- Server端:空数据时跳过缓存更新,保留上一次有效值

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-14 20:30:54 +08:00

67 lines
1.5 KiB
Go

package collector
import (
"github.com/dushixiang/pika/internal/protocol"
"github.com/dushixiang/pika/pkg/agent/config"
"github.com/shirou/gopsutil/v4/disk"
)
// DiskCollector 磁盘监控采集器
type DiskCollector struct {
config *config.Config
}
// NewDiskCollector 创建磁盘采集器
func NewDiskCollector(cfg *config.Config) *DiskCollector {
return &DiskCollector{
config: cfg,
}
}
// Collect 采集磁盘数据
// 只采集配置的 DiskInclude 白名单中的挂载点
func (d *DiskCollector) Collect() ([]protocol.DiskData, error) {
partitions, err := disk.Partitions(false)
if err != nil {
return nil, err
}
var diskDataList []protocol.DiskData
for _, partition := range partitions {
// 检查是否在白名单中
if !d.config.ShouldIncludeDiskMountPoint(partition.Mountpoint) {
continue
}
// 获取动态使用情况
usage, err := disk.Usage(partition.Mountpoint)
if err != nil {
continue // 跳过无法访问的分区
}
// 跳过容量为 0 的分区(可能是虚拟文件系统)
if usage.Total == 0 {
continue
}
diskData := protocol.DiskData{
MountPoint: partition.Mountpoint,
Device: partition.Device,
Fstype: partition.Fstype,
Total: usage.Total,
Used: usage.Used,
Free: usage.Free,
UsagePercent: usage.UsedPercent,
}
diskDataList = append(diskDataList, diskData)
}
// 所有白名单分区均采集失败时,返回空列表表示异常
if len(diskDataList) == 0 {
return nil, nil
}
return diskDataList, nil
}