diff --git a/Makefile b/Makefile index e5b3e626d..c580d1a46 100644 --- a/Makefile +++ b/Makefile @@ -16,11 +16,13 @@ # VERSION is based on a date stamp plus the last commit VERSION?=v$(shell date +%Y%m%d)-$(shell git describe --tags --match "v*") +BRANCH?=$(shell git branch --show-current) +SHA1?=$(shell git rev-parse HEAD) BUILD=$(shell date +%FT%T%z) LDFLAG_LOCATION=sigs.k8s.io/descheduler/pkg/version ARCHS = amd64 arm64 -LDFLAGS=-ldflags "-X ${LDFLAG_LOCATION}.version=${VERSION} -X ${LDFLAG_LOCATION}.buildDate=${BUILD}" +LDFLAGS=-ldflags "-X ${LDFLAG_LOCATION}.version=${VERSION} -X ${LDFLAG_LOCATION}.buildDate=${BUILD} -X ${LDFLAG_LOCATION}.gitbranch=${BRANCH} -X ${LDFLAG_LOCATION}.gitsha1=${SHA1}" GOLANGCI_VERSION := v1.30.0 HAS_GOLANGCI := $(shell ls _output/bin/golangci-lint) diff --git a/metrics/metrics.go b/metrics/metrics.go new file mode 100644 index 000000000..5750d769a --- /dev/null +++ b/metrics/metrics.go @@ -0,0 +1,72 @@ +/* +Copyright 2021 The Kubernetes Authors. + +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. +*/ + +package metrics + +import ( + "sync" + + "k8s.io/component-base/metrics" + "k8s.io/component-base/metrics/legacyregistry" + "sigs.k8s.io/descheduler/pkg/version" +) + +const ( + // DeschedulerSubsystem - subsystem name used by descheduler + DeschedulerSubsystem = "descheduler" +) + +var ( + PodsEvicted = metrics.NewCounterVec( + &metrics.CounterOpts{ + Subsystem: DeschedulerSubsystem, + Name: "pods_evicted", + Help: "Number of evicted pods, by the result, by the strategy, by the namespace. 'failed' result means a pod could not be evicted", + StabilityLevel: metrics.ALPHA, + }, []string{"result", "strategy", "namespace"}) + + buildInfo = metrics.NewGauge( + &metrics.GaugeOpts{ + Subsystem: DeschedulerSubsystem, + Name: "build_info", + Help: "Build info about descheduler, including Go version, Descheduler version, Git SHA, Git branch", + ConstLabels: map[string]string{"GoVersion": version.Get().GoVersion, "DeschedulerVersion": version.Get().GitVersion, "GitBranch": version.Get().GitBranch, "GitSha1": version.Get().GitSha1}, + StabilityLevel: metrics.ALPHA, + }, + ) + + metricsList = []metrics.Registerable{ + PodsEvicted, + buildInfo, + } +) + +var registerMetrics sync.Once + +// Register all metrics. +func Register() { + // Register the metrics. + registerMetrics.Do(func() { + RegisterMetrics(metricsList...) + }) +} + +// RegisterMetrics registers a list of metrics. +func RegisterMetrics(extraMetrics ...metrics.Registerable) { + for _, metric := range extraMetrics { + legacyregistry.MustRegister(metric) + } +} diff --git a/pkg/descheduler/descheduler.go b/pkg/descheduler/descheduler.go index 3c6f84d93..36a6482b5 100644 --- a/pkg/descheduler/descheduler.go +++ b/pkg/descheduler/descheduler.go @@ -27,6 +27,7 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/informers" "sigs.k8s.io/descheduler/cmd/descheduler/app/options" + "sigs.k8s.io/descheduler/metrics" "sigs.k8s.io/descheduler/pkg/api" "sigs.k8s.io/descheduler/pkg/descheduler/client" "sigs.k8s.io/descheduler/pkg/descheduler/evictions" @@ -36,6 +37,8 @@ import ( ) func Run(rs *options.DeschedulerServer) error { + metrics.Register() + ctx := context.Background() rsclient, err := client.CreateClient(rs.KubeconfigFile) if err != nil { diff --git a/pkg/version/version.go b/pkg/version/version.go index ab0291503..0325d775b 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -28,8 +28,14 @@ var ( // generated this build. It should be set during build via -ldflags. version string // buildDate in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ') - //It should be set during build via -ldflags. + // It should be set during build via -ldflags. buildDate string + // gitbranch is a constant representing git branch for this build. + // It should be set during build via -ldflags. + gitbranch string + // gitbranch is a constant representing git sha1 for this build. + // It should be set during build via -ldflags. + gitsha1 string ) // Info holds the information related to descheduler app version. @@ -37,6 +43,8 @@ type Info struct { Major string `json:"major"` Minor string `json:"minor"` GitVersion string `json:"gitVersion"` + GitBranch string `json:"gitBranch"` + GitSha1 string `json:"gitSha1"` BuildDate string `json:"buildDate"` GoVersion string `json:"goVersion"` Compiler string `json:"compiler"` @@ -51,6 +59,8 @@ func Get() Info { Major: majorVersion, Minor: minorVersion, GitVersion: version, + GitBranch: gitbranch, + GitSha1: gitsha1, BuildDate: buildDate, GoVersion: runtime.Version(), Compiler: runtime.Compiler,