-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcounter.go
101 lines (84 loc) · 2.18 KB
/
counter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package timemetrics
import (
"fmt"
"sync/atomic"
"time"
)
// Counters hold an int64 value that can be incremented and decremented.
type Counter interface {
Clear(time.Time)
Count() int64
Dec(time.Time, int64)
Inc(time.Time, int64)
Update(time.Time, int64)
GetMaxTime() time.Time
GetKeys(time.Time, string, bool) []string
NbKeys() int
Stale(time.Time) bool
PushKeysTime(time.Time) bool
ZeroOut()
}
// NewCounter constructs a new StandardCounter.
func NewCounter(t time.Time, staleThreshold int) Counter {
return &StandardCounter{0, t, staleThreshold}
}
// StandardCounter is the standard implementation of a Counter and uses the
// sync/atomic package to manage a single int64 value.
type StandardCounter struct {
count int64
lastUpdate time.Time
staleThreshold int
}
// Clear sets the counter to zero.
func (c *StandardCounter) Clear(t time.Time) {
atomic.StoreInt64(&c.count, 0)
c.lastUpdate = t
}
// Count returns the current count.
func (c *StandardCounter) Count() int64 {
return atomic.LoadInt64(&c.count)
}
// Dec decrements the counter by the given amount.
func (c *StandardCounter) Dec(t time.Time, i int64) {
atomic.AddInt64(&c.count, -i)
if t.After(c.lastUpdate) {
c.lastUpdate = t
}
}
// Inc increments the counter by the given amount.
func (c *StandardCounter) Inc(t time.Time, i int64) {
atomic.AddInt64(&c.count, i)
if t.After(c.lastUpdate) {
c.lastUpdate = t
}
}
func (c *StandardCounter) Update(t time.Time, i int64) {
c.Inc(t, i)
}
func (c *StandardCounter) GetMaxTime() time.Time {
return c.lastUpdate
}
func (c *StandardCounter) GetKeys(ct time.Time, name string, currentTime bool) []string {
var t int64
if currentTime {
t = ct.Unix()
} else {
t = c.GetMaxTime().Unix()
}
keys := make([]string, 1)
keys[0] = fmt.Sprintf(name, "count", t, fmt.Sprintf("%d", c.Count()))
return keys
}
func (c *StandardCounter) NbKeys() int {
return 1
}
func (c *StandardCounter) Stale(t time.Time) bool {
return t.Sub(c.GetMaxTime()) > time.Duration(c.staleThreshold)*time.Minute
}
func (c *StandardCounter) PushKeysTime(t time.Time) bool {
return c.lastUpdate.After(t)
}
func (c *StandardCounter) ZeroOut() {
//Nothing to do for counters
return
}