Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
exchain
nebula
Commits
e35e8bf2
Commit
e35e8bf2
authored
Apr 24, 2023
by
Felipe Andrade
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sliding window pkg
parent
3006ef0c
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
457 additions
and
0 deletions
+457
-0
go.mod
proxyd/go.mod
+1
-0
go.sum
proxyd/go.sum
+2
-0
sliding.go
proxyd/pkg/avg-sliding-window/sliding.go
+176
-0
sliding_test.go
proxyd/pkg/avg-sliding-window/sliding_test.go
+278
-0
No files found.
proxyd/go.mod
View file @
e35e8bf2
...
@@ -31,6 +31,7 @@ require (
...
@@ -31,6 +31,7 @@ require (
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/edsrzf/mmap-go v1.1.0 // indirect
github.com/edsrzf/mmap-go v1.1.0 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/fjl/memsize v0.0.1 // indirect
github.com/fjl/memsize v0.0.1 // indirect
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect
github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
...
...
proxyd/go.sum
View file @
e35e8bf2
...
@@ -140,6 +140,8 @@ github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7j
...
@@ -140,6 +140,8 @@ github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7j
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ=
github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ=
github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q=
github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
...
...
proxyd/pkg/avg-sliding-window/sliding.go
0 → 100644
View file @
e35e8bf2
package
avg_sliding_window
import
(
"time"
lm
"github.com/emirpasic/gods/maps/linkedhashmap"
)
type
Clock
interface
{
Now
()
time
.
Time
}
// DefaultClock provides a clock that gets current time from the system time
type
DefaultClock
struct
{}
func
NewDefaultClock
()
*
DefaultClock
{
return
&
DefaultClock
{}
}
func
(
c
DefaultClock
)
Now
()
time
.
Time
{
return
time
.
Now
()
}
// AdjustableClock provides a static clock to easily override the system time
type
AdjustableClock
struct
{
now
time
.
Time
}
func
NewAdjustableClock
(
now
time
.
Time
)
*
AdjustableClock
{
return
&
AdjustableClock
{
now
:
now
}
}
func
(
c
*
AdjustableClock
)
Now
()
time
.
Time
{
return
c
.
now
}
func
(
c
*
AdjustableClock
)
Set
(
now
time
.
Time
)
{
c
.
now
=
now
}
type
bucket
struct
{
sum
float64
qty
uint
}
// AvgSlidingWindow calculates moving averages efficiently.
// Data points are rounded to nearest bucket of size `bucketSize`,
// and evicted when they are too old based on `windowLength`
type
AvgSlidingWindow
struct
{
bucketSize
time
.
Duration
windowLength
time
.
Duration
clock
Clock
buckets
*
lm
.
Map
qty
uint
sum
float64
}
type
SlidingWindowOpts
func
(
sw
*
AvgSlidingWindow
)
func
NewSlidingWindow
(
opts
...
SlidingWindowOpts
)
*
AvgSlidingWindow
{
sw
:=
&
AvgSlidingWindow
{
buckets
:
lm
.
New
(),
}
for
_
,
opt
:=
range
opts
{
opt
(
sw
)
}
if
sw
.
bucketSize
==
0
{
sw
.
bucketSize
=
time
.
Second
}
if
sw
.
windowLength
==
0
{
sw
.
windowLength
=
5
*
time
.
Minute
}
if
sw
.
clock
==
nil
{
sw
.
clock
=
NewDefaultClock
()
}
return
sw
}
func
WithWindowLength
(
windowLength
time
.
Duration
)
SlidingWindowOpts
{
return
func
(
sw
*
AvgSlidingWindow
)
{
sw
.
windowLength
=
windowLength
}
}
func
WithBucketSize
(
bucketSize
time
.
Duration
)
SlidingWindowOpts
{
return
func
(
sw
*
AvgSlidingWindow
)
{
sw
.
bucketSize
=
bucketSize
}
}
func
WithClock
(
clock
Clock
)
SlidingWindowOpts
{
return
func
(
sw
*
AvgSlidingWindow
)
{
sw
.
clock
=
clock
}
}
func
(
sw
*
AvgSlidingWindow
)
inWindow
(
t
time
.
Time
)
bool
{
now
:=
sw
.
clock
.
Now
()
.
Round
(
sw
.
bucketSize
)
windowStart
:=
now
.
Add
(
-
sw
.
windowLength
)
return
windowStart
.
Before
(
t
)
&&
!
t
.
After
(
now
)
}
// Add inserts a new data point into the window, with value `val` with the current time
func
(
sw
*
AvgSlidingWindow
)
Add
(
val
float64
)
{
t
:=
sw
.
clock
.
Now
()
sw
.
AddWithTime
(
t
,
val
)
}
// AddWithTime inserts a new data point into the window, with value `val` and time `t`
func
(
sw
*
AvgSlidingWindow
)
AddWithTime
(
t
time
.
Time
,
val
float64
)
{
sw
.
advance
()
key
:=
t
.
Round
(
sw
.
bucketSize
)
if
!
sw
.
inWindow
(
key
)
{
return
}
var
b
*
bucket
current
,
found
:=
sw
.
buckets
.
Get
(
key
)
if
!
found
{
b
=
&
bucket
{}
}
else
{
b
=
current
.
(
*
bucket
)
}
// update bucket
bsum
:=
b
.
sum
b
.
qty
+=
1
b
.
sum
=
bsum
+
val
// update window
wsum
:=
sw
.
sum
sw
.
qty
+=
1
sw
.
sum
=
wsum
-
bsum
+
b
.
sum
sw
.
buckets
.
Put
(
key
,
b
)
}
// advance evicts old data points
func
(
sw
*
AvgSlidingWindow
)
advance
()
{
now
:=
sw
.
clock
.
Now
()
.
Round
(
sw
.
bucketSize
)
windowStart
:=
now
.
Add
(
-
sw
.
windowLength
)
keys
:=
sw
.
buckets
.
Keys
()
for
_
,
k
:=
range
keys
{
if
k
.
(
time
.
Time
)
.
After
(
windowStart
)
{
break
}
val
,
_
:=
sw
.
buckets
.
Get
(
k
)
b
:=
val
.
(
*
bucket
)
sw
.
buckets
.
Remove
(
k
)
if
sw
.
buckets
.
Size
()
>
0
{
sw
.
qty
-=
b
.
qty
sw
.
sum
=
sw
.
sum
-
b
.
sum
}
else
{
sw
.
qty
=
0
sw
.
sum
=
0.0
}
}
}
// Avg retrieves the current average for the sliding window
func
(
sw
*
AvgSlidingWindow
)
Avg
()
float64
{
sw
.
advance
()
if
sw
.
qty
==
0
{
return
0
}
return
sw
.
sum
/
float64
(
sw
.
qty
)
}
// Sum retrieves the current sum for the sliding window
func
(
sw
*
AvgSlidingWindow
)
Sum
()
float64
{
sw
.
advance
()
return
sw
.
sum
}
// Count retrieves the data point count for the sliding window
func
(
sw
*
AvgSlidingWindow
)
Count
()
uint
{
sw
.
advance
()
return
sw
.
qty
}
proxyd/pkg/avg-sliding-window/sliding_test.go
0 → 100644
View file @
e35e8bf2
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment