♻️ 优化取网卡流量及硬盘容量
Co-authored-by: CHN-STUDENT <21209416+CHN-STUDENT@users.noreply.github.com>
This commit is contained in:
parent
b18227d64b
commit
aeb48e50ac
@ -55,17 +55,17 @@ func doSelfUpdate() {
|
|||||||
updateCh <- struct{}{}
|
updateCh <- struct{}{}
|
||||||
}()
|
}()
|
||||||
v := semver.MustParse(version)
|
v := semver.MustParse(version)
|
||||||
log.Println("Check update", v)
|
println("Check update", v)
|
||||||
latest, err := selfupdate.UpdateSelf(v, "naiba/nezha")
|
latest, err := selfupdate.UpdateSelf(v, "naiba/nezha")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Binary update failed:", err)
|
println("Binary update failed:", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if latest.Version.Equals(v) {
|
if latest.Version.Equals(v) {
|
||||||
// latest version is the same as current version. It means current binary is up to date.
|
// latest version is the same as current version. It means current binary is up to date.
|
||||||
log.Println("Current binary is the latest version", version)
|
println("Current binary is the latest version", version)
|
||||||
} else {
|
} else {
|
||||||
log.Println("Successfully updated to version", latest.Version)
|
println("Successfully updated to version", latest.Version)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -120,18 +120,18 @@ func run() {
|
|||||||
var conn *grpc.ClientConn
|
var conn *grpc.ClientConn
|
||||||
|
|
||||||
retry := func() {
|
retry := func() {
|
||||||
log.Println("Error to close connection ...")
|
println("Error to close connection ...")
|
||||||
if conn != nil {
|
if conn != nil {
|
||||||
conn.Close()
|
conn.Close()
|
||||||
}
|
}
|
||||||
time.Sleep(delayWhenError)
|
time.Sleep(delayWhenError)
|
||||||
log.Println("Try to reconnect ...")
|
println("Try to reconnect ...")
|
||||||
}
|
}
|
||||||
|
|
||||||
for {
|
for {
|
||||||
conn, err = grpc.Dial(server, grpc.WithInsecure(), grpc.WithPerRPCCredentials(&auth))
|
conn, err = grpc.Dial(server, grpc.WithInsecure(), grpc.WithPerRPCCredentials(&auth))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("grpc.Dial err: %v", err)
|
println("grpc.Dial err: ", err)
|
||||||
retry()
|
retry()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -139,26 +139,26 @@ func run() {
|
|||||||
// 第一步注册
|
// 第一步注册
|
||||||
_, err = client.ReportSystemInfo(ctx, monitor.GetHost().PB())
|
_, err = client.ReportSystemInfo(ctx, monitor.GetHost().PB())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("client.ReportSystemInfo err: %v", err)
|
println("client.ReportSystemInfo err: ", err)
|
||||||
retry()
|
retry()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
// 执行 Task
|
// 执行 Task
|
||||||
tasks, err := client.RequestTask(ctx, monitor.GetHost().PB())
|
tasks, err := client.RequestTask(ctx, monitor.GetHost().PB())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("client.RequestTask err: %v", err)
|
println("client.RequestTask err: ", err)
|
||||||
retry()
|
retry()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
err = receiveTasks(tasks)
|
err = receiveTasks(tasks)
|
||||||
log.Printf("receiveTasks exit to main: %v", err)
|
println("receiveTasks exit to main: ", err)
|
||||||
retry()
|
retry()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func receiveTasks(tasks pb.NezhaService_RequestTaskClient) error {
|
func receiveTasks(tasks pb.NezhaService_RequestTaskClient) error {
|
||||||
var err error
|
var err error
|
||||||
defer log.Printf("receiveTasks exit %v => %v", time.Now(), err)
|
defer println("receiveTasks exit", time.Now(), "=>", err)
|
||||||
for {
|
for {
|
||||||
var task *pb.Task
|
var task *pb.Task
|
||||||
task, err = tasks.Recv()
|
task, err = tasks.Recv()
|
||||||
@ -264,7 +264,7 @@ func doTask(task *pb.Task) {
|
|||||||
}
|
}
|
||||||
result.Delay = float32(time.Since(startedAt).Seconds())
|
result.Delay = float32(time.Since(startedAt).Seconds())
|
||||||
default:
|
default:
|
||||||
log.Printf("Unknown action: %v", task)
|
println("Unknown action: ", task)
|
||||||
}
|
}
|
||||||
client.ReportTask(ctx, &result)
|
client.ReportTask(ctx, &result)
|
||||||
}
|
}
|
||||||
@ -272,13 +272,13 @@ func doTask(task *pb.Task) {
|
|||||||
func reportState() {
|
func reportState() {
|
||||||
var lastReportHostInfo time.Time
|
var lastReportHostInfo time.Time
|
||||||
var err error
|
var err error
|
||||||
defer log.Printf("reportState exit %v => %v", time.Now(), err)
|
defer println("reportState exit", time.Now(), "=>", err)
|
||||||
for {
|
for {
|
||||||
if client != nil {
|
if client != nil {
|
||||||
monitor.TrackNetworkSpeed()
|
monitor.TrackNetworkSpeed()
|
||||||
_, err = client.ReportSystemState(ctx, monitor.GetState(dao.ReportDelay).PB())
|
_, err = client.ReportSystemState(ctx, monitor.GetState(dao.ReportDelay).PB())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("reportState error %v", err)
|
println("reportState error", err)
|
||||||
time.Sleep(delayWhenError)
|
time.Sleep(delayWhenError)
|
||||||
}
|
}
|
||||||
if lastReportHostInfo.Before(time.Now().Add(-10 * time.Minute)) {
|
if lastReportHostInfo.Before(time.Now().Add(-10 * time.Minute)) {
|
||||||
@ -288,3 +288,9 @@ func reportState() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func println(v ...interface{}) {
|
||||||
|
if dao.Conf.Debug {
|
||||||
|
log.Println(v...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -22,7 +22,7 @@ func GetHost() *model.Host {
|
|||||||
hi, _ := host.Info()
|
hi, _ := host.Info()
|
||||||
var cpuType string
|
var cpuType string
|
||||||
if hi.VirtualizationSystem != "" {
|
if hi.VirtualizationSystem != "" {
|
||||||
cpuType = "Virtual"
|
cpuType = "Vrtual"
|
||||||
} else {
|
} else {
|
||||||
cpuType = "Physical"
|
cpuType = "Physical"
|
||||||
}
|
}
|
||||||
@ -37,15 +37,15 @@ func GetHost() *model.Host {
|
|||||||
}
|
}
|
||||||
mv, _ := mem.VirtualMemory()
|
mv, _ := mem.VirtualMemory()
|
||||||
ms, _ := mem.SwapMemory()
|
ms, _ := mem.SwapMemory()
|
||||||
u, _ := disk.Usage("/")
|
diskTotal, _ := getDiskTotalAndUsed()
|
||||||
|
|
||||||
return &model.Host{
|
return &model.Host{
|
||||||
Platform: hi.OS,
|
Platform: hi.OS,
|
||||||
PlatformVersion: hi.PlatformVersion,
|
PlatformVersion: hi.PlatformVersion,
|
||||||
CPU: cpus,
|
CPU: cpus,
|
||||||
MemTotal: mv.Total,
|
MemTotal: mv.Total,
|
||||||
DiskTotal: u.Total,
|
|
||||||
SwapTotal: ms.Total,
|
SwapTotal: ms.Total,
|
||||||
|
DiskTotal: diskTotal,
|
||||||
Arch: hi.KernelArch,
|
Arch: hi.KernelArch,
|
||||||
Virtualization: hi.VirtualizationSystem,
|
Virtualization: hi.VirtualizationSystem,
|
||||||
BootTime: hi.BootTime,
|
BootTime: hi.BootTime,
|
||||||
@ -57,23 +57,19 @@ func GetHost() *model.Host {
|
|||||||
|
|
||||||
func GetState(delay int64) *model.HostState {
|
func GetState(delay int64) *model.HostState {
|
||||||
hi, _ := host.Info()
|
hi, _ := host.Info()
|
||||||
// Memory
|
|
||||||
mv, _ := mem.VirtualMemory()
|
mv, _ := mem.VirtualMemory()
|
||||||
ms, _ := mem.SwapMemory()
|
ms, _ := mem.SwapMemory()
|
||||||
// CPU
|
|
||||||
var cpuPercent float64
|
var cpuPercent float64
|
||||||
cp, err := cpu.Percent(time.Second*time.Duration(delay), false)
|
cp, err := cpu.Percent(time.Second*time.Duration(delay), false)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
cpuPercent = cp[0]
|
cpuPercent = cp[0]
|
||||||
}
|
}
|
||||||
// Disk
|
_, diskUsed := getDiskTotalAndUsed()
|
||||||
u, _ := disk.Usage("/")
|
|
||||||
|
|
||||||
return &model.HostState{
|
return &model.HostState{
|
||||||
CPU: cpuPercent,
|
CPU: cpuPercent,
|
||||||
MemUsed: mv.Used,
|
MemUsed: mv.Used,
|
||||||
SwapUsed: ms.Used,
|
SwapUsed: ms.Used,
|
||||||
DiskUsed: u.Used,
|
DiskUsed: diskUsed,
|
||||||
NetInTransfer: atomic.LoadUint64(&netInTransfer),
|
NetInTransfer: atomic.LoadUint64(&netInTransfer),
|
||||||
NetOutTransfer: atomic.LoadUint64(&netOutTransfer),
|
NetOutTransfer: atomic.LoadUint64(&netOutTransfer),
|
||||||
NetInSpeed: atomic.LoadUint64(&netInSpeed),
|
NetInSpeed: atomic.LoadUint64(&netInSpeed),
|
||||||
@ -84,10 +80,22 @@ func GetState(delay int64) *model.HostState {
|
|||||||
|
|
||||||
func TrackNetworkSpeed() {
|
func TrackNetworkSpeed() {
|
||||||
var innerNetInTransfer, innerNetOutTransfer uint64
|
var innerNetInTransfer, innerNetOutTransfer uint64
|
||||||
nc, err := net.IOCounters(false)
|
nc, err := net.IOCounters(true)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
innerNetInTransfer += nc[0].BytesRecv
|
for _, v := range nc {
|
||||||
innerNetOutTransfer += nc[0].BytesSent
|
if strings.Contains(v.Name, "lo") ||
|
||||||
|
strings.Contains(v.Name, "tun") ||
|
||||||
|
strings.Contains(v.Name, "docker") ||
|
||||||
|
strings.Contains(v.Name, "veth") ||
|
||||||
|
strings.Contains(v.Name, "br-") ||
|
||||||
|
strings.Contains(v.Name, "vmbr") ||
|
||||||
|
strings.Contains(v.Name, "vnet") ||
|
||||||
|
strings.Contains(v.Name, "kube") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
innerNetInTransfer += v.BytesRecv
|
||||||
|
innerNetOutTransfer += v.BytesSent
|
||||||
|
}
|
||||||
now := uint64(time.Now().Unix())
|
now := uint64(time.Now().Unix())
|
||||||
diff := now - atomic.LoadUint64(&lastUpdate)
|
diff := now - atomic.LoadUint64(&lastUpdate)
|
||||||
if diff > 0 {
|
if diff > 0 {
|
||||||
@ -99,3 +107,32 @@ func TrackNetworkSpeed() {
|
|||||||
atomic.StoreUint64(&lastUpdate, now)
|
atomic.StoreUint64(&lastUpdate, now)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getDiskTotalAndUsed() (total uint64, used uint64) {
|
||||||
|
diskList, _ := disk.Partitions(false)
|
||||||
|
for _, d := range diskList {
|
||||||
|
fsType := strings.ToLower(d.Fstype)
|
||||||
|
if strings.Contains(fsType, "ext4") ||
|
||||||
|
strings.Contains(fsType, "ext3") ||
|
||||||
|
strings.Contains(fsType, "ext2") ||
|
||||||
|
strings.Contains(fsType, "reiserfs") ||
|
||||||
|
strings.Contains(fsType, "jfs") ||
|
||||||
|
strings.Contains(fsType, "btrfs") ||
|
||||||
|
strings.Contains(fsType, "fuseblk") ||
|
||||||
|
strings.Contains(fsType, "zfs") ||
|
||||||
|
strings.Contains(fsType, "simfs") ||
|
||||||
|
strings.Contains(fsType, "ntfs") ||
|
||||||
|
strings.Contains(fsType, "fat32") ||
|
||||||
|
strings.Contains(fsType, "exfat") ||
|
||||||
|
strings.Contains(fsType, "xfs") {
|
||||||
|
diskUsageOf, _ := disk.Usage(d.Mountpoint)
|
||||||
|
path := diskUsageOf.Path
|
||||||
|
// 不统计 K8s 的虚拟挂载点,see here:https://github.com/shirou/gopsutil/issues/1007
|
||||||
|
if !strings.Contains(path, "/var/lib/kubelet") {
|
||||||
|
total += diskUsageOf.Total
|
||||||
|
used += diskUsageOf.Used
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user