stats.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package stats
  2. import (
  3. "sync/atomic"
  4. )
  5. // Stats holds statistics counters thread safely
  6. type Stats struct {
  7. requestsInProgress int64
  8. imagesInProgress int64
  9. WorkersNumber int
  10. }
  11. // New creates a new Stats instance
  12. func New(workersNumber int) *Stats {
  13. return &Stats{
  14. WorkersNumber: workersNumber,
  15. }
  16. }
  17. // RequestsInProgress returns the current number of requests in progress
  18. func (s *Stats) RequestsInProgress() float64 {
  19. return float64(atomic.LoadInt64(&s.requestsInProgress))
  20. }
  21. // IncRequestsInProgress increments the requests in progress counter
  22. func (s *Stats) IncRequestsInProgress() {
  23. atomic.AddInt64(&s.requestsInProgress, 1)
  24. }
  25. // DecRequestsInProgress decrements the requests in progress counter
  26. func (s *Stats) DecRequestsInProgress() {
  27. atomic.AddInt64(&s.requestsInProgress, -1)
  28. }
  29. // ImagesInProgress returns the current number of images being processed
  30. func (s *Stats) ImagesInProgress() float64 {
  31. return float64(atomic.LoadInt64(&s.imagesInProgress))
  32. }
  33. // IncImagesInProgress increments the images in progress counter
  34. func (s *Stats) IncImagesInProgress() {
  35. atomic.AddInt64(&s.imagesInProgress, 1)
  36. }
  37. // DecImagesInProgress decrements the images in progress counter
  38. func (s *Stats) DecImagesInProgress() {
  39. atomic.AddInt64(&s.imagesInProgress, -1)
  40. }
  41. // WorkersUtilization returns the current workers utilization percentage
  42. func (s *Stats) WorkersUtilization() float64 {
  43. if s.WorkersNumber == 0 {
  44. return 0.0
  45. }
  46. return s.RequestsInProgress() / float64(s.WorkersNumber) * 100.0
  47. }