forked from Monibuca/engine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsummary.go
More file actions
134 lines (120 loc) · 2.69 KB
/
summary.go
File metadata and controls
134 lines (120 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package engine
import (
"sync"
"sync/atomic"
"time"
"github.com/shirou/gopsutil/v3/cpu"
"github.com/shirou/gopsutil/v3/disk"
"github.com/shirou/gopsutil/v3/mem"
"github.com/shirou/gopsutil/v3/net"
"m7s.live/engine/v4/log"
"m7s.live/engine/v4/util"
)
var summary Summary
var children util.Map[string, *Summary]
func init() {
go summary.Start()
}
// ServerSummary 系统摘要定义
type Summary struct {
Address string
Memory struct {
Total uint64
Free uint64
Used uint64
Usage float64
}
CPUUsage float64
HardDisk struct {
Total uint64
Free uint64
Used uint64
Usage float64
}
NetWork []NetWorkInfo
Streams []StreamSummay
lastNetWork []net.IOCountersStat
ref atomic.Int32
rw sync.RWMutex
}
// NetWorkInfo 网速信息
type NetWorkInfo struct {
Name string
Receive uint64
Sent uint64
ReceiveSpeed uint64
SentSpeed uint64
}
// StartSummary 开始定时采集数据,每秒一次
func (s *Summary) Start() {
for range time.Tick(time.Second) {
if s.Running() {
summary.collect()
}
}
}
func (s *Summary) Point() *Summary {
return s
}
// Running 是否正在采集数据
func (s *Summary) Running() bool {
return s.ref.Load() > 0
}
// Add 增加订阅者
func (s *Summary) Add() {
if count := s.ref.Add(1); count == 1 {
log.Info("start report summary")
} else {
log.Info("summary count", count)
}
}
// Done 删除订阅者
func (s *Summary) Done() {
if count := s.ref.Add(-1); count == 0 {
log.Info("stop report summary")
s.lastNetWork = nil
} else {
log.Info("summary count", count)
}
}
// Report 上报数据
func (s *Summary) Report(slave *Summary) {
children.Set(slave.Address, slave)
}
func (s *Summary) collect() *Summary {
s.rw.Lock()
defer s.rw.Unlock()
v, _ := mem.VirtualMemory()
d, _ := disk.Usage("/")
nv, _ := net.IOCounters(true)
s.Memory.Total = v.Total >> 20
s.Memory.Free = v.Available >> 20
s.Memory.Used = v.Used >> 20
s.Memory.Usage = v.UsedPercent
if cc, _ := cpu.Percent(time.Second, false); len(cc) > 0 {
s.CPUUsage = cc[0]
}
s.HardDisk.Free = d.Free >> 30
s.HardDisk.Total = d.Total >> 30
s.HardDisk.Used = d.Used >> 30
s.HardDisk.Usage = d.UsedPercent
netWorks := []NetWorkInfo{}
for i, n := range nv {
info := NetWorkInfo{
Name: n.Name,
Receive: n.BytesRecv,
Sent: n.BytesSent,
}
if s.lastNetWork != nil && len(s.lastNetWork) > i {
info.ReceiveSpeed = n.BytesRecv - s.lastNetWork[i].BytesRecv
info.SentSpeed = n.BytesSent - s.lastNetWork[i].BytesSent
}
netWorks = append(netWorks, info)
}
s.NetWork = netWorks
s.lastNetWork = nv
s.Streams = util.MapList(&Streams, func(name string, ss *Stream) StreamSummay {
return ss.Summary()
})
return s
}