stats.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package core
  2. import (
  3. "sync"
  4. )
  5. type StatCounter interface {
  6. Value() int64
  7. Set(int64) int64
  8. Add(int64) int64
  9. }
  10. type StatManager interface {
  11. Feature
  12. RegisterCounter(string) (StatCounter, error)
  13. GetCounter(string) StatCounter
  14. }
  15. // GetOrRegisterStatCounter tries to get the StatCounter first. If not exist, it then tries to create a new counter.
  16. func GetOrRegisterStatCounter(m StatManager, name string) (StatCounter, error) {
  17. counter := m.GetCounter(name)
  18. if counter != nil {
  19. return counter, nil
  20. }
  21. return m.RegisterCounter(name)
  22. }
  23. type syncStatManager struct {
  24. sync.RWMutex
  25. StatManager
  26. }
  27. func (s *syncStatManager) Start() error {
  28. s.RLock()
  29. defer s.RUnlock()
  30. if s.StatManager == nil {
  31. return nil
  32. }
  33. return s.StatManager.Start()
  34. }
  35. func (s *syncStatManager) Close() error {
  36. s.RLock()
  37. defer s.RUnlock()
  38. if s.StatManager == nil {
  39. return nil
  40. }
  41. return s.StatManager.Close()
  42. }
  43. func (s *syncStatManager) RegisterCounter(name string) (StatCounter, error) {
  44. s.RLock()
  45. defer s.RUnlock()
  46. if s.StatManager == nil {
  47. return nil, newError("StatManager not set.")
  48. }
  49. return s.StatManager.RegisterCounter(name)
  50. }
  51. func (s *syncStatManager) GetCounter(name string) StatCounter {
  52. s.RLock()
  53. defer s.RUnlock()
  54. if s.StatManager == nil {
  55. return nil
  56. }
  57. return s.StatManager.GetCounter(name)
  58. }
  59. func (s *syncStatManager) Set(m StatManager) {
  60. if m == nil {
  61. return
  62. }
  63. s.Lock()
  64. defer s.Unlock()
  65. if s.StatManager != nil {
  66. s.StatManager.Close() // nolint: errcheck
  67. }
  68. s.StatManager = m
  69. }