in appinsights/telemetry.go [290:325]
func (agg *AggregateMetricTelemetry) addData(values []float64, vsum float64) float64 {
if len(values) == 0 {
return vsum
}
// Running tally of the mean is important for incremental variance computation.
var mean float64
if agg.Count == 0 {
agg.Min = values[0]
agg.Max = values[0]
} else {
mean = agg.Value / float64(agg.Count)
}
for _, x := range values {
// Update Min, Max, Count, and Value
agg.Count++
agg.Value += x
if x < agg.Min {
agg.Min = x
}
if x > agg.Max {
agg.Max = x
}
// Welford's algorithm to compute variance. The divide occurs in the caller.
newMean := agg.Value / float64(agg.Count)
vsum += (x - mean) * (x - newMean)
mean = newMean
}
return vsum
}