mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 07:50:25 +08:00 
			
		
		
		
	[API节点]列表显示版本号、CPU、内存、状态等信息
This commit is contained in:
		
							
								
								
									
										101
									
								
								internal/nodes/node_status_executor_windows.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								internal/nodes/node_status_executor_windows.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,101 @@
 | 
			
		||||
// +build windows
 | 
			
		||||
 | 
			
		||||
package nodes
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"github.com/shirou/gopsutil/cpu"
 | 
			
		||||
	"github.com/shirou/gopsutil/mem"
 | 
			
		||||
	"math"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type WindowsLoadValue struct {
 | 
			
		||||
	Timestamp int64
 | 
			
		||||
	Value     int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var windowsLoadValues = []*WindowsLoadValue{}
 | 
			
		||||
var windowsLoadLocker = &sync.Mutex{}
 | 
			
		||||
 | 
			
		||||
// 更新内存
 | 
			
		||||
func (this *NodeStatusExecutor) updateMem(status *NodeStatus) {
 | 
			
		||||
	stat, err := mem.VirtualMemory()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		status.Error = err.Error()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	status.MemoryUsage = stat.UsedPercent
 | 
			
		||||
	status.MemoryTotal = stat.Total
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 更新负载
 | 
			
		||||
func (this *NodeStatusExecutor) updateLoad(status *NodeStatus) {
 | 
			
		||||
	timestamp := time.Now().Unix()
 | 
			
		||||
 | 
			
		||||
	currentLoad := 0
 | 
			
		||||
	info, err := cpu.ProcInfo()
 | 
			
		||||
	if err == nil && len(info) > 0 && info[0].ProcessorQueueLength < 1000 {
 | 
			
		||||
		currentLoad = int(info[0].ProcessorQueueLength)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 删除15分钟之前的数据
 | 
			
		||||
	windowsLoadLocker.Lock()
 | 
			
		||||
	result := []*WindowsLoadValue{}
 | 
			
		||||
	for _, v := range windowsLoadValues {
 | 
			
		||||
		if timestamp-v.Timestamp > 15*60 {
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		result = append(result, v)
 | 
			
		||||
	}
 | 
			
		||||
	result = append(result, &WindowsLoadValue{
 | 
			
		||||
		Timestamp: timestamp,
 | 
			
		||||
		Value:     currentLoad,
 | 
			
		||||
	})
 | 
			
		||||
	windowsLoadValues = result
 | 
			
		||||
 | 
			
		||||
	total1 := 0
 | 
			
		||||
	count1 := 0
 | 
			
		||||
	total5 := 0
 | 
			
		||||
	count5 := 0
 | 
			
		||||
	total15 := 0
 | 
			
		||||
	count15 := 0
 | 
			
		||||
	for _, v := range result {
 | 
			
		||||
		if timestamp-v.Timestamp <= 60 {
 | 
			
		||||
			total1 += v.Value
 | 
			
		||||
			count1++
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if timestamp-v.Timestamp <= 300 {
 | 
			
		||||
			total5 += v.Value
 | 
			
		||||
			count5++
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		total15 += v.Value
 | 
			
		||||
		count15++
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	load1 := float64(0)
 | 
			
		||||
	load5 := float64(0)
 | 
			
		||||
	load15 := float64(0)
 | 
			
		||||
	if count1 > 0 {
 | 
			
		||||
		load1 = math.Round(float64(total1*100)/float64(count1)) / 100
 | 
			
		||||
	}
 | 
			
		||||
	if count5 > 0 {
 | 
			
		||||
		load5 = math.Round(float64(total5*100)/float64(count5)) / 100
 | 
			
		||||
	}
 | 
			
		||||
	if count15 > 0 {
 | 
			
		||||
		load15 = math.Round(float64(total15*100)/float64(count15)) / 100
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	windowsLoadLocker.Unlock()
 | 
			
		||||
 | 
			
		||||
	// 在老Windows上不显示错误
 | 
			
		||||
	if err == context.DeadlineExceeded {
 | 
			
		||||
		err = nil
 | 
			
		||||
	}
 | 
			
		||||
	status.Load1m = load1
 | 
			
		||||
	status.Load5m = load5
 | 
			
		||||
	status.Load15m = load15
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user