in pkg/ec2pricing/spotpricing.go [247:291]
func (c *SpotPricing) fetchSpotPricingTimeSeries(ctx context.Context, instanceType ec2types.InstanceType, days int) (map[string][]*spotPricingEntry, error) {
start := time.Now()
calls := 0
defer func() {
c.logger.Printf("Took %s and %d calls to collect Spot pricing", time.Since(start), calls)
}()
spotTimeSeries := map[string][]*spotPricingEntry{}
endTime := time.Now().UTC()
startTime := endTime.Add(time.Hour * time.Duration(24*-1*days))
spotPriceHistInput := ec2.DescribeSpotPriceHistoryInput{
ProductDescriptions: []string{productDescription},
StartTime: &startTime,
EndTime: &endTime,
}
if instanceType != "" {
spotPriceHistInput.InstanceTypes = append(spotPriceHistInput.InstanceTypes, instanceType)
}
var processingErr error
p := ec2.NewDescribeSpotPriceHistoryPaginator(c.ec2Client, &spotPriceHistInput)
// Iterate through the Amazon S3 object pages.
for p.HasMorePages() {
calls++
spotHistoryOutput, err := p.NextPage(ctx)
if err != nil {
return nil, fmt.Errorf("failed to get a spot pricing page, %w", err)
}
for _, history := range spotHistoryOutput.SpotPriceHistory {
spotPrice, errFloat := strconv.ParseFloat(*history.SpotPrice, 64)
if errFloat != nil {
processingErr = multierr.Append(processingErr, errFloat)
continue
}
spotTimeSeries[string(history.InstanceType)] = append(spotTimeSeries[string(history.InstanceType)], &spotPricingEntry{
Timestamp: *history.Timestamp,
SpotPrice: spotPrice,
Zone: *history.AvailabilityZone,
})
}
}
return spotTimeSeries, processingErr
}