Skip to content

Commit

Permalink
Merge pull request #11538 from machadovilaca/refactor-kubevirt_vmi_nu…
Browse files Browse the repository at this point in the history
…mber_of_outdated

Refactor kubevirt_vmi_number_of_outdated
  • Loading branch information
kubevirt-bot committed Apr 10, 2024
2 parents 6759c6b + 44b3f54 commit eaab797
Show file tree
Hide file tree
Showing 6 changed files with 67 additions and 30 deletions.
1 change: 1 addition & 0 deletions pkg/monitoring/metrics/virt-controller/BUILD.bazel
Expand Up @@ -8,6 +8,7 @@ go_library(
"migration_metrics.go",
"migrationstats_collector.go",
"perfscale_metrics.go",
"vmi_metrics.go",
"vmistats_collector.go",
"vmstats_collector.go",
],
Expand Down
1 change: 1 addition & 0 deletions pkg/monitoring/metrics/virt-controller/metrics.go
Expand Up @@ -37,6 +37,7 @@ var (
componentMetrics,
migrationMetrics,
perfscaleMetrics,
vmiMetrics,
}

vmInformer cache.SharedIndexInformer
Expand Down
50 changes: 50 additions & 0 deletions 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
}
4 changes: 2 additions & 2 deletions pkg/virt-controller/watch/workload-updater/BUILD.bazel
Expand Up @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand Down
17 changes: 2 additions & 15 deletions pkg/virt-controller/watch/workload-updater/workload-updater.go
Expand Up @@ -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"
Expand All @@ -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"
)

Expand All @@ -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

Expand All @@ -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
Expand Down Expand Up @@ -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) {
Expand Down
24 changes: 11 additions & 13 deletions pkg/virt-controller/watch/workload-updater/workload-updater_test.go
Expand Up @@ -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"
)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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{}
Expand Down Expand Up @@ -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))

})
Expand Down

0 comments on commit eaab797

Please sign in to comment.