stats.go 1.1 KB

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