Skip to content
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
b373d2a
feat(flow): implement adaptive throttler with resource monitoring and…
kxrxh Nov 18, 2025
bf9fa92
docs(README): add AdaptiveThrottler description to documentation
kxrxh Nov 19, 2025
55c5fe1
fix(flow): emit partial sliding window on early close (#192)
reugn Nov 15, 2025
2bc6a86
fix: resolve all golangci-lint issues
kxrxh Nov 19, 2025
fbc0df7
refactor(adaptive_throttler): streamline main function by removing co…
kxrxh Nov 19, 2025
0d97643
refactor: rename CPUUsageModeReal to CPUUsageModeMeasured
kxrxh Nov 19, 2025
837e3d6
feat(adaptive_throttler): enhance resource monitoring for containeriz…
kxrxh Nov 20, 2025
edfb728
Merge pull request #1 from reugn/master
kxrxh Nov 20, 2025
fa6e81f
feat(adaptive_throttler): add demo for adaptive throttling pipeline
kxrxh Nov 20, 2025
d1d210c
refactor(adaptive_throttler): update config validation message
kxrxh Nov 20, 2025
238ca8b
docs(README): fix punctuation in AdaptiveThrottler description
kxrxh Nov 20, 2025
5c7bc28
refactor(adaptive_throttler): rename resourceMonitorInterface to reso…
kxrxh Nov 20, 2025
754d39e
refactor(resource_monitor): move stats collection to initSampler
kxrxh Nov 20, 2025
135139f
refactor(adaptive_throttler): extract system monitoring into internal…
kxrxh Nov 21, 2025
a224484
refactor(sysmonitor): improve CPU time retrieval for current process
kxrxh Nov 21, 2025
04586f7
feat(adaptive_throttler): enhance demo with CPU workload simulation
kxrxh Nov 21, 2025
6ec1760
docs(adaptive_throttler): add clarification comment for constrained v…
kxrxh Nov 21, 2025
0633447
fix(sysmonitor): add safety checks for CPU count and handle memory st…
kxrxh Nov 22, 2025
fe90168
refactor(sysmonitor): unify memory reading functions for cgroup v1 an…
kxrxh Nov 22, 2025
5ab4ea1
refactor(sysmonitor): streamline memory reading logic and remove unus…
kxrxh Nov 22, 2025
a92689d
refactor(sysmonitor): additional context for errors was added
kxrxh Nov 22, 2025
c460ee3
refactor(sysmonitor): remove outdated validation comment in getProces…
kxrxh Nov 22, 2025
4eb9507
fix(sysmonitor): add overflow check for memory value conversion
kxrxh Nov 22, 2025
2e8e86a
fix(sysmonitor): enhance error handling in memory status retrieval
kxrxh Nov 22, 2025
5df55d2
docs(adaptive_throttler): update demo comments to clarify adaptive th…
kxrxh Nov 22, 2025
aaf9377
refactor(resource_monitor_test): remove unnecessary helper call in te…
kxrxh Nov 22, 2025
9b7cba6
Merge branch 'feature/adaptive-throttler' of https://github.com/kxrxh…
kxrxh Nov 22, 2025
a437518
refactor(resource_monitor): simplify comment for division by zero check
kxrxh Nov 22, 2025
08f6012
chore(dependencies): downgrade Go version to 1.23.0 and update indire…
kxrxh Nov 22, 2025
e7a1c81
feat(adaptive_throttler): enforce minimum sample interval to reduce C…
kxrxh Nov 22, 2025
226098e
fix(adaptive_throttler): prevent negative target rate in rate adaptation
kxrxh Nov 22, 2025
0707bb0
docs(adaptive_throttler): clarify comment on MemoryReader function re…
kxrxh Nov 22, 2025
df7560a
docs(adaptive_throttler): format comment for CPU usage sampling modes
kxrxh Nov 22, 2025
2964497
feat(resource_monitor): add comment to indicate start of periodic res…
kxrxh Nov 22, 2025
a5fb0d4
docs(adaptive_throttler): update MemoryReader comment for clarity on …
kxrxh Nov 22, 2025
95ce780
chore(dependencies): remove go.sum and update go.mod
kxrxh Nov 22, 2025
8fa0e0f
refactor(resource_monitor): move clampPercent and validatePercent fun…
kxrxh Nov 22, 2025
77b55f2
refactor(flow): rename util.go to operators.go for better clarity
kxrxh Nov 22, 2025
9b5f438
refactor(adaptive_throttler): remove unnecessary pointer dereference …
kxrxh Nov 22, 2025
55ca0c5
refactor(resource_monitor): change stats from atomic.Value to atomic.…
kxrxh Nov 22, 2025
d1c811e
refactor(adaptive_throttler): remove unnecessary mutex for rate adapt…
kxrxh Nov 22, 2025
5a46a4f
refactor(adaptive_throttler): reorder functions and improved adaptRat…
kxrxh Nov 22, 2025
e097d6b
feat(adaptive_throttler): add MaxBufferSize configuration and validat…
kxrxh Nov 22, 2025
cd8ad61
refactor(sysmonitor): simplify memory initialization by removing unne…
kxrxh Nov 22, 2025
809f604
fix(sysmonitor): ensure available memory does not exceed total memory
kxrxh Nov 22, 2025
904d9e9
refactor(adaptive_throttler): fix golangci-lint errors
kxrxh Nov 23, 2025
60b20a4
refactor(adaptive_throttler): change validateConfig function to a met…
kxrxh Nov 23, 2025
ab90a2c
refactor(adaptive_throttler, resource_monitor): enhance configuration…
kxrxh Nov 23, 2025
7d4abd4
test: add comprehensive test coverage for adaptive throttler and syst…
kxrxh Nov 23, 2025
604b5b5
test(resource_monitor): add tests for clamping and validation of perc…
kxrxh Nov 23, 2025
7dfff93
test(sysmonitor): refactor memory tests to use a helper function to f…
kxrxh Nov 23, 2025
6e24e80
refactor(adaptive_throttler, resource_monitor): implement shared moni…
kxrxh Nov 24, 2025
0028afc
refactor(sysmonitor): remove SetMemoryReader function from memory pla…
kxrxh Nov 27, 2025
7f375ba
refactor: enhance system monitoring and adaptive throttling
kxrxh Dec 3, 2025
153c015
test(sysmonitor): add comprehensive tests for Windows CPU and memory …
kxrxh Dec 3, 2025
583a92b
fix(adaptive_throttler): make close public and ensure proper resource…
kxrxh Dec 3, 2025
d0b57ed
fix(adaptive_throttler, resource_monitor): correct loop iteration and…
kxrxh Dec 8, 2025
3489be1
test: refactor adaptive throttler and monitor suites
kxrxh Dec 8, 2025
eb2081e
fix: stop resource monitor deterministically
kxrxh Dec 8, 2025
28df064
refactor: wait for monitor shutdown with waitgroup
kxrxh Dec 8, 2025
f38c364
refactor(resource_monitor): simplify stop timer handling during resou…
kxrxh Dec 8, 2025
1d37d65
refactor(adaptive_throttler): share rate calc, allow CPU limit 0, gua…
kxrxh Dec 8, 2025
fd6b529
refactor(flow): revert file renaming
kxrxh Jan 8, 2026
56aa42c
docs(cpu): add thread-safety notes to CPU usage documentation
kxrxh Jan 10, 2026
c5c4aca
test(adaptive_throttler): enhance validation tests and moved mocks/he…
kxrxh Jan 10, 2026
dc4c4eb
refactor(adaptive_throttler): update config validation message
kxrxh Jan 10, 2026
ba8dbff
fix(flow): make AdaptiveThrottler close() private and fix channel cle…
kxrxh Jan 10, 2026
0470199
fix(resource_monitor): handle panic in custom memory reader
kxrxh Jan 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ processing operations. These building blocks can be used to transform and manipu
- **Flatten<sup>1</sup>:** Flattens a stream of slices of elements into a stream of elements.
- **Batch:** Breaks a stream of elements into batches based on size or timing.
- **Throttler:** Limits the rate at which elements are processed.
- **AdaptiveThrottler:** Limits the rate at which elements are processed based on the current system resource utilization (CPU and memory usage).
- **SlidingWindow:** Creates overlapping windows of elements.
- **TumblingWindow:** Creates non-overlapping, fixed-size windows of elements.
- **SessionWindow:** Creates windows based on periods of activity and inactivity.
Expand Down
121 changes: 121 additions & 0 deletions examples/adaptive_throttler/demo/demo.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package main

import (
"fmt"
"math/rand"
"sync/atomic"
"time"

ext "github.com/reugn/go-streams/extension"
"github.com/reugn/go-streams/flow"
)

func main() {
var elementsProcessed atomic.Int64

// Set up demo configuration with memory simulation
throttler := setupDemoThrottler(&elementsProcessed)
defer func() {
throttler.Close()
}()

in := make(chan any)
out := make(chan any, 32)

source := ext.NewChanSource(in)
sink := ext.NewChanSink(out)

statsDone := make(chan struct{})
go logThrottlerStats(throttler, statsDone)
defer close(statsDone)

go func() {
source.
Via(throttler).
Via(flow.NewPassThrough()).
To(sink)
}()

go produceBurst(in, 250)

for element := range sink.Out {
fmt.Printf("consumer received %v\n", element)
elementsProcessed.Add(1) // Track processed elements for memory pressure simulation
time.Sleep(25 * time.Millisecond)
}

fmt.Println("adaptive throttling pipeline completed")
}

// setupDemoThrottler creates and configures an adaptive throttler with demo settings
func setupDemoThrottler(elementsProcessed *atomic.Int64) *flow.AdaptiveThrottler {
config := flow.DefaultAdaptiveThrottlerConfig()
config.MinThroughput = 5
config.MaxThroughput = 40
config.SampleInterval = 200 * time.Millisecond
config.BufferSize = 32
config.AdaptationFactor = 0.5
config.SmoothTransitions = true
config.MaxMemoryPercent = 40.0
config.MaxCPUPercent = 80.0


config.MemoryReader = func() (float64, error) {
elementCount := elementsProcessed.Load()

// Memory pressure increases with processed elements:
// - 0-50 elements: 5% memory
// - 51-100 elements: 15% memory
// - 101-150 elements: 30% memory
// - 151+ elements: 50%+ memory (increases gradually)
var memoryPercent float64
switch {
case elementCount <= 50:
memoryPercent = 5.0 + float64(elementCount)*0.2 // 5% to 15%
case elementCount <= 100:
memoryPercent = 15.0 + float64(elementCount-50)*0.3 // 15% to 30%
case elementCount <= 150:
memoryPercent = 30.0 + float64(elementCount-100)*0.4 // 30% to 50%
default:
memoryPercent = 50.0 + float64(elementCount-150)*0.3 // 50%+ (increases more slowly)
if memoryPercent > 95.0 {
memoryPercent = 95.0
}
}

return memoryPercent, nil
}

return flow.NewAdaptiveThrottler(config)
}

func produceBurst(in chan<- any, total int) {
defer close(in)

for i := 0; i < total; i++ {
in <- fmt.Sprintf("job-%02d", i)

if (i+1)%10 == 0 {
time.Sleep(180 * time.Millisecond)
continue
}

time.Sleep(time.Duration(2+rand.Intn(5)) * time.Millisecond)
}
}

func logThrottlerStats(at *flow.AdaptiveThrottler, done <-chan struct{}) {
ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()

for {
select {
case <-done:
return
case <-ticker.C:
stats := at.GetResourceStats()
fmt.Printf("[stats] rate=%d eps memory=%.1f%% cpu=%.1f%% goroutines=%d\n",
at.GetCurrentRate(), stats.MemoryUsedPercent, stats.CPUUsagePercent, stats.GoroutineCount)
}
}
}
44 changes: 44 additions & 0 deletions examples/adaptive_throttler/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package main

import (
"fmt"
"strings"
"time"

ext "github.com/reugn/go-streams/extension"
"github.com/reugn/go-streams/flow"
)

func editMessage(msg string) string {
return strings.ToUpper(msg)
}

func main() {
// To setup a custom throttler, you can modify the throttlerConfig struct with your desired values.
// For all available options, see the flow.AdaptiveThrottlerConfig struct.
throttlerConfig := flow.DefaultAdaptiveThrottlerConfig()
throttler := flow.NewAdaptiveThrottler(throttlerConfig)
defer throttler.Close()

in := make(chan any)

source := ext.NewChanSource(in)
editMapFlow := flow.NewMap(editMessage, 1)
sink := ext.NewStdoutSink()

go func() {
source.Via(throttler).Via(editMapFlow).To(sink)
}()

go func() {
defer close(in)

for i := 1; i <= 50; i++ {
message := fmt.Sprintf("message-%d", i)
in <- message
time.Sleep(50 * time.Millisecond)
}
}()

sink.AwaitCompletion()
}
13 changes: 11 additions & 2 deletions examples/go.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
module github.com/reugn/go-streams/examples

go 1.23.0
go 1.24.0

require (
cloud.google.com/go/storage v1.53.0
Expand Down Expand Up @@ -73,13 +73,15 @@ require (
github.com/eapache/go-resiliency v1.7.0 // indirect
github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect
github.com/eapache/queue v1.1.0 // indirect
github.com/ebitengine/purego v0.9.1 // indirect
github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect
github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect
github.com/fatih/color v1.13.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/go-jose/go-jose/v4 v4.0.4 // indirect
github.com/go-logr/logr v1.4.2 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-jwt/jwt/v5 v5.2.2 // indirect
Expand All @@ -104,6 +106,7 @@ require (
github.com/jcmturner/rpc/v2 v2.0.3 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/minio/highwayhash v1.0.3 // indirect
Expand All @@ -118,16 +121,21 @@ require (
github.com/pierrec/lz4/v4 v4.1.22 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/prometheus/client_golang v1.20.5 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
github.com/shirou/gopsutil/v4 v4.25.10 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/spiffe/go-spiffe/v2 v2.5.0 // indirect
github.com/tklauser/go-sysconf v0.3.16 // indirect
github.com/tklauser/numcpus v0.11.0 // indirect
github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad // indirect
github.com/yuin/gopher-lua v1.1.1 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
github.com/zeebo/errs v1.4.0 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect
Expand All @@ -144,7 +152,7 @@ require (
golang.org/x/net v0.39.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.32.0 // indirect
golang.org/x/sys v0.38.0 // indirect
golang.org/x/term v0.31.0 // indirect
golang.org/x/text v0.24.0 // indirect
golang.org/x/time v0.11.0 // indirect
Expand All @@ -166,6 +174,7 @@ require (
)

replace (
github.com/reugn/go-streams => ..
github.com/reugn/go-streams/aerospike => ../aerospike
github.com/reugn/go-streams/aws => ../aws
github.com/reugn/go-streams/azure => ../azure
Expand Down
40 changes: 23 additions & 17 deletions examples/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4A
github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0=
github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc=
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/ebitengine/purego v0.9.1 h1:a/k2f2HQU3Pi399RPW1MOaZyhKJL9w/xFpKAg4q1s0A=
github.com/ebitengine/purego v0.9.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=
github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA=
github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=
Expand All @@ -175,8 +177,9 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
Expand Down Expand Up @@ -266,8 +269,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 h1:PwQumkgq4/acIiZhtifTV5OUqqiP82UAl0h87xj/l9k=
github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg=
github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
Expand Down Expand Up @@ -343,8 +346,8 @@ github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgm
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
Expand All @@ -361,12 +364,12 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5X
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/redis/go-redis/v9 v9.8.0 h1:q3nRvjrlge/6UD7eTu/DSg2uYiU2mCL0G/uzBWqhicI=
github.com/redis/go-redis/v9 v9.8.0/go.mod h1:huWgSWd8mW6+m0VPhJjSSQ+d6Nh1VICQ6Q5lHuCH/Iw=
github.com/reugn/go-streams v0.12.0 h1:SEfTZw5+iP0mQG0jWTxVOHMbqlbZjUB0W6dF3XbYd5Q=
github.com/reugn/go-streams v0.12.0/go.mod h1:dnXv6QgVTW62gEpILoLHRjI95Es7ECK2/+j9h17aIN8=
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/shirou/gopsutil/v3 v3.23.12 h1:z90NtUkp3bMtmICZKpC4+WaknU1eXtp5vtbQ11DgpE4=
github.com/shirou/gopsutil/v3 v3.23.12/go.mod h1:1FrWgea594Jp7qmjHUUPlJDTPgcsb9mGnXDxavtikzM=
github.com/shirou/gopsutil/v4 v4.25.10 h1:at8lk/5T1OgtuCp+AwrDofFRjnvosn0nkN2OLQ6g8tA=
github.com/shirou/gopsutil/v4 v4.25.10/go.mod h1:+kSwyC8DRUD9XXEHCAFjK+0nuArFJM0lva+StQAcskM=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
Expand All @@ -388,14 +391,14 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/testcontainers/testcontainers-go v0.35.0 h1:uADsZpTKFAtp8SLK+hMwSaa+X+JiERHtd4sQAFmXeMo=
github.com/testcontainers/testcontainers-go v0.35.0/go.mod h1:oEVBj5zrfJTrgjwONs1SsRbnBtH9OKl+IGl3UMcr2B4=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA=
github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI=
github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=
github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad h1:W0LEBv82YCGEtcmPA3uNZBI33/qF//HAAs3MawDjRa0=
github.com/wadey/gocovmerge v0.0.0-20160331181800-b5bfa59ec0ad/go.mod h1:Hy8o65+MXnS6EwGElrSRjUzQDLXreJlzYLlWiHtt8hM=
Expand All @@ -404,8 +407,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yuin/gopher-lua v1.1.1 h1:kYKnWBjvbNP4XLT3+bPEwAXJx262OhaHDWDVOPjL46M=
github.com/yuin/gopher-lua v1.1.1/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0=
Expand Down Expand Up @@ -470,21 +473,24 @@ golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
Expand Down
Loading
Loading