pkg/degradation-detector/inferDegradations.go (30 lines of code) (raw):
package degradation_detector
import (
"runtime"
"sync"
"github.com/alitto/pond"
)
type DegradationWithSettings struct {
Details Degradation
Settings Settings
}
func InferDegradations(data <-chan QueryResultWithSettings) <-chan DegradationWithSettings {
degradationChan := make(chan DegradationWithSettings, 100)
go func() {
var wg sync.WaitGroup
pool := pond.New(runtime.NumCPU(), 1000)
defer pool.StopAndWait()
for datum := range data {
wg.Add(1)
pool.Submit(func() {
defer wg.Done()
for _, degradation := range detectDegradations(datum.values, datum.builds, datum.timestamps, datum.Settings) {
degradationChan <- DegradationWithSettings{Details: degradation, Settings: datum.Settings}
}
})
}
wg.Wait()
close(degradationChan)
}()
return degradationChan
}