Skip to content

Commit bd9d04e

Browse files
authored
Merge pull request vmware-tanzu#41 from dilyar85/feature/add-vm-publish-metrics
Add VM publish related metrics in virtualmachinepublishrequest controller
2 parents bc2dbc5 + e7d8956 commit bd9d04e

File tree

2 files changed

+111
-4
lines changed

2 files changed

+111
-4
lines changed

controllers/virtualmachinepublishrequest/virtualmachinepublishrequest_controller.go

+35-4
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
imgregv1a1 "github.com/vmware-tanzu/vm-operator/external/image-registry/api/v1alpha1"
3434

3535
"github.com/vmware-tanzu/vm-operator/pkg/context"
36+
"github.com/vmware-tanzu/vm-operator/pkg/metrics"
3637
"github.com/vmware-tanzu/vm-operator/pkg/patch"
3738
"github.com/vmware-tanzu/vm-operator/pkg/record"
3839
"github.com/vmware-tanzu/vm-operator/pkg/vmprovider"
@@ -132,6 +133,7 @@ func NewReconciler(
132133
Logger: logger,
133134
Recorder: recorder,
134135
VMProvider: vmProvider,
136+
Metrics: metrics.NewVMPublishMetrics(),
135137
}
136138
}
137139

@@ -141,6 +143,7 @@ type Reconciler struct {
141143
Logger logr.Logger
142144
Recorder record.Recorder
143145
VMProvider vmprovider.VirtualMachineProviderInterface
146+
Metrics *metrics.VMPublishMetrics
144147
}
145148

146149
func requeueDelay(ctx *context.VirtualMachinePublishRequestContext) time.Duration {
@@ -166,6 +169,10 @@ func (r *Reconciler) Reconcile(ctx goctx.Context, req ctrl.Request) (_ ctrl.Resu
166169
vmPublishReq := &vmopv1alpha1.VirtualMachinePublishRequest{}
167170
err := r.Get(ctx, req.NamespacedName, vmPublishReq)
168171
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+
}
169176
return ctrl.Result{}, client.IgnoreNotFound(err)
170177
}
171178

@@ -594,9 +601,31 @@ func (r *Reconciler) ReconcileNormal(ctx *context.VirtualMachinePublishRequestCo
594601
ctx.Logger.Info("Reconciling VirtualMachinePublishRequest")
595602
vmPublishReq := ctx.VMPublishRequest
596603

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+
597625
// 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
600629
return ctrl.Result{RequeueAfter: requeueAfter}, err
601630
}
602631

@@ -651,19 +680,21 @@ func (r *Reconciler) ReconcileNormal(ctx *context.VirtualMachinePublishRequestCo
651680
return ctrl.Result{}, err
652681
}
653682

654-
if r.checkIsComplete(ctx) {
683+
if isComplete = r.checkIsComplete(ctx); isComplete {
655684
// remove VirtualMachinePublishRequest from the cluster if ttlSecondsAfterFinished is set.
656685
requeueAfter, deleted, err := r.removeVMPubResourceFromCluster(ctx)
657686
if deleted {
658687
skipPatch = true
659688
}
689+
isDeleted = deleted
660690
return ctrl.Result{RequeueAfter: requeueAfter}, err
661691
}
662692

663693
return ctrl.Result{RequeueAfter: requeueDelay(ctx)}, nil
664694
}
665695

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)
667698
// no op
668699
return ctrl.Result{}, nil
669700
}

pkg/metrics/vmpub_metrics.go

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
// Copyright (c) 2022 VMware, Inc. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package metrics
5+
6+
import (
7+
"sync"
8+
9+
"sigs.k8s.io/controller-runtime/pkg/metrics"
10+
11+
"github.com/go-logr/logr"
12+
"github.com/prometheus/client_golang/prometheus"
13+
)
14+
15+
type PublishResult int
16+
17+
const (
18+
PublishFailed PublishResult = -1
19+
PublishInProgress PublishResult = 0
20+
PublishSucceeded PublishResult = 1
21+
)
22+
23+
var (
24+
vmPubMetricsOnce sync.Once
25+
vmPubMetrics *VMPublishMetrics
26+
)
27+
28+
type VMPublishMetrics struct {
29+
vmPubRequest *prometheus.GaugeVec
30+
}
31+
32+
// NewVMPublishMetrics initializes a singleton and registers all the defined metrics.
33+
func NewVMPublishMetrics() *VMPublishMetrics {
34+
vmPubMetricsOnce.Do(func() {
35+
vmPubMetrics = &VMPublishMetrics{
36+
vmPubRequest: prometheus.NewGaugeVec(prometheus.GaugeOpts{
37+
Namespace: metricsNamespace,
38+
Subsystem: "vm",
39+
Name: "publish_request",
40+
Help: "VirtualMachine publish request result",
41+
}, []string{
42+
"name",
43+
"namespace",
44+
}),
45+
}
46+
47+
metrics.Registry.MustRegister(
48+
vmPubMetrics.vmPubRequest,
49+
)
50+
})
51+
52+
return vmPubMetrics
53+
}
54+
55+
// RegisterVMPublishRequest registers VM publish request metrics with the given value.
56+
func (m *VMPublishMetrics) RegisterVMPublishRequest(logger logr.Logger, reqName, ns string, val PublishResult) {
57+
labels := getVMPubRequestLabels(reqName, ns)
58+
m.vmPubRequest.With(labels).Set(float64(val))
59+
60+
logger.V(5).WithValues("labels", labels, "result", val).Info("Set metrics for VM publish request")
61+
}
62+
63+
// DeleteMetrics deletes all the related VM publish request metrics from the given name and namespace.
64+
func (m *VMPublishMetrics) DeleteMetrics(logger logr.Logger, reqName, ns string) {
65+
labels := getVMPubRequestLabels(reqName, ns)
66+
deleted := m.vmPubRequest.Delete(labels)
67+
68+
logger.V(5).WithValues("labels", labels, "deleted", deleted).Info("Delete VM publish request metrics")
69+
}
70+
71+
func getVMPubRequestLabels(name, ns string) prometheus.Labels {
72+
return prometheus.Labels{
73+
"name": name,
74+
"namespace": ns,
75+
}
76+
}

0 commit comments

Comments
 (0)