0
0
mirror of https://github.com/PostHog/posthog.git synced 2024-11-22 08:40:03 +01:00
posthog/livestream/ttl_counter.go
2024-08-14 15:58:36 -07:00

62 lines
1.1 KiB
Go

package main
import (
"sync"
"time"
)
type SlidingWindowCounter struct {
mu sync.Mutex
events []time.Time
windowSize time.Duration
}
func NewSlidingWindowCounter(windowSize time.Duration) *SlidingWindowCounter {
swc := &SlidingWindowCounter{
events: make([]time.Time, 0),
windowSize: windowSize,
}
// Start a goroutine to periodically remove old events
go func() {
ticker := time.NewTicker(time.Second)
defer ticker.Stop()
for range ticker.C {
swc.mu.Lock()
swc.removeOldEvents(time.Now())
swc.mu.Unlock()
}
}()
return swc
}
func (swc *SlidingWindowCounter) Increment() {
swc.mu.Lock()
defer swc.mu.Unlock()
now := time.Now()
swc.events = append(swc.events, now)
}
func (swc *SlidingWindowCounter) Count() int {
swc.mu.Lock()
defer swc.mu.Unlock()
now := time.Now()
swc.removeOldEvents(now)
return len(swc.events)
}
func (swc *SlidingWindowCounter) removeOldEvents(now time.Time) {
cutoff := now.Add(-swc.windowSize)
i := 0
for ; i < len(swc.events); i++ {
if swc.events[i].After(cutoff) {
break
}
}
swc.events = swc.events[i:]
}