59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"runtime"
|
||
|
"sync"
|
||
|
"time"
|
||
|
|
||
|
"github.com/manucorporat/stats"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
ips = stats.New()
|
||
|
messages = stats.New()
|
||
|
users = stats.New()
|
||
|
mutexStats sync.RWMutex
|
||
|
savedStats map[string]uint64
|
||
|
)
|
||
|
|
||
|
func statsWorker() {
|
||
|
c := time.Tick(1 * time.Second)
|
||
|
var lastMallocs uint64
|
||
|
var lastFrees uint64
|
||
|
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,
|
||
|
"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()
|
||
|
|
||
|
return savedStats
|
||
|
}
|