stats.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package main
  2. import (
  3. "runtime"
  4. "sync"
  5. "time"
  6. "github.com/manucorporat/stats"
  7. )
  8. var ips = stats.New()
  9. var messages = stats.New()
  10. var users = stats.New()
  11. var mutexStats sync.RWMutex
  12. var savedStats map[string]uint64
  13. func statsWorker() {
  14. c := time.Tick(1 * time.Second)
  15. var lastMallocs uint64
  16. var lastFrees uint64
  17. for range c {
  18. var stats runtime.MemStats
  19. runtime.ReadMemStats(&stats)
  20. mutexStats.Lock()
  21. savedStats = map[string]uint64{
  22. "timestamp": uint64(time.Now().Unix()),
  23. "HeapInuse": stats.HeapInuse,
  24. "StackInuse": stats.StackInuse,
  25. "Mallocs": (stats.Mallocs - lastMallocs),
  26. "Frees": (stats.Frees - lastFrees),
  27. "Inbound": uint64(messages.Get("inbound")),
  28. "Outbound": uint64(messages.Get("outbound")),
  29. "Connected": connectedUsers(),
  30. }
  31. lastMallocs = stats.Mallocs
  32. lastFrees = stats.Frees
  33. messages.Reset()
  34. mutexStats.Unlock()
  35. }
  36. }
  37. func connectedUsers() uint64 {
  38. connected := users.Get("connected") - users.Get("disconnected")
  39. if connected < 0 {
  40. return 0
  41. }
  42. return uint64(connected)
  43. }
  44. func Stats() map[string]uint64 {
  45. mutexStats.RLock()
  46. defer mutexStats.RUnlock()
  47. return savedStats
  48. }