提交 v1.3.0 beta
This commit is contained in:
@ -2,12 +2,21 @@ package task
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/shirou/gopsutil/v3/load"
|
||||
"next-terminal/server/common/nt"
|
||||
"next-terminal/server/service"
|
||||
"next-terminal/server/utils"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"next-terminal/server/constant"
|
||||
"next-terminal/server/log"
|
||||
"next-terminal/server/repository"
|
||||
|
||||
"github.com/shirou/gopsutil/v3/cpu"
|
||||
"github.com/shirou/gopsutil/v3/disk"
|
||||
"github.com/shirou/gopsutil/v3/mem"
|
||||
"github.com/shirou/gopsutil/v3/net"
|
||||
"next-terminal/server/global/stat"
|
||||
)
|
||||
|
||||
type Ticker struct {
|
||||
@ -16,10 +25,6 @@ type Ticker struct {
|
||||
func NewTicker() *Ticker {
|
||||
return &Ticker{}
|
||||
}
|
||||
func init() {
|
||||
ticker := NewTicker()
|
||||
ticker.SetupTicker()
|
||||
}
|
||||
|
||||
func (t *Ticker) SetupTicker() {
|
||||
|
||||
@ -40,25 +45,167 @@ func (t *Ticker) SetupTicker() {
|
||||
deleteOutTimeJobLog()
|
||||
}
|
||||
}()
|
||||
|
||||
systemLoader := time.NewTicker(time.Second * 5)
|
||||
go func() {
|
||||
for range systemLoader.C {
|
||||
err := systemLoad()
|
||||
if err != nil {
|
||||
log.Error("采集系统负载失败", log.NamedError("err", err))
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func systemLoad() error {
|
||||
|
||||
beforeBytesRead, beforeBytesWrite, err := ioCounter()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
beforeBytesSent, beforeBytesRecv, err := netCounter()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
percent, err := cpu.Percent(time.Second, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
afterBytesSent, afterBytesRecv, err := netCounter()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
afterBytesRead, afterBytesWrite, err := ioCounter()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
now := time.Now().Format("15:04:05")
|
||||
|
||||
usage, err := disk.Usage("/")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
stat.SystemLoad.Disk.Total = usage.Total
|
||||
stat.SystemLoad.Disk.Used = usage.Used
|
||||
stat.SystemLoad.Disk.Available = usage.Total - usage.Used
|
||||
stat.SystemLoad.Disk.UsedPercent = float64(usage.Used) * 100 / float64(usage.Total)
|
||||
|
||||
if stat.SystemLoad.Cpu.Count == 0 {
|
||||
cpuCount, err := cpu.Counts(true)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
stat.SystemLoad.Cpu.Count = cpuCount
|
||||
|
||||
phyCpuCount, err := cpu.Counts(false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
stat.SystemLoad.Cpu.PhyCount = phyCpuCount
|
||||
|
||||
infoStats, err := cpu.Info()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, info := range infoStats {
|
||||
stat.SystemLoad.Cpu.Info = append(stat.SystemLoad.Cpu.Info, &stat.CpuInfo{
|
||||
ModelName: info.ModelName,
|
||||
CacheSize: info.CacheSize,
|
||||
MHZ: info.Mhz,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
stat.SystemLoad.Cpu.UsedPercent = percent[0]
|
||||
|
||||
stat.SystemLoad.CpuStat = append(stat.SystemLoad.CpuStat, stat.NewStat(now, utils.Decimal(stat.SystemLoad.Cpu.UsedPercent)))
|
||||
if len(stat.SystemLoad.CpuStat) > 30 {
|
||||
stat.SystemLoad.CpuStat = stat.SystemLoad.CpuStat[1:]
|
||||
}
|
||||
|
||||
avgStat, err := load.Avg()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
stat.SystemLoad.LoadStat = &stat.LoadStat{
|
||||
Load1: avgStat.Load1,
|
||||
Load5: avgStat.Load5,
|
||||
Load15: avgStat.Load15,
|
||||
Percent: avgStat.Load1 / float64(stat.SystemLoad.Cpu.Count),
|
||||
}
|
||||
|
||||
memoryStat, err := mem.VirtualMemory()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
stat.SystemLoad.Mem.Total = memoryStat.Total
|
||||
stat.SystemLoad.Mem.Available = memoryStat.Available
|
||||
stat.SystemLoad.Mem.Used = memoryStat.Used
|
||||
stat.SystemLoad.Mem.UsedPercent = memoryStat.UsedPercent
|
||||
|
||||
stat.SystemLoad.MemStat = append(stat.SystemLoad.MemStat, stat.NewStat(now, utils.Decimal(stat.SystemLoad.Mem.UsedPercent)))
|
||||
if len(stat.SystemLoad.MemStat) > 30 {
|
||||
stat.SystemLoad.MemStat = stat.SystemLoad.MemStat[1:]
|
||||
}
|
||||
|
||||
stat.SystemLoad.DiskIOStat = append(stat.SystemLoad.DiskIOStat, stat.NewIOStat(now, afterBytesRead-beforeBytesRead, afterBytesWrite-beforeBytesWrite))
|
||||
if len(stat.SystemLoad.DiskIOStat) > 30 {
|
||||
stat.SystemLoad.DiskIOStat = stat.SystemLoad.DiskIOStat[1:]
|
||||
}
|
||||
|
||||
stat.SystemLoad.NetIOStat = append(stat.SystemLoad.NetIOStat, stat.NewIOStat(now, afterBytesRecv-beforeBytesRecv, afterBytesSent-beforeBytesSent))
|
||||
if len(stat.SystemLoad.NetIOStat) > 30 {
|
||||
stat.SystemLoad.NetIOStat = stat.SystemLoad.NetIOStat[1:]
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func ioCounter() (bytesRead, bytesWrite uint64, err error) {
|
||||
diskIO, err := disk.IOCounters()
|
||||
if err != nil {
|
||||
return 0, 0, err
|
||||
}
|
||||
for _, v := range diskIO {
|
||||
bytesRead += v.ReadBytes
|
||||
bytesWrite += v.WriteBytes
|
||||
}
|
||||
|
||||
return bytesRead, bytesWrite, nil
|
||||
}
|
||||
|
||||
func netCounter() (bytesSent, bytesRecv uint64, err error) {
|
||||
netIO, err := net.IOCounters(true)
|
||||
if err != nil {
|
||||
return 0, 0, err
|
||||
}
|
||||
for _, v := range netIO {
|
||||
bytesSent += v.BytesSent
|
||||
bytesRecv += v.BytesRecv
|
||||
}
|
||||
return bytesSent, bytesRecv, nil
|
||||
}
|
||||
|
||||
func (t *Ticker) deleteUnUsedSession() {
|
||||
sessions, err := repository.SessionRepository.FindByStatusIn(context.TODO(), []string{constant.NoConnect, constant.Connecting})
|
||||
sessions, err := repository.SessionRepository.FindByStatusIn(context.TODO(), []string{nt.NoConnect, nt.Connecting})
|
||||
if err != nil {
|
||||
log.Errorf("查询会话列表失败: %v", err.Error())
|
||||
log.Error("查询会话列表失败", log.NamedError("err", err))
|
||||
return
|
||||
}
|
||||
if len(sessions) > 0 {
|
||||
now := time.Now()
|
||||
for i := range sessions {
|
||||
if now.Sub(sessions[i].ConnectedTime.Time) > time.Hour*1 {
|
||||
err := repository.SessionRepository.DeleteById(context.TODO(), sessions[i].ID)
|
||||
s := sessions[i].Username + "@" + sessions[i].IP + ":" + strconv.Itoa(sessions[i].Port)
|
||||
if err != nil {
|
||||
log.Errorf("会话「%v」id「%v」超过1小时未打开,删除失败: %v", s, sessions[i].ID, err.Error())
|
||||
} else {
|
||||
log.Infof("会话「%v」id「%v」超过1小时未打开,已删除。", s, sessions[i].ID)
|
||||
}
|
||||
_ = repository.SessionRepository.DeleteById(context.TODO(), sessions[i].ID)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -86,9 +233,9 @@ func deleteOutTimeSession() {
|
||||
for i := range sessions {
|
||||
ids = append(ids, sessions[i].ID)
|
||||
}
|
||||
err := repository.SessionRepository.DeleteByIds(context.TODO(), ids)
|
||||
err := service.SessionService.DeleteByIds(context.TODO(), ids)
|
||||
if err != nil {
|
||||
log.Errorf("删除离线会话失败 %v", err)
|
||||
log.Error("删除离线会话失败", log.NamedError("err", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -103,13 +250,13 @@ func deleteOutTimeLoginLog() {
|
||||
}
|
||||
limit, err := strconv.Atoi(property.Value)
|
||||
if err != nil {
|
||||
log.Errorf("获取删除登录日志保留时常失败 %v", err)
|
||||
log.Warn("获取删除登录日志保留时常失败", log.NamedError("err", err))
|
||||
return
|
||||
}
|
||||
|
||||
loginLogs, err := repository.LoginLogRepository.FindOutTimeLog(context.TODO(), limit)
|
||||
if err != nil {
|
||||
log.Errorf("获取登录日志失败 %v", err)
|
||||
log.Warn("获取登录日志失败", log.NamedError("err", err))
|
||||
return
|
||||
}
|
||||
|
||||
@ -117,7 +264,7 @@ func deleteOutTimeLoginLog() {
|
||||
for i := range loginLogs {
|
||||
err := repository.LoginLogRepository.DeleteById(context.TODO(), loginLogs[i].ID)
|
||||
if err != nil {
|
||||
log.Errorf("删除登录日志失败 %v", err)
|
||||
log.Warn("删除登录日志失败", log.NamedError("err", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -145,7 +292,7 @@ func deleteOutTimeJobLog() {
|
||||
for i := range jobLogs {
|
||||
err := repository.JobLogRepository.DeleteById(context.TODO(), jobLogs[i].ID)
|
||||
if err != nil {
|
||||
log.Errorf("删除计划日志失败 %v", err)
|
||||
log.Error("删除计划日志失败", log.NamedError("err", err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user