@@ -33,6 +33,7 @@ import (
33
33
imgregv1a1 "github.com/vmware-tanzu/vm-operator/external/image-registry/api/v1alpha1"
34
34
35
35
"github.com/vmware-tanzu/vm-operator/pkg/context"
36
+ "github.com/vmware-tanzu/vm-operator/pkg/metrics"
36
37
"github.com/vmware-tanzu/vm-operator/pkg/patch"
37
38
"github.com/vmware-tanzu/vm-operator/pkg/record"
38
39
"github.com/vmware-tanzu/vm-operator/pkg/vmprovider"
@@ -132,6 +133,7 @@ func NewReconciler(
132
133
Logger : logger ,
133
134
Recorder : recorder ,
134
135
VMProvider : vmProvider ,
136
+ Metrics : metrics .NewVMPublishMetrics (),
135
137
}
136
138
}
137
139
@@ -141,6 +143,7 @@ type Reconciler struct {
141
143
Logger logr.Logger
142
144
Recorder record.Recorder
143
145
VMProvider vmprovider.VirtualMachineProviderInterface
146
+ Metrics * metrics.VMPublishMetrics
144
147
}
145
148
146
149
func requeueDelay (ctx * context.VirtualMachinePublishRequestContext ) time.Duration {
@@ -166,6 +169,10 @@ func (r *Reconciler) Reconcile(ctx goctx.Context, req ctrl.Request) (_ ctrl.Resu
166
169
vmPublishReq := & vmopv1alpha1.VirtualMachinePublishRequest {}
167
170
err := r .Get (ctx , req .NamespacedName , vmPublishReq )
168
171
if err != nil {
172
+ // Delete registered metrics if the resource is not found.
173
+ if apiErrors .IsNotFound (err ) {
174
+ r .Metrics .DeleteMetrics (r .Logger , req .Name , req .Namespace )
175
+ }
169
176
return ctrl.Result {}, client .IgnoreNotFound (err )
170
177
}
171
178
@@ -594,9 +601,31 @@ func (r *Reconciler) ReconcileNormal(ctx *context.VirtualMachinePublishRequestCo
594
601
ctx .Logger .Info ("Reconciling VirtualMachinePublishRequest" )
595
602
vmPublishReq := ctx .VMPublishRequest
596
603
604
+ // Register VM publish request metrics based on the reconcile result.
605
+ var isComplete , isDeleted bool
606
+ defer func () {
607
+ if isDeleted {
608
+ r .Metrics .DeleteMetrics (ctx .Logger , vmPublishReq .Name , vmPublishReq .Namespace )
609
+ return
610
+ }
611
+
612
+ var res metrics.PublishResult
613
+ switch {
614
+ case isComplete :
615
+ res = metrics .PublishSucceeded
616
+ case reterr != nil :
617
+ res = metrics .PublishFailed
618
+ default :
619
+ res = metrics .PublishInProgress
620
+ }
621
+
622
+ r .Metrics .RegisterVMPublishRequest (r .Logger , vmPublishReq .Name , vmPublishReq .Namespace , res )
623
+ }()
624
+
597
625
// In case the .spec.ttlSecondsAfterFinished is not set, we can return early and no need to do any reconcile.
598
- if vmPublishReq .IsComplete () {
599
- requeueAfter , _ , err := r .removeVMPubResourceFromCluster (ctx )
626
+ if isComplete = vmPublishReq .IsComplete (); isComplete {
627
+ requeueAfter , deleted , err := r .removeVMPubResourceFromCluster (ctx )
628
+ isDeleted = deleted
600
629
return ctrl.Result {RequeueAfter : requeueAfter }, err
601
630
}
602
631
@@ -651,19 +680,21 @@ func (r *Reconciler) ReconcileNormal(ctx *context.VirtualMachinePublishRequestCo
651
680
return ctrl.Result {}, err
652
681
}
653
682
654
- if r .checkIsComplete (ctx ) {
683
+ if isComplete = r .checkIsComplete (ctx ); isComplete {
655
684
// remove VirtualMachinePublishRequest from the cluster if ttlSecondsAfterFinished is set.
656
685
requeueAfter , deleted , err := r .removeVMPubResourceFromCluster (ctx )
657
686
if deleted {
658
687
skipPatch = true
659
688
}
689
+ isDeleted = deleted
660
690
return ctrl.Result {RequeueAfter : requeueAfter }, err
661
691
}
662
692
663
693
return ctrl.Result {RequeueAfter : requeueDelay (ctx )}, nil
664
694
}
665
695
666
- func (r * Reconciler ) ReconcileDelete (_ * context.VirtualMachinePublishRequestContext ) (ctrl.Result , error ) {
696
+ func (r * Reconciler ) ReconcileDelete (ctx * context.VirtualMachinePublishRequestContext ) (ctrl.Result , error ) {
697
+ r .Metrics .DeleteMetrics (ctx .Logger , ctx .VMPublishRequest .Name , ctx .VMPublishRequest .Namespace )
667
698
// no op
668
699
return ctrl.Result {}, nil
669
700
}
0 commit comments