diff --git a/src/AppCommon/Commands/SqsCommand.cs b/src/AppCommon/Commands/SqsCommand.cs index 9bd76a9e..c996cfcd 100644 --- a/src/AppCommon/Commands/SqsCommand.cs +++ b/src/AppCommon/Commands/SqsCommand.cs @@ -74,41 +74,37 @@ protected override async Task GetData(CancellationToken cancellati var tasks = queueNames.Select(async queueName => { - var datapoints = (await aws.GetMMetricsData(queueName, cancellationToken)).OrderBy(d => d.Timestamp).ToArray(); + var response = await aws.GetMMetricsData(queueName, cancellationToken); + var datapoints = response.ToDictionary( + k => DateOnly.FromDateTime(k.Timestamp.Value), + v => (long)v.Sum.GetValueOrDefault(0) + ); + + var maxThroughput = datapoints.Values.Max(); - var maxThroughput = datapoints is { Length: > 0 } ? - (long)datapoints.Select(d => d.Sum.GetValueOrDefault(0)).Max() : 0L; // Since we get 365 days of data, if there's no throughput in that amount of time, hard to legitimately call it an endpoint if (maxThroughput > 0) { - var startTime = DateOnly.FromDateTime(datapoints.First().Timestamp.Value); - var endTime = DateOnly.FromDateTime(datapoints.Last().Timestamp.Value); - DateOnly currentDate = startTime; - var dailyData = new Dictionary(); - while (currentDate <= endTime) - { - dailyData.Add(currentDate, new DailyThroughput { MessageCount = 0, DateUTC = currentDate }); + var startTime = datapoints.Keys.Min(); + var endTime = datapoints.Keys.Max(); - currentDate = currentDate.AddDays(1); - } + var dailyData = new List(endTime.DayNumber - startTime.DayNumber + 1); - foreach (var datapoint in datapoints) + for (var currentDate = startTime; currentDate <= endTime; currentDate = currentDate.AddDays(1)) { - // There is a bug in the AWS SDK. The timestamp is actually UTC time, eventhough the DateTime returned type says Local - // See https://github.com/aws/aws-sdk-net/issues/167 - // So do not convert the timestamp to UTC time! - if (datapoint.Timestamp.HasValue) + datapoints.TryGetValue(currentDate, out var count); + dailyData.Add(new DailyThroughput { - currentDate = DateOnly.FromDateTime(datapoint.Timestamp.Value); - dailyData[currentDate] = new DailyThroughput { MessageCount = (long)datapoint.Sum.GetValueOrDefault(0), DateUTC = currentDate }; - } + MessageCount = count, + DateUTC = currentDate + }); } data.Add(new QueueThroughput { QueueName = queueName, Throughput = maxThroughput, - DailyThroughputFromBroker = [.. dailyData.Values] + DailyThroughputFromBroker = [.. dailyData] }); } diff --git a/src/Query/AmazonSQS/AwsQuery.cs b/src/Query/AmazonSQS/AwsQuery.cs index 4bfaded8..c248720f 100644 --- a/src/Query/AmazonSQS/AwsQuery.cs +++ b/src/Query/AmazonSQS/AwsQuery.cs @@ -89,8 +89,8 @@ public async Task> GetMMetricsData(string queueName, Cancellatio { Namespace = "AWS/SQS", MetricName = "NumberOfMessagesDeleted", - StartTime = StartDate.ToDateTime(TimeOnly.MinValue), - EndTime = EndDate.ToDateTime(TimeOnly.MaxValue), + StartTime = StartDate.ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc), + EndTime = EndDate.AddDays(1).ToDateTime(TimeOnly.MinValue, DateTimeKind.Utc), // Exclusive Period = 24 * 60 * 60, // 1 day Statistics = ["Sum"], Dimensions = [