// 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 }