// div3Sigma sets given metric score and average via 3-sigma. // states that nearly all values (99.7%) lie within the 3 standard deviations // of the mean in a normal distribution. func (d *Detector) div3Sigma(m *models.Metric, vals []float64) { if len(vals) == 0 { m.Score = 0 m.Average = m.Value return } // Values average and standard deviation. avg := mathutil.Average(vals) std := mathutil.StdDev(vals, avg) // Set metric average m.Average = avg // Set metric score if len(vals) <= int(d.cfg.Detector.LeastCount) { // Number of values not enough m.Score = 0 return } last := m.Value if std == 0 { // Eadger switch { case last == avg: m.Score = 0 case last > avg: m.Score = 1 case last < avg: m.Score = -1 } return } m.Score = (last - avg) / (3 * std) // 3-sigma }
// Aggregate QueryCost. func aggregationQueryCost() { h.info.lock.Lock() defer h.info.lock.Unlock() h.queryCostsLock.Lock() defer h.queryCostsLock.Unlock() h.info.QueryCost = mathutil.Average(h.queryCosts) h.queryCosts = h.queryCosts[:0] }
// Aggregate FilterCost. func aggregationFilterCost() { h.info.lock.Lock() defer h.info.lock.Unlock() h.filterCostsLock.Lock() defer h.filterCostsLock.Unlock() h.info.FilterCost = mathutil.Average(h.filterCosts) h.filterCosts = h.filterCosts[:0] }
// Aggregate DetectionCost. func aggregateDetectionCost() { h.info.lock.Lock() defer h.info.lock.Unlock() h.detectionCostsLock.Lock() defer h.detectionCostsLock.Unlock() h.info.DetectionCost = mathutil.Average(h.detectionCosts) h.detectionCosts = h.detectionCosts[:0] }