@@ -159,7 +159,7 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
159
159
// need to be deleted and re-created
160
160
workspace .Status .PodStarts ++
161
161
}
162
- r .metrics .rememberWorkspace (workspace )
162
+ r .metrics .rememberWorkspace (workspace , nil )
163
163
164
164
case workspace .Status .Phase == workspacev1 .WorkspacePhaseStopped :
165
165
// Done stopping workspace - remove finalizer.
@@ -249,48 +249,58 @@ func (r *WorkspaceReconciler) actOnStatus(ctx context.Context, workspace *worksp
249
249
func (r * WorkspaceReconciler ) updateMetrics (ctx context.Context , workspace * workspacev1.Workspace ) {
250
250
log := log .FromContext (ctx )
251
251
252
- phase := workspace .Status .Phase
253
-
254
- if ! r .metrics .shouldUpdate (& log , workspace ) {
252
+ ok , lastState := r .metrics .getWorkspace (& log , workspace )
253
+ if ! ok {
255
254
return
256
255
}
257
256
258
- switch {
259
- case phase == workspacev1 .WorkspacePhasePending ||
260
- phase == workspacev1 .WorkspacePhaseCreating ||
261
- phase == workspacev1 .WorkspacePhaseInitializing :
257
+ if ! lastState .recordedInitFailure && wsk8s .ConditionWithStatusAndReason (workspace .Status .Conditions , string (workspacev1 .WorkspaceConditionContentReady ), false , "InitializationFailure" ) {
258
+ r .metrics .countTotalRestoreFailures (& log , workspace )
259
+ lastState .recordedInitFailure = true
262
260
263
- if wsk8s .ConditionWithStatusAndReason (workspace .Status .Conditions , string (workspacev1 .WorkspaceConditionContentReady ), false , "InitializationFailure" ) {
264
- r .metrics .countTotalRestoreFailures (& log , workspace )
261
+ if ! lastState .recordedStartFailure {
265
262
r .metrics .countWorkspaceStartFailures (& log , workspace )
263
+ lastState .recordedStartFailure = true
266
264
}
265
+ }
267
266
268
- if wsk8s .ConditionPresentAndTrue (workspace .Status .Conditions , string (workspacev1 .WorkspaceConditionFailed )) {
269
- r .metrics .countWorkspaceStartFailures (& log , workspace )
270
- }
267
+ if ! lastState .recordedStartFailure && wsk8s .ConditionPresentAndTrue (workspace .Status .Conditions , string (workspacev1 .WorkspaceConditionFailed )) {
268
+ // Only record if there was no other start failure recorded yet, to ensure max one
269
+ // start failure gets recorded per workspace.
270
+ r .metrics .countWorkspaceStartFailures (& log , workspace )
271
+ lastState .recordedStartFailure = true
272
+ }
271
273
272
- case phase == workspacev1 .WorkspacePhaseRunning :
273
- r .metrics .recordWorkspaceStartupTime (& log , workspace )
274
- if wsk8s .ConditionPresentAndTrue (workspace .Status .Conditions , string (workspacev1 .WorkspaceConditionContentReady )) {
275
- r .metrics .countTotalRestores (& log , workspace )
276
- }
274
+ if ! lastState .recordedContentReady && wsk8s .ConditionPresentAndTrue (workspace .Status .Conditions , string (workspacev1 .WorkspaceConditionContentReady )) {
275
+ r .metrics .countTotalRestores (& log , workspace )
276
+ lastState .recordedContentReady = true
277
+ }
277
278
278
- case phase == workspacev1 .WorkspacePhaseStopped :
279
- if wsk8s . ConditionPresentAndTrue ( workspace . Status . Conditions , string ( workspacev1 . WorkspaceConditionBackupFailure )) {
280
- r .metrics .countTotalBackups (& log , workspace )
281
- r . metrics . countTotalBackupFailures ( & log , workspace )
282
- }
279
+ if ! lastState . recordedBackupFailed && wsk8s . ConditionPresentAndTrue ( workspace . Status . Conditions , string ( workspacev1 .WorkspaceConditionBackupFailure )) {
280
+ r . metrics . countTotalBackups ( & log , workspace )
281
+ r .metrics .countTotalBackupFailures (& log , workspace )
282
+ lastState . recordedBackupFailed = true
283
+ }
283
284
284
- if wsk8s .ConditionPresentAndTrue (workspace .Status .Conditions , string (workspacev1 .WorkspaceConditionBackupComplete )) {
285
- r .metrics .countTotalBackups (& log , workspace )
286
- }
285
+ if ! lastState .recordedBackupCompleted && wsk8s .ConditionPresentAndTrue (workspace .Status .Conditions , string (workspacev1 .WorkspaceConditionBackupComplete )) {
286
+ r .metrics .countTotalBackups (& log , workspace )
287
+ lastState .recordedBackupCompleted = true
288
+ }
287
289
290
+ if ! lastState .recordedStartTime && workspace .Status .Phase == workspacev1 .WorkspacePhaseRunning {
291
+ r .metrics .recordWorkspaceStartupTime (& log , workspace )
292
+ lastState .recordedStartTime = true
293
+ }
294
+
295
+ if workspace .Status .Phase == workspacev1 .WorkspacePhaseStopped {
288
296
r .metrics .countWorkspaceStop (& log , workspace )
297
+
298
+ // Forget about this workspace, no more state updates will be recorded after this.
289
299
r .metrics .forgetWorkspace (workspace )
290
300
return
291
301
}
292
302
293
- r .metrics .rememberWorkspace (workspace )
303
+ r .metrics .rememberWorkspace (workspace , & lastState )
294
304
}
295
305
296
306
func (r * WorkspaceReconciler ) deleteWorkspacePod (ctx context.Context , pod * corev1.Pod , reason string ) (ctrl.Result , error ) {
0 commit comments