49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package loadaverage
|
|
|
|
import (
|
|
"math"
|
|
"time"
|
|
)
|
|
|
|
// Constants for calculating EMA
|
|
|
|
const SAMPLE_DELAY time.Duration = time.Second * 5
|
|
|
|
var (
|
|
ONE_MIN_ALPHA float64 = math.Exp(-SAMPLE_DELAY.Seconds() / 60.0) // e^(-dt/W), where dt is the sample time and W
|
|
FIVE_MIN_ALPHA float64 = math.Exp(-SAMPLE_DELAY.Seconds() / 300.0) // is the target timeframe. eg.: 60 for one min
|
|
FIFTEEN_MIN_ALPHA float64 = math.Exp(-SAMPLE_DELAY.Seconds() / 900.0)
|
|
)
|
|
|
|
type LoadAverageInformation struct {
|
|
/*
|
|
* Load average in the past minute
|
|
*/
|
|
Load1 float64
|
|
/*
|
|
* Load average in the past 5 minutes
|
|
*/
|
|
Load5 float64
|
|
/*
|
|
* Load average in the past 15 minutes
|
|
*/
|
|
Load15 float64
|
|
|
|
initialized bool // track whether this is the first measurement or not
|
|
}
|
|
|
|
func (loadAvg *LoadAverageInformation) Update(currentSample float64) {
|
|
if !loadAvg.initialized {
|
|
// Seed the initial averages with the first sample to avoid a slow ramp-up from zero
|
|
loadAvg.Load1 = currentSample
|
|
loadAvg.Load5 = currentSample
|
|
loadAvg.Load15 = currentSample
|
|
loadAvg.initialized = true
|
|
return
|
|
}
|
|
|
|
loadAvg.Load1 = loadAvg.Load1*ONE_MIN_ALPHA + currentSample*(1.0-ONE_MIN_ALPHA)
|
|
loadAvg.Load5 = loadAvg.Load5*FIVE_MIN_ALPHA + currentSample*(1.0-FIVE_MIN_ALPHA)
|
|
loadAvg.Load15 = loadAvg.Load15*FIFTEEN_MIN_ALPHA + currentSample*(1.0-FIFTEEN_MIN_ALPHA)
|
|
}
|