in pkg/ec2pricing/spotpricing.go [176:198]
func (c *SpotPricing) calculateSpotAggregate(spotPriceEntries []*spotPricingEntry) float64 {
if len(spotPriceEntries) == 0 {
return 0.0
}
if len(spotPriceEntries) == 1 {
return spotPriceEntries[0].SpotPrice
}
// Sort slice by timestamp in descending order from the end time (most likely, now)
sort.Slice(spotPriceEntries, func(i, j int) bool {
return spotPriceEntries[i].Timestamp.After(spotPriceEntries[j].Timestamp)
})
endTime := spotPriceEntries[0].Timestamp
startTime := spotPriceEntries[len(spotPriceEntries)-1].Timestamp
totalDuration := endTime.Sub(startTime).Minutes()
priceSum := float64(0)
for i, entry := range spotPriceEntries {
duration := spotPriceEntries[int(math.Max(float64(i-1), 0))].Timestamp.Sub(entry.Timestamp).Minutes()
priceSum += duration * entry.SpotPrice
}
return priceSum / totalDuration
}