improved metrics implementation

This commit is contained in:
yusing
2025-02-13 05:58:30 +08:00
parent fd50f8fcab
commit 3c7fafa91f
11 changed files with 262 additions and 83 deletions

View File

@@ -2,6 +2,7 @@ package systeminfo
import (
"context"
"encoding/json"
"time"
"github.com/shirou/gopsutil/v4/cpu"
@@ -10,24 +11,27 @@ import (
"github.com/shirou/gopsutil/v4/net"
"github.com/shirou/gopsutil/v4/sensors"
"github.com/yusing/go-proxy/internal/metrics/period"
"github.com/yusing/go-proxy/internal/utils/strutils"
)
type SystemInfo struct {
Timestamp time.Time
CPUAverage float64
Memory *mem.VirtualMemoryStat
Disk *disk.UsageStat
Network *net.IOCountersStat
Sensors []sensors.TemperatureStat
Timestamp time.Time
CPUAverage float64
Memory *mem.VirtualMemoryStat
Disk *disk.UsageStat
NetworkIO *net.IOCountersStat
NetworkUp float64
NetworkDown float64
Sensors []sensors.TemperatureStat
}
var Poller = period.NewPoller("system_info", 1*time.Second, getSystemInfo)
var Poller = period.NewPoller("system_info", getSystemInfo)
func init() {
Poller.Start()
}
func getSystemInfo(ctx context.Context) (*SystemInfo, error) {
func getSystemInfo(ctx context.Context, lastResult *SystemInfo) (*SystemInfo, error) {
memoryInfo, err := mem.VirtualMemory()
if err != nil {
return nil, err
@@ -40,7 +44,7 @@ func getSystemInfo(ctx context.Context) (*SystemInfo, error) {
if err != nil {
return nil, err
}
networkInfo, err := net.IOCounters(false)
networkIO, err := net.IOCounters(false)
if err != nil {
return nil, err
}
@@ -48,13 +52,51 @@ func getSystemInfo(ctx context.Context) (*SystemInfo, error) {
if err != nil {
return nil, err
}
var networkUp, networkDown float64
if lastResult != nil {
interval := time.Since(lastResult.Timestamp).Seconds()
networkUp = float64(networkIO[0].BytesSent-lastResult.NetworkIO.BytesSent) / interval
networkDown = float64(networkIO[0].BytesRecv-lastResult.NetworkIO.BytesRecv) / interval
}
return &SystemInfo{
Timestamp: time.Now(),
CPUAverage: cpuAverage[0],
Memory: memoryInfo,
Disk: diskInfo,
Network: &networkInfo[0],
Sensors: sensors,
Timestamp: time.Now(),
CPUAverage: cpuAverage[0],
Memory: memoryInfo,
Disk: diskInfo,
NetworkIO: &networkIO[0],
NetworkUp: networkUp,
NetworkDown: networkDown,
Sensors: sensors,
}, nil
}
func (s *SystemInfo) MarshalJSON() ([]byte, error) {
return json.Marshal(map[string]any{
"timestamp": s.Timestamp.Unix(),
"time": strutils.FormatTime(s.Timestamp),
"cpu_average": s.CPUAverage,
"memory": map[string]any{
"total": s.Memory.Total,
"available": s.Memory.Available,
"used": s.Memory.Used,
"used_percent": s.Memory.UsedPercent,
},
"disk": map[string]any{
"path": s.Disk.Path,
"fstype": s.Disk.Fstype,
"total": s.Disk.Total,
"used": s.Disk.Used,
"used_percent": s.Disk.UsedPercent,
"free": s.Disk.Free,
},
"network": map[string]any{
"name": s.NetworkIO.Name,
"bytes_sent": s.NetworkIO.BytesSent,
"bytes_recv": s.NetworkIO.BytesRecv,
"upload_speed": s.NetworkUp,
"download_speed": s.NetworkDown,
},
"sensors": s.Sensors,
})
}