17
17
using System ;
18
18
using System . Collections . Generic ;
19
19
using System . Linq ;
20
+ using System . Linq . Expressions ;
20
21
using System . Threading . Tasks ;
21
22
using Ardalis . GuardClauses ;
22
23
using Microsoft . Extensions . Logging ;
@@ -159,14 +160,7 @@ public async Task<IEnumerable<ExecutionStats>> GetStatsAsync(DateTime startTime,
159
160
T . StartedUTC >= startTime &&
160
161
T . StartedUTC <= endTime . ToUniversalTime ( ) &&
161
162
( 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 ) )
170
164
. Limit ( PageSize )
171
165
. Skip ( ( PageNumber - 1 ) * PageSize )
172
166
. ToListAsync ( ) ;
@@ -187,66 +181,86 @@ private static ExecutionStats ExposeExecutionStats(ExecutionStats taskExecutionS
187
181
var statKeys = taskUpdateEvent . ExecutionStats . Keys . Where ( v => v . StartsWith ( "podStartTime" ) || v . StartsWith ( "podFinishTime" ) ) ;
188
182
if ( statKeys . Any ( ) )
189
183
{
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 ) ;
204
185
}
205
186
}
206
187
return taskExecutionStats ;
207
188
}
208
189
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 )
210
197
{
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
+ }
214
213
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 ) ;
221
222
}
222
223
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 = "" )
224
225
{
225
226
var workflowNull = string . IsNullOrWhiteSpace ( workflowId ) ;
226
227
var taskIdNull = string . IsNullOrWhiteSpace ( taskId ) ;
227
228
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 ) ;
234
242
}
235
243
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 = "" )
237
245
{
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
+ }
240
253
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 ) ;
250
264
}
251
265
252
266
public async Task < ( double avgTotalExecution , double avgArgoExecution ) > GetAverageStats ( DateTime startTime , DateTime endTime , string workflowId = "" , string taskId = "" )
0 commit comments