|
|
@@ -4,33 +4,49 @@ import (
|
|
|
"runtime"
|
|
|
"sync"
|
|
|
"time"
|
|
|
+
|
|
|
+ "github.com/manucorporat/stats"
|
|
|
)
|
|
|
|
|
|
+var messages = stats.New()
|
|
|
+var users = stats.New()
|
|
|
var mutexStats sync.RWMutex
|
|
|
var savedStats map[string]uint64
|
|
|
|
|
|
func statsWorker() {
|
|
|
c := time.Tick(1 * time.Second)
|
|
|
+ var lastMallocs uint64 = 0
|
|
|
+ var lastFrees uint64 = 0
|
|
|
for range c {
|
|
|
var stats runtime.MemStats
|
|
|
runtime.ReadMemStats(&stats)
|
|
|
|
|
|
mutexStats.Lock()
|
|
|
savedStats = map[string]uint64{
|
|
|
- "timestamp": uint64(time.Now().Unix()),
|
|
|
- "HeapInuse": stats.HeapInuse,
|
|
|
- "StackInuse": stats.StackInuse,
|
|
|
- "NuGoroutines": uint64(runtime.NumGoroutine()),
|
|
|
- "Mallocs": stats.Mallocs,
|
|
|
- "Frees": stats.Mallocs,
|
|
|
- "Inbound": uint64(messages.Get("inbound")),
|
|
|
- "Outbound": uint64(messages.Get("outbound")),
|
|
|
+ "timestamp": uint64(time.Now().Unix()),
|
|
|
+ "HeapInuse": stats.HeapInuse,
|
|
|
+ "StackInuse": stats.StackInuse,
|
|
|
+ "Mallocs": (stats.Mallocs - lastMallocs),
|
|
|
+ "Frees": (stats.Frees - lastFrees),
|
|
|
+ "Inbound": uint64(messages.Get("inbound")),
|
|
|
+ "Outbound": uint64(messages.Get("outbound")),
|
|
|
+ "Connected": connectedUsers(),
|
|
|
}
|
|
|
+ lastMallocs = stats.Mallocs
|
|
|
+ lastFrees = stats.Frees
|
|
|
messages.Reset()
|
|
|
mutexStats.Unlock()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func connectedUsers() uint64 {
|
|
|
+ connected := users.Get("connected") - users.Get("disconnected")
|
|
|
+ if connected < 0 {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ return uint64(connected)
|
|
|
+}
|
|
|
+
|
|
|
func Stats() map[string]uint64 {
|
|
|
mutexStats.RLock()
|
|
|
defer mutexStats.RUnlock()
|