diff --git a/src/WorkflowManager/Database/Repositories/TaskExecutionStatsRepository.cs b/src/WorkflowManager/Database/Repositories/TaskExecutionStatsRepository.cs index 4a69a8c23..4d2a79d7b 100644 --- a/src/WorkflowManager/Database/Repositories/TaskExecutionStatsRepository.cs +++ b/src/WorkflowManager/Database/Repositories/TaskExecutionStatsRepository.cs @@ -151,16 +151,11 @@ await _taskExecutionStatsCollection.UpdateOneAsync(o => public async Task> GetStatsAsync(DateTime startTime, DateTime endTime, int PageSize = 10, int PageNumber = 1, string workflowId = "", string taskId = "") { - startTime = startTime.ToUniversalTime(); + CreateFilter(startTime, endTime, workflowId, taskId, out var builder, out var filter); - var workflowNull = string.IsNullOrWhiteSpace(workflowId); - var taskIdNull = string.IsNullOrWhiteSpace(taskId); + filter &= builder.Where(GetExecutedTasksFilter()); - var result = await _taskExecutionStatsCollection.Find(T => - T.StartedUTC >= startTime && - T.StartedUTC <= endTime.ToUniversalTime() && - (workflowNull || T.WorkflowId == workflowId) && - (taskIdNull || T.TaskId == taskId)) + var result = await _taskExecutionStatsCollection.Find(filter) .Limit(PageSize) .Skip((PageNumber - 1) * PageSize) .ToListAsync(); @@ -222,25 +217,44 @@ public async Task GetStatsStatusCountAsync(DateTime startTime, DateTime en } public async Task GetStatsCountAsync(DateTime startTime, DateTime endTime, Expression>? statusFilter = null, string workflowId = "", string taskId = "") + { + CreateFilter(startTime, endTime, workflowId, taskId, out var builder, out var filter); + + if (statusFilter is not null) + { + filter &= builder.Where(statusFilter); + } + + return await _taskExecutionStatsCollection.CountDocumentsAsync(filter); + } + + private static void CreateFilter(DateTime startTime, DateTime endTime, string workflowId, string taskId, out FilterDefinitionBuilder builder, out FilterDefinition filter) { var workflowNull = string.IsNullOrWhiteSpace(workflowId); var taskIdNull = string.IsNullOrWhiteSpace(taskId); - var builder = Builders.Filter; - var filter = builder.Empty; - + builder = Builders.Filter; + filter = builder.Empty; filter &= builder.Where(t => t.StartedUTC >= startTime.ToUniversalTime()); filter &= builder.Where(t => t.StartedUTC <= endTime.ToUniversalTime()); filter &= builder.Where(t => workflowNull || t.WorkflowId == workflowId); filter &= builder.Where(t => taskIdNull || t.TaskId == taskId); - if (statusFilter is not null) - { - filter &= builder.Where(statusFilter); - } + } - return await _taskExecutionStatsCollection.CountDocumentsAsync(filter); + /// + /// Gets filter for tasks that have ran to completion. + /// + /// + public static Expression> GetExecutedTasksFilter() + { + var dispatched = TaskExecutionStatus.Dispatched.ToString(); + var created = TaskExecutionStatus.Created.ToString(); + var accepted = TaskExecutionStatus.Accepted.ToString(); + + return t => t.Status != dispatched && t.Status != created && t.Status != accepted; } + public async Task GetStatsTotalCompleteExecutionsCountAsync(DateTime startTime, DateTime endTime, string workflowId = "", string taskId = "") { var dispatched = TaskExecutionStatus.Dispatched.ToString(); @@ -248,7 +262,7 @@ public async Task GetStatsTotalCompleteExecutionsCountAsync(DateTime start var accepted = TaskExecutionStatus.Accepted.ToString(); Expression> statusFilter = t => t.Status != dispatched && t.Status != created && t.Status != accepted; - return await GetStatsCountAsync(startTime, endTime, statusFilter, workflowId, taskId); + return await GetStatsCountAsync(startTime, endTime, GetExecutedTasksFilter(), workflowId, taskId); } public async Task GetStatsStatusSucceededCountAsync(DateTime startTime, DateTime endTime, string workflowId = "", string taskId = "") @@ -265,16 +279,11 @@ public async Task GetStatsStatusFailedCountAsync(DateTime startTime, DateT public async Task<(double avgTotalExecution, double avgArgoExecution)> GetAverageStats(DateTime startTime, DateTime endTime, string workflowId = "", string taskId = "") { - var workflowNull = string.IsNullOrWhiteSpace(workflowId); - var taskIdNull = string.IsNullOrWhiteSpace(taskId); + CreateFilter(startTime, endTime, workflowId, taskId, out var builder, out var filter); + filter &= builder.Where(t => t.Status == TaskExecutionStatus.Succeeded.ToString()); var test = await _taskExecutionStatsCollection.Aggregate() - .Match(T => - T.StartedUTC >= startTime.ToUniversalTime() && - T.StartedUTC <= endTime.ToUniversalTime() && - (workflowNull || T.WorkflowId == workflowId) && - (taskIdNull || T.TaskId == taskId) && - T.Status == TaskExecutionStatus.Succeeded.ToString()) + .Match(filter) .Group(g => new { g.Version }, r => new { avgTotalExecution = r.Average(x => (x.DurationSeconds)),