Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor kubevirt_vmi_number_of_outdated #11538

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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 @@ -35,6 +35,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"
Copy link
Contributor

@avlitman avlitman Mar 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: I think we can remove the empty lines (line 25, 27, 31) since all is kubevirt.io

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice catch

although "kubevirt.io/client-go/... imports are usually separated, but yes, a few others out of place

anyway I think that is not very related to this PR, maybe could be done in a separate one
by you maybe :D

"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