From 44b3f54bfc7ec4715f2fefccaaf970c82b52979f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Vila=C3=A7a?= Date: Mon, 18 Mar 2024 20:53:14 +0000 Subject: [PATCH] Refactor kubevirt_vmi_number_of_outdated MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: João Vilaça --- .../metrics/virt-controller/BUILD.bazel | 1 + .../metrics/virt-controller/metrics.go | 1 + .../metrics/virt-controller/vmi_metrics.go | 50 +++++++++++++++++++ .../watch/workload-updater/BUILD.bazel | 4 +- .../workload-updater/workload-updater.go | 17 +------ .../workload-updater/workload-updater_test.go | 24 ++++----- 6 files changed, 67 insertions(+), 30 deletions(-) create mode 100644 pkg/monitoring/metrics/virt-controller/vmi_metrics.go diff --git a/pkg/monitoring/metrics/virt-controller/BUILD.bazel b/pkg/monitoring/metrics/virt-controller/BUILD.bazel index 8938417b0769..cdce6e103620 100644 --- a/pkg/monitoring/metrics/virt-controller/BUILD.bazel +++ b/pkg/monitoring/metrics/virt-controller/BUILD.bazel @@ -8,6 +8,7 @@ go_library( "migration_metrics.go", "migrationstats_collector.go", "perfscale_metrics.go", + "vmi_metrics.go", "vmistats_collector.go", "vmstats_collector.go", ], diff --git a/pkg/monitoring/metrics/virt-controller/metrics.go b/pkg/monitoring/metrics/virt-controller/metrics.go index a3e9e59217b0..bfbacec117cb 100644 --- a/pkg/monitoring/metrics/virt-controller/metrics.go +++ b/pkg/monitoring/metrics/virt-controller/metrics.go @@ -35,6 +35,7 @@ var ( componentMetrics, migrationMetrics, perfscaleMetrics, + vmiMetrics, } vmInformer cache.SharedIndexInformer diff --git a/pkg/monitoring/metrics/virt-controller/vmi_metrics.go b/pkg/monitoring/metrics/virt-controller/vmi_metrics.go new file mode 100644 index 000000000000..002e34a63df9 --- /dev/null +++ b/pkg/monitoring/metrics/virt-controller/vmi_metrics.go @@ -0,0 +1,50 @@ +/* + * This file is part of the KubeVirt project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Copyright the KubeVirt Authors. + */ + +package virt_controller + +import ( + "github.com/machadovilaca/operator-observability/pkg/operatormetrics" + ioprometheusclient "github.com/prometheus/client_model/go" +) + +var ( + vmiMetrics = []operatormetrics.Metric{ + outdatedVirtualMachineInstanceWorkloads, + } + + outdatedVirtualMachineInstanceWorkloads = operatormetrics.NewGauge( + operatormetrics.MetricOpts{ + Name: "kubevirt_vmi_number_of_outdated", + Help: "Indication for the total number of VirtualMachineInstance workloads that are not running within the most up-to-date version of the virt-launcher environment.", + }, + ) +) + +func SetOutdatedVirtualMachineInstanceWorkloads(value int) { + outdatedVirtualMachineInstanceWorkloads.Set(float64(value)) +} + +func GetOutdatedVirtualMachineInstanceWorkloads() (int, error) { + dto := &ioprometheusclient.Metric{} + if err := outdatedVirtualMachineInstanceWorkloads.Write(dto); err != nil { + return 0, err + } + + return int(dto.GetGauge().GetValue()), nil +} diff --git a/pkg/virt-controller/watch/workload-updater/BUILD.bazel b/pkg/virt-controller/watch/workload-updater/BUILD.bazel index fb673232f663..1b15beba5e7b 100644 --- a/pkg/virt-controller/watch/workload-updater/BUILD.bazel +++ b/pkg/virt-controller/watch/workload-updater/BUILD.bazel @@ -7,13 +7,13 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/controller:go_default_library", + "//pkg/monitoring/metrics/virt-controller:go_default_library", "//pkg/util/migrations:go_default_library", "//pkg/util/status:go_default_library", "//pkg/virt-config:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", "//staging/src/kubevirt.io/client-go/kubecli:go_default_library", "//staging/src/kubevirt.io/client-go/log:go_default_library", - "//vendor/github.com/prometheus/client_golang/prometheus:go_default_library", "//vendor/golang.org/x/time/rate:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/api/policy/v1beta1:go_default_library", @@ -37,6 +37,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/controller:go_default_library", + "//pkg/monitoring/metrics/virt-controller:go_default_library", "//pkg/testutils:go_default_library", "//pkg/virt-config:go_default_library", "//staging/src/kubevirt.io/api/core/v1:go_default_library", @@ -46,7 +47,6 @@ go_test( "//vendor/github.com/golang/mock/gomock:go_default_library", "//vendor/github.com/onsi/ginkgo/v2:go_default_library", "//vendor/github.com/onsi/gomega:go_default_library", - "//vendor/github.com/prometheus/client_model/go:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", diff --git a/pkg/virt-controller/watch/workload-updater/workload-updater.go b/pkg/virt-controller/watch/workload-updater/workload-updater.go index bcb08a336022..6303624ed8e4 100644 --- a/pkg/virt-controller/watch/workload-updater/workload-updater.go +++ b/pkg/virt-controller/watch/workload-updater/workload-updater.go @@ -10,7 +10,6 @@ import ( "golang.org/x/time/rate" - "github.com/prometheus/client_golang/prometheus" k8sv1 "k8s.io/api/core/v1" policy "k8s.io/api/policy/v1beta1" "k8s.io/apimachinery/pkg/api/errors" @@ -31,6 +30,7 @@ import ( "kubevirt.io/client-go/log" "kubevirt.io/kubevirt/pkg/controller" + metrics "kubevirt.io/kubevirt/pkg/monitoring/metrics/virt-controller" "kubevirt.io/kubevirt/pkg/util/status" ) @@ -45,15 +45,6 @@ const ( SuccessfulEvictVirtualMachineInstanceReason = "SuccessfulEvict" ) -var ( - outdatedVirtualMachineInstanceWorkloads = prometheus.NewGauge( - prometheus.GaugeOpts{ - Name: "kubevirt_vmi_number_of_outdated", - Help: "Indication for the total number of VirtualMachineInstance workloads that are not running within the most up-to-date version of the virt-launcher environment.", - }, - ) -) - // time to wait before re-enqueing when outdated VMIs are still detected const periodicReEnqueueIntervalSeconds = 30 @@ -63,10 +54,6 @@ const defaultThrottleInterval = 5 * time.Second const defaultBatchDeletionIntervalSeconds = 60 const defaultBatchDeletionCount = 10 -func init() { - prometheus.MustRegister(outdatedVirtualMachineInstanceWorkloads) -} - type WorkloadUpdateController struct { clientset kubecli.KubevirtClient queue workqueue.RateLimitingInterface @@ -429,7 +416,7 @@ func (c *WorkloadUpdateController) sync(kv *virtv1.KubeVirt) error { return err } - outdatedVirtualMachineInstanceWorkloads.Set(float64(len(data.allOutdatedVMIs))) + metrics.SetOutdatedVirtualMachineInstanceWorkloads(len(data.allOutdatedVMIs)) // update outdated workload count on kv if kv.Status.OutdatedVirtualMachineInstanceWorkloads == nil || *kv.Status.OutdatedVirtualMachineInstanceWorkloads != len(data.allOutdatedVMIs) { diff --git a/pkg/virt-controller/watch/workload-updater/workload-updater_test.go b/pkg/virt-controller/watch/workload-updater/workload-updater_test.go index eb5ed94dd60b..57ab74116d06 100644 --- a/pkg/virt-controller/watch/workload-updater/workload-updater_test.go +++ b/pkg/virt-controller/watch/workload-updater/workload-updater_test.go @@ -21,11 +21,10 @@ import ( "kubevirt.io/client-go/kubecli" virtcontroller "kubevirt.io/kubevirt/pkg/controller" + metrics "kubevirt.io/kubevirt/pkg/monitoring/metrics/virt-controller" "kubevirt.io/kubevirt/pkg/testutils" virtconfig "kubevirt.io/kubevirt/pkg/virt-config" - io_prometheus_client "github.com/prometheus/client_model/go" - . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -88,7 +87,10 @@ var _ = Describe("Workload Updater", func() { expectedImage = "cur-image" - outdatedVirtualMachineInstanceWorkloads.Set(0.0) + err := metrics.SetupMetrics(nil, nil, nil, nil, nil, nil, nil, nil) + Expect(err).ToNot(HaveOccurred()) + metrics.SetOutdatedVirtualMachineInstanceWorkloads(0) + stop = make(chan struct{}) ctrl = gomock.NewController(GinkgoT()) virtClient = kubecli.NewMockKubevirtClient(ctrl) @@ -161,11 +163,9 @@ var _ = Describe("Workload Updater", func() { It("should update out of date value on kv and report prometheus metric", func() { By("Checking prometheus metric before sync") - dto := &io_prometheus_client.Metric{} - Expect(outdatedVirtualMachineInstanceWorkloads.Write(dto)).To(Succeed()) - - zero := 0.0 - Expect(dto.GetGauge().Value).To(Equal(&zero), "outdated vmi workload reported should be equal to zero") + value, err := metrics.GetOutdatedVirtualMachineInstanceWorkloads() + Expect(err).ToNot(HaveOccurred()) + Expect(value).To(BeZero(), "outdated vmi workload reported should be equal to zero") totalVMs := 0 reasons := []string{} @@ -209,12 +209,10 @@ var _ = Describe("Workload Updater", func() { testutils.ExpectEvents(recorder, reasons...) By("Checking prometheus metric") - dto = &io_prometheus_client.Metric{} - Expect(outdatedVirtualMachineInstanceWorkloads.Write(dto)).To(Succeed()) - - val := 100.0 + value, err = metrics.GetOutdatedVirtualMachineInstanceWorkloads() + Expect(err).ToNot(HaveOccurred()) - Expect(dto.GetGauge().Value).To(Equal(&val)) + Expect(value).To(Equal(100)) Expect(evictionCount).To(Equal(defaultBatchDeletionCount)) })