]> git.r.bdr.sh - rbdr/mobius/blame - hotline/stats.go
Extensive refactor, quality of life enhancements
[rbdr/mobius] / hotline / stats.go
CommitLineData
6988a057
JH
1package hotline
2
3import (
a2ef262a 4 "sync"
6988a057
JH
5 "time"
6)
7
d9bc63a1
JH
8// Stat counter keys
9const (
10 StatCurrentlyConnected = iota
11 StatDownloadsInProgress
12 StatUploadsInProgress
13 StatWaitingDownloads
14 StatConnectionPeak
15 StatConnectionCounter
16 StatDownloadCounter
17 StatUploadCounter
18)
19
20type Counter interface {
21 Increment(keys ...int)
22 Decrement(key int)
23 Set(key, val int)
24 Get(key int) int
25 Values() map[string]interface{}
26}
27
6988a057 28type Stats struct {
d9bc63a1
JH
29 stats map[int]int
30 since time.Time
31
32 mu sync.RWMutex
33}
34
35func NewStats() *Stats {
36 return &Stats{
37 since: time.Now(),
38 stats: map[int]int{
39 StatCurrentlyConnected: 0,
40 StatDownloadsInProgress: 0,
41 StatUploadsInProgress: 0,
42 StatWaitingDownloads: 0,
43 StatConnectionPeak: 0,
44 StatDownloadCounter: 0,
45 StatUploadCounter: 0,
46 StatConnectionCounter: 0,
47 },
48 }
49}
50
51func (s *Stats) Increment(keys ...int) {
52 s.mu.Lock()
53 defer s.mu.Unlock()
54
55 for _, key := range keys {
56 s.stats[key]++
57 }
58}
59
60func (s *Stats) Decrement(key int) {
61 s.mu.Lock()
62 defer s.mu.Unlock()
63
64 s.stats[key]--
65}
66
67func (s *Stats) Set(key, val int) {
68 s.mu.Lock()
69 defer s.mu.Unlock()
70
71 s.stats[key] = val
72}
73
74func (s *Stats) Get(key int) int {
75 s.mu.RLock()
76 defer s.mu.RUnlock()
77
78 return s.stats[key]
79}
80
81func (s *Stats) Values() map[string]interface{} {
82 s.mu.RLock()
83 defer s.mu.RUnlock()
84
85 return map[string]interface{}{
86 "CurrentlyConnected": s.stats[StatCurrentlyConnected],
87 "DownloadsInProgress": s.stats[StatDownloadsInProgress],
88 "UploadsInProgress": s.stats[StatUploadsInProgress],
89 "WaitingDownloads": s.stats[StatWaitingDownloads],
90 "ConnectionPeak": s.stats[StatConnectionPeak],
91 "ConnectionCounter": s.stats[StatConnectionCounter],
92 "DownloadCounter": s.stats[StatDownloadCounter],
93 "UploadCounter": s.stats[StatUploadCounter],
94 "Since": s.since,
95 }
6988a057 96}