1717using System ;
1818using System . Collections . Generic ;
1919using System . Linq ;
20+ using System . Linq . Expressions ;
2021using System . Threading . Tasks ;
2122using Ardalis . GuardClauses ;
2223using Microsoft . Extensions . Logging ;
@@ -159,14 +160,7 @@ public async Task<IEnumerable<ExecutionStats>> GetStatsAsync(DateTime startTime,
159160 T . StartedUTC >= startTime &&
160161 T . StartedUTC <= endTime . ToUniversalTime ( ) &&
161162 ( workflowNull || T . WorkflowId == workflowId ) &&
162- ( taskIdNull || T . TaskId == taskId )
163- //&&
164- //(
165- // T.Status == TaskExecutionStatus.Succeeded.ToString()
166- // || T.Status == TaskExecutionStatus.Failed.ToString()
167- // || T.Status == TaskExecutionStatus.PartialFail.ToString()
168- // )
169- )
163+ ( taskIdNull || T . TaskId == taskId ) )
170164 . Limit ( PageSize )
171165 . Skip ( ( PageNumber - 1 ) * PageSize )
172166 . ToListAsync ( ) ;
@@ -187,66 +181,86 @@ private static ExecutionStats ExposeExecutionStats(ExecutionStats taskExecutionS
187181 var statKeys = taskUpdateEvent . ExecutionStats . Keys . Where ( v => v . StartsWith ( "podStartTime" ) || v . StartsWith ( "podFinishTime" ) ) ;
188182 if ( statKeys . Any ( ) )
189183 {
190- var start = DateTime . Now ;
191- var end = new DateTime ( ) ;
192- foreach ( var statKey in statKeys )
193- {
194- if ( statKey . Contains ( "StartTime" ) && DateTime . TryParse ( taskUpdateEvent . ExecutionStats [ statKey ] , out var startTime ) )
195- {
196- start = ( startTime < start ? startTime : start ) ;
197- }
198- else if ( DateTime . TryParse ( taskUpdateEvent . ExecutionStats [ statKey ] , out var endTime ) )
199- {
200- end = ( endTime > end ? endTime : start ) ;
201- }
202- }
203- taskExecutionStats . ExecutionTimeSeconds = ( end - start ) . TotalMilliseconds / 1000 ;
184+ CalculatePodExecutionTime ( taskExecutionStats , taskUpdateEvent , statKeys ) ;
204185 }
205186 }
206187 return taskExecutionStats ;
207188 }
208189
209- public async Task < long > GetStatsStatusCountAsync ( DateTime start , DateTime endTime , string status = "" , string workflowId = "" , string taskId = "" )
190+ /// <summary>
191+ /// Calculates and sets ExecutionStats ExecutionTimeSeconds
192+ /// </summary>
193+ /// <param name="taskExecutionStats"></param>
194+ /// <param name="taskUpdateEvent"></param>
195+ /// <param name="statKeys"></param>
196+ private static void CalculatePodExecutionTime ( ExecutionStats taskExecutionStats , TaskExecution taskUpdateEvent , IEnumerable < string > statKeys )
210197 {
211- var statusNull = string . IsNullOrWhiteSpace ( status ) ;
212- var workflowNull = string . IsNullOrWhiteSpace ( workflowId ) ;
213- var taskIdNull = string . IsNullOrWhiteSpace ( taskId ) ;
198+ var start = DateTime . Now ;
199+ var end = new DateTime ( ) ;
200+ foreach ( var statKey in statKeys )
201+ {
202+ if ( statKey . Contains ( "StartTime" ) && DateTime . TryParse ( taskUpdateEvent . ExecutionStats [ statKey ] , out var startTime ) )
203+ {
204+ start = ( startTime < start ? startTime : start ) ;
205+ }
206+ else if ( DateTime . TryParse ( taskUpdateEvent . ExecutionStats [ statKey ] , out var endTime ) )
207+ {
208+ end = ( endTime > end ? endTime : start ) ;
209+ }
210+ }
211+ taskExecutionStats . ExecutionTimeSeconds = ( end - start ) . TotalMilliseconds / 1000 ;
212+ }
214213
215- return await _taskExecutionStatsCollection . CountDocumentsAsync ( T =>
216- T . StartedUTC >= start . ToUniversalTime ( ) &&
217- T . StartedUTC <= endTime . ToUniversalTime ( ) &&
218- ( workflowNull || T . WorkflowId == workflowId ) &&
219- ( taskIdNull || T . TaskId == taskId ) &&
220- ( statusNull || T . Status == status ) ) ;
214+ public async Task < long > GetStatsStatusCountAsync ( DateTime startTime , DateTime endTime , string status = "" , string workflowId = "" , string taskId = "" )
215+ {
216+ Expression < Func < ExecutionStats , bool > > ? statusFilter = null ;
217+ if ( ! string . IsNullOrWhiteSpace ( status ) )
218+ {
219+ statusFilter = t => t . Status == status ;
220+ }
221+ return await GetStatsCountAsync ( startTime , endTime , statusFilter , workflowId , taskId ) ;
221222 }
222223
223- public async Task < long > GetStatsStatusSucceededCountAsync ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
224+ public async Task < long > GetStatsCountAsync ( DateTime startTime , DateTime endTime , Expression < Func < ExecutionStats , bool > > ? statusFilter = null , string workflowId = "" , string taskId = "" )
224225 {
225226 var workflowNull = string . IsNullOrWhiteSpace ( workflowId ) ;
226227 var taskIdNull = string . IsNullOrWhiteSpace ( taskId ) ;
227228
228- return await _taskExecutionStatsCollection . CountDocumentsAsync ( T =>
229- T . StartedUTC >= startTime . ToUniversalTime ( ) &&
230- T . StartedUTC <= endTime . ToUniversalTime ( ) &&
231- ( workflowNull || T . WorkflowId == workflowId ) &&
232- ( taskIdNull || T . TaskId == taskId ) &&
233- T . Status == TaskExecutionStatus . Succeeded . ToString ( ) ) ;
229+ var builder = Builders < ExecutionStats > . Filter ;
230+ var filter = builder . Empty ;
231+
232+ filter &= builder . Where ( t => t . StartedUTC >= startTime . ToUniversalTime ( ) ) ;
233+ filter &= builder . Where ( t => t . StartedUTC <= endTime . ToUniversalTime ( ) ) ;
234+ filter &= builder . Where ( t => workflowNull || t . WorkflowId == workflowId ) ;
235+ filter &= builder . Where ( t => taskIdNull || t . TaskId == taskId ) ;
236+ if ( statusFilter is not null )
237+ {
238+ filter &= builder . Where ( statusFilter ) ;
239+ }
240+
241+ return await _taskExecutionStatsCollection . CountDocumentsAsync ( filter ) ;
234242 }
235243
236- public async Task < long > GetStatsStatusFailedCountAsync ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
244+ public async Task < long > GetStatsTotalCompleteExecutionsCountAsync ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
237245 {
238- var workflowNull = string . IsNullOrWhiteSpace ( workflowId ) ;
239- var taskIdNull = string . IsNullOrWhiteSpace ( taskId ) ;
246+ var dispatched = TaskExecutionStatus . Dispatched . ToString ( ) ;
247+ var created = TaskExecutionStatus . Created . ToString ( ) ;
248+ var accepted = TaskExecutionStatus . Accepted . ToString ( ) ;
249+ Expression < Func < ExecutionStats , bool > > statusFilter = t => t . Status != dispatched && t . Status != created && t . Status != accepted ;
250+
251+ return await GetStatsCountAsync ( startTime , endTime , statusFilter , workflowId , taskId ) ;
252+ }
240253
241- return await _taskExecutionStatsCollection . CountDocumentsAsync ( T =>
242- T . StartedUTC >= startTime . ToUniversalTime ( ) &&
243- T . StartedUTC <= endTime . ToUniversalTime ( ) &&
244- ( workflowNull || T . WorkflowId == workflowId ) &&
245- ( taskIdNull || T . TaskId == taskId ) &&
246- (
247- T . Status == TaskExecutionStatus . Failed . ToString ( ) ||
248- T . Status == TaskExecutionStatus . PartialFail . ToString ( )
249- ) ) ;
254+ public async Task < long > GetStatsStatusSucceededCountAsync ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
255+ {
256+ Expression < Func < ExecutionStats , bool > > statusFilter = t => t . Status == TaskExecutionStatus . Succeeded . ToString ( ) ;
257+ return await GetStatsCountAsync ( startTime , endTime , statusFilter , workflowId , taskId ) ;
258+ }
259+
260+ public async Task < long > GetStatsStatusFailedCountAsync ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
261+ {
262+ Expression < Func < ExecutionStats , bool > > statusFilter = t => t . Status == TaskExecutionStatus . Failed . ToString ( ) || t . Status == TaskExecutionStatus . PartialFail . ToString ( ) ;
263+ return await GetStatsCountAsync ( startTime , endTime , statusFilter , workflowId , taskId ) ;
250264 }
251265
252266 public async Task < ( double avgTotalExecution , double avgArgoExecution ) > GetAverageStats ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
0 commit comments