mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 11:50:44 +00:00
move version logic directly into the component-base, to simplify legacyregistry logic
add version to vendor move version into component-base top-level update bazel build files fix import
This commit is contained in:
parent
d951d19ec4
commit
b037203082
@ -161,6 +161,7 @@ kube::version::ldflags() {
|
||||
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/client-go/pkg/version.${key}=${val}'"
|
||||
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/kubectl/pkg/version.${key}=${val}'"
|
||||
"-X '${KUBE_GO_PACKAGE}/cmd/kubeadm/app/version.${key}=${val}'"
|
||||
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/component-base/version.${key}=${val}'"
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -15,6 +15,7 @@ filegroup(
|
||||
"//staging/src/k8s.io/component-base/featuregate:all-srcs",
|
||||
"//staging/src/k8s.io/component-base/logs:all-srcs",
|
||||
"//staging/src/k8s.io/component-base/metrics:all-srcs",
|
||||
"//staging/src/k8s.io/component-base/version:all-srcs",
|
||||
],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
|
@ -5,6 +5,7 @@ load(
|
||||
"go_library",
|
||||
"go_test",
|
||||
)
|
||||
load("//staging/src/k8s.io/component-base/version:def.bzl", "version_x_defs")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
@ -17,6 +18,7 @@ go_library(
|
||||
"processstarttime.go",
|
||||
"registry.go",
|
||||
"summary.go",
|
||||
"version.go",
|
||||
"version_parser.go",
|
||||
"wrappers.go",
|
||||
],
|
||||
@ -24,6 +26,7 @@ go_library(
|
||||
importpath = "k8s.io/component-base/metrics",
|
||||
deps = [
|
||||
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
|
||||
"//staging/src/k8s.io/component-base/version:go_default_library",
|
||||
"//vendor/github.com/blang/semver:go_default_library",
|
||||
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
|
||||
"//vendor/github.com/prometheus/client_model/go:go_default_library",
|
||||
|
@ -72,7 +72,7 @@ func TestCounter(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
@ -184,7 +184,7 @@ func TestCounterVec(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
|
@ -73,7 +73,7 @@ func TestGauge(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
@ -169,7 +169,7 @@ func TestGaugeVec(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
|
@ -77,7 +77,7 @@ func TestHistogram(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
@ -177,7 +177,7 @@ func TestHistogramVec(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
|
@ -1,6 +1,6 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
@ -8,11 +8,9 @@ go_library(
|
||||
importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics/legacyregistry",
|
||||
importpath = "k8s.io/component-base/metrics/legacyregistry",
|
||||
deps = [
|
||||
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
|
||||
"//staging/src/k8s.io/component-base/metrics:go_default_library",
|
||||
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
|
||||
"//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library",
|
||||
"//vendor/github.com/prometheus/client_model/go:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
@ -28,16 +26,3 @@ filegroup(
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["registry_test.go"],
|
||||
embed = [":go_default_library"],
|
||||
deps = [
|
||||
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
|
||||
"//staging/src/k8s.io/component-base/metrics:go_default_library",
|
||||
"//vendor/github.com/blang/semver:go_default_library",
|
||||
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
|
||||
"//vendor/github.com/stretchr/testify/assert:go_default_library",
|
||||
],
|
||||
)
|
||||
|
@ -17,112 +17,69 @@ limitations under the License.
|
||||
package legacyregistry
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"reflect"
|
||||
"sync"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
dto "github.com/prometheus/client_model/go"
|
||||
|
||||
apimachineryversion "k8s.io/apimachinery/pkg/version"
|
||||
"k8s.io/component-base/metrics"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
var (
|
||||
globalRegistryFactory = metricsRegistryFactory{
|
||||
registerQueue: make([]metrics.Registerable, 0),
|
||||
mustRegisterQueue: make([]metrics.Registerable, 0),
|
||||
globalRegistry: noopRegistry{},
|
||||
}
|
||||
defaultRegistry = metrics.NewKubeRegistry()
|
||||
// DefaultGatherer exposes the global registry gatherer
|
||||
DefaultGatherer prometheus.Gatherer = defaultRegistry
|
||||
)
|
||||
|
||||
type noopRegistry struct{}
|
||||
|
||||
func (noopRegistry) Register(metrics.Registerable) error { return nil }
|
||||
func (noopRegistry) MustRegister(...metrics.Registerable) {}
|
||||
func (noopRegistry) RawRegister(prometheus.Collector) error { return nil }
|
||||
func (noopRegistry) RawMustRegister(...prometheus.Collector) {}
|
||||
func (noopRegistry) Unregister(metrics.Registerable) bool { return true }
|
||||
func (noopRegistry) Gather() ([]*dto.MetricFamily, error) { return nil, nil }
|
||||
|
||||
type metricsRegistryFactory struct {
|
||||
globalRegistry metrics.KubeRegistry
|
||||
kubeVersion *apimachineryversion.Info
|
||||
registrationLock sync.Mutex
|
||||
registerQueue []metrics.Registerable
|
||||
mustRegisterQueue []metrics.Registerable
|
||||
func init() {
|
||||
RawMustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
|
||||
RawMustRegister(prometheus.NewGoCollector())
|
||||
}
|
||||
|
||||
// HandlerForGlobalRegistry returns a http handler for the global registry. This
|
||||
// allows us to return a handler for the global registry without having to expose
|
||||
// the global registry itself directly.
|
||||
func HandlerForGlobalRegistry(opts promhttp.HandlerOpts) http.Handler {
|
||||
return promhttp.HandlerFor(globalRegistryFactory.globalRegistry, opts)
|
||||
// Handler returns an HTTP handler for the DefaultGatherer. It is
|
||||
// already instrumented with InstrumentHandler (using "prometheus" as handler
|
||||
// name).
|
||||
//
|
||||
// Deprecated: Please note the issues described in the doc comment of
|
||||
// InstrumentHandler. You might want to consider using promhttp.Handler instead.
|
||||
func Handler() http.Handler {
|
||||
return prometheus.InstrumentHandler("prometheus", promhttp.HandlerFor(defaultRegistry, promhttp.HandlerOpts{}))
|
||||
}
|
||||
|
||||
// SetRegistryFactoryVersion sets the kubernetes version information for all
|
||||
// subsequent metrics registry initializations. Only the first call has an effect.
|
||||
// If a version is not set, then metrics registry creation will no-opt
|
||||
func SetRegistryFactoryVersion(ver apimachineryversion.Info) []error {
|
||||
globalRegistryFactory.registrationLock.Lock()
|
||||
defer globalRegistryFactory.registrationLock.Unlock()
|
||||
if globalRegistryFactory.kubeVersion != nil {
|
||||
if globalRegistryFactory.kubeVersion.String() != ver.String() {
|
||||
panic(fmt.Sprintf("Cannot load a global registry more than once, had %s tried to load %s",
|
||||
globalRegistryFactory.kubeVersion.String(),
|
||||
ver.String()))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
registrationErrs := make([]error, 0)
|
||||
preloadedMetrics := []prometheus.Collector{
|
||||
prometheus.NewGoCollector(),
|
||||
prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}),
|
||||
}
|
||||
globalRegistryFactory.globalRegistry = metrics.NewKubeRegistry(ver)
|
||||
globalRegistryFactory.globalRegistry.RawMustRegister(preloadedMetrics...)
|
||||
globalRegistryFactory.kubeVersion = &ver
|
||||
for _, c := range globalRegistryFactory.registerQueue {
|
||||
err := globalRegistryFactory.globalRegistry.Register(c)
|
||||
if err != nil {
|
||||
registrationErrs = append(registrationErrs, err)
|
||||
}
|
||||
}
|
||||
for _, c := range globalRegistryFactory.mustRegisterQueue {
|
||||
globalRegistryFactory.globalRegistry.MustRegister(c)
|
||||
}
|
||||
return registrationErrs
|
||||
}
|
||||
|
||||
// Register registers a collectable metric, but it uses a global registry. Registration is deferred
|
||||
// until the global registry has a version to use.
|
||||
// Register registers a collectable metric but uses the global registry
|
||||
func Register(c metrics.Registerable) error {
|
||||
globalRegistryFactory.registrationLock.Lock()
|
||||
defer globalRegistryFactory.registrationLock.Unlock()
|
||||
|
||||
if reflect.DeepEqual(globalRegistryFactory.globalRegistry, noopRegistry{}) {
|
||||
globalRegistryFactory.registerQueue = append(globalRegistryFactory.registerQueue, c)
|
||||
return nil
|
||||
}
|
||||
|
||||
return globalRegistryFactory.globalRegistry.Register(c)
|
||||
err := defaultRegistry.Register(c)
|
||||
// sideload global prom registry as fallback
|
||||
prometheus.Register(c)
|
||||
return err
|
||||
}
|
||||
|
||||
// MustRegister works like Register but registers any number of
|
||||
// Collectors and panics upon the first registration that causes an
|
||||
// error. Registration is deferred until the global registry has a version to use.
|
||||
// MustRegister registers registerable metrics but uses the global registry.
|
||||
func MustRegister(cs ...metrics.Registerable) {
|
||||
globalRegistryFactory.registrationLock.Lock()
|
||||
defer globalRegistryFactory.registrationLock.Unlock()
|
||||
|
||||
if reflect.DeepEqual(globalRegistryFactory.globalRegistry, noopRegistry{}) {
|
||||
for _, c := range cs {
|
||||
globalRegistryFactory.mustRegisterQueue = append(globalRegistryFactory.mustRegisterQueue, c)
|
||||
}
|
||||
return
|
||||
defaultRegistry.MustRegister(cs...)
|
||||
// sideload global prom registry as fallback
|
||||
for _, c := range cs {
|
||||
prometheus.Register(c)
|
||||
}
|
||||
globalRegistryFactory.globalRegistry.MustRegister(cs...)
|
||||
return
|
||||
}
|
||||
|
||||
// RawMustRegister registers prometheus collectors but uses the global registry, this
|
||||
// bypasses the metric stability framework
|
||||
//
|
||||
// Deprecated
|
||||
func RawMustRegister(cs ...prometheus.Collector) {
|
||||
defaultRegistry.RawMustRegister(cs...)
|
||||
// sideload global prom registry as fallback
|
||||
for _, c := range cs {
|
||||
prometheus.Register(c)
|
||||
}
|
||||
}
|
||||
|
||||
// RawRegister registers a prometheus collector but uses the global registry, this
|
||||
// bypasses the metric stability framework
|
||||
//
|
||||
// Deprecated
|
||||
func RawRegister(c prometheus.Collector) error {
|
||||
err := defaultRegistry.RawRegister(c)
|
||||
// sideload global prom registry as fallback
|
||||
prometheus.Register(c)
|
||||
return err
|
||||
}
|
||||
|
@ -1,225 +0,0 @@
|
||||
/*
|
||||
Copyright 2019 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 legacyregistry
|
||||
|
||||
import (
|
||||
"github.com/blang/semver"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"k8s.io/component-base/metrics"
|
||||
"testing"
|
||||
|
||||
apimachineryversion "k8s.io/apimachinery/pkg/version"
|
||||
)
|
||||
|
||||
func init() {
|
||||
SetRegistryFactoryVersion(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
})
|
||||
}
|
||||
|
||||
var (
|
||||
alphaCounter = metrics.NewCounter(
|
||||
&metrics.CounterOpts{
|
||||
Namespace: "some_namespace",
|
||||
Name: "test_counter_name",
|
||||
Subsystem: "subsystem",
|
||||
StabilityLevel: metrics.ALPHA,
|
||||
Help: "counter help",
|
||||
},
|
||||
)
|
||||
alphaDeprecatedCounter = metrics.NewCounter(
|
||||
&metrics.CounterOpts{
|
||||
Namespace: "some_namespace",
|
||||
Name: "test_alpha_dep_counter",
|
||||
Subsystem: "subsystem",
|
||||
StabilityLevel: metrics.ALPHA,
|
||||
Help: "counter help",
|
||||
DeprecatedVersion: "1.15.0",
|
||||
},
|
||||
)
|
||||
alphaHiddenCounter = metrics.NewCounter(
|
||||
&metrics.CounterOpts{
|
||||
Namespace: "some_namespace",
|
||||
Name: "test_alpha_hidden_counter",
|
||||
Subsystem: "subsystem",
|
||||
StabilityLevel: metrics.ALPHA,
|
||||
Help: "counter help",
|
||||
DeprecatedVersion: "1.14.0",
|
||||
},
|
||||
)
|
||||
)
|
||||
|
||||
func TestRegister(t *testing.T) {
|
||||
var tests = []struct {
|
||||
desc string
|
||||
metrics []*metrics.Counter
|
||||
registryVersion *semver.Version
|
||||
expectedErrors []error
|
||||
expectedIsCreatedValues []bool
|
||||
expectedIsDeprecated []bool
|
||||
expectedIsHidden []bool
|
||||
}{
|
||||
{
|
||||
desc: "test registering same metric multiple times",
|
||||
metrics: []*metrics.Counter{alphaCounter, alphaCounter},
|
||||
expectedErrors: []error{nil, prometheus.AlreadyRegisteredError{}},
|
||||
expectedIsCreatedValues: []bool{true, true},
|
||||
expectedIsDeprecated: []bool{false, false},
|
||||
expectedIsHidden: []bool{false, false},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
//t.Errorf("len %v - %v\n", len(test.metrics), len(test.expectedErrors))
|
||||
for i, m := range test.metrics {
|
||||
//t.Errorf("m %v\n", m)
|
||||
err := Register(m)
|
||||
if err != test.expectedErrors[i] && err.Error() != test.expectedErrors[i].Error() {
|
||||
t.Errorf("Got unexpected error %v, wanted %v", err, test.expectedErrors[i])
|
||||
}
|
||||
if m.IsCreated() != test.expectedIsCreatedValues[i] {
|
||||
t.Errorf("Got isCreated == %v, wanted isCreated to be %v", m.IsCreated(), test.expectedIsCreatedValues[i])
|
||||
}
|
||||
if m.IsDeprecated() != test.expectedIsDeprecated[i] {
|
||||
t.Errorf("Got IsDeprecated == %v, wanted IsDeprecated to be %v", m.IsDeprecated(), test.expectedIsDeprecated[i])
|
||||
}
|
||||
if m.IsHidden() != test.expectedIsHidden[i] {
|
||||
t.Errorf("Got IsHidden == %v, wanted IsHidden to be %v", m.IsHidden(), test.expectedIsDeprecated[i])
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestMustRegister(t *testing.T) {
|
||||
var tests = []struct {
|
||||
desc string
|
||||
metrics []*metrics.Counter
|
||||
registryVersion *semver.Version
|
||||
expectedPanics []bool
|
||||
}{
|
||||
{
|
||||
desc: "test must registering same deprecated metric",
|
||||
metrics: []*metrics.Counter{alphaDeprecatedCounter, alphaDeprecatedCounter},
|
||||
expectedPanics: []bool{false, true},
|
||||
},
|
||||
{
|
||||
desc: "test alpha hidden metric",
|
||||
metrics: []*metrics.Counter{alphaHiddenCounter},
|
||||
expectedPanics: []bool{false},
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
for i, m := range test.metrics {
|
||||
if test.expectedPanics[i] {
|
||||
assert.Panics(t,
|
||||
func() { MustRegister(m) },
|
||||
"Did not panic even though we expected it.")
|
||||
} else {
|
||||
MustRegister(m)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeferredRegister(t *testing.T) {
|
||||
// reset the global registry for this test.
|
||||
globalRegistryFactory = metricsRegistryFactory{
|
||||
registerQueue: make([]metrics.Registerable, 0),
|
||||
mustRegisterQueue: make([]metrics.Registerable, 0),
|
||||
globalRegistry: noopRegistry{},
|
||||
}
|
||||
var err error
|
||||
err = Register(alphaDeprecatedCounter)
|
||||
if err != nil {
|
||||
t.Errorf("Got err == %v, expected no error", err)
|
||||
}
|
||||
err = Register(alphaDeprecatedCounter)
|
||||
if err != nil {
|
||||
t.Errorf("Got err == %v, expected no error", err)
|
||||
}
|
||||
// set the global registry version
|
||||
errs := SetRegistryFactoryVersion(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
})
|
||||
if len(errs) != 1 {
|
||||
t.Errorf("Got %d errs, expected 1", len(errs))
|
||||
for _, err := range errs {
|
||||
t.Logf("\t Got %v", err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDeferredMustRegister(t *testing.T) {
|
||||
// reset the global registry for this test.
|
||||
globalRegistryFactory = metricsRegistryFactory{
|
||||
registerQueue: make([]metrics.Registerable, 0),
|
||||
mustRegisterQueue: make([]metrics.Registerable, 0),
|
||||
globalRegistry: noopRegistry{},
|
||||
}
|
||||
MustRegister(alphaDeprecatedCounter)
|
||||
|
||||
MustRegister(alphaDeprecatedCounter)
|
||||
assert.Panics(t,
|
||||
func() {
|
||||
SetRegistryFactoryVersion(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
})
|
||||
},
|
||||
"Did not panic even though we expected it.")
|
||||
}
|
||||
|
||||
func TestPreloadedMetrics(t *testing.T) {
|
||||
// reset the global registry for this test.
|
||||
globalRegistryFactory = metricsRegistryFactory{
|
||||
registerQueue: make([]metrics.Registerable, 0),
|
||||
mustRegisterQueue: make([]metrics.Registerable, 0),
|
||||
}
|
||||
|
||||
SetRegistryFactoryVersion(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
})
|
||||
// partial list of some preregistered metrics we expect
|
||||
expectedMetricNames := []string{"go_gc_duration_seconds", "process_start_time_seconds"}
|
||||
|
||||
mf, err := globalRegistryFactory.globalRegistry.Gather()
|
||||
if err != nil {
|
||||
t.Errorf("Got unexpected error %v ", err)
|
||||
}
|
||||
metricNames := map[string]struct{}{}
|
||||
for _, f := range mf {
|
||||
metricNames[f.GetName()] = struct{}{}
|
||||
}
|
||||
for _, expectedMetric := range expectedMetricNames {
|
||||
if _, ok := metricNames[expectedMetric]; !ok {
|
||||
t.Errorf("Expected %v to be preregistered", expectedMetric)
|
||||
}
|
||||
}
|
||||
}
|
@ -25,6 +25,7 @@ import (
|
||||
dto "github.com/prometheus/client_model/go"
|
||||
|
||||
apimachineryversion "k8s.io/apimachinery/pkg/version"
|
||||
"k8s.io/component-base/version"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -139,11 +140,22 @@ func (kr *kubeRegistry) Gather() ([]*dto.MetricFamily, error) {
|
||||
return kr.PromRegistry.Gather()
|
||||
}
|
||||
|
||||
// NewKubeRegistry creates a new vanilla Registry without any Collectors
|
||||
// pre-registered.
|
||||
func NewKubeRegistry(v apimachineryversion.Info) KubeRegistry {
|
||||
return &kubeRegistry{
|
||||
func newKubeRegistry(v apimachineryversion.Info) *kubeRegistry {
|
||||
r := &kubeRegistry{
|
||||
PromRegistry: prometheus.NewRegistry(),
|
||||
version: parseVersion(v),
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
func registerMetadataMetrics(r *kubeRegistry) {
|
||||
RegisterBuildInfo(r)
|
||||
}
|
||||
|
||||
// NewKubeRegistry creates a new vanilla Registry without any Collectors
|
||||
// pre-registered.
|
||||
func NewKubeRegistry() KubeRegistry {
|
||||
r := newKubeRegistry(version.Get())
|
||||
registerMetadataMetrics(r)
|
||||
return r
|
||||
}
|
||||
|
@ -109,7 +109,7 @@ func TestRegister(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
@ -180,7 +180,7 @@ func TestMustRegister(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
@ -199,7 +199,7 @@ func TestMustRegister(t *testing.T) {
|
||||
|
||||
}
|
||||
func TestShowHiddenMetric(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
|
@ -75,7 +75,7 @@ func TestSummary(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
@ -172,7 +172,7 @@ func TestSummaryVec(t *testing.T) {
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
registry := NewKubeRegistry(apimachineryversion.Info{
|
||||
registry := newKubeRegistry(apimachineryversion.Info{
|
||||
Major: "1",
|
||||
Minor: "15",
|
||||
GitVersion: "v1.15.0-alpha-1.12345",
|
||||
|
37
staging/src/k8s.io/component-base/metrics/version.go
Normal file
37
staging/src/k8s.io/component-base/metrics/version.go
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
Copyright 2019 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 "k8s.io/component-base/version"
|
||||
|
||||
var (
|
||||
buildInfo = NewGaugeVec(
|
||||
&GaugeOpts{
|
||||
Name: "kubernetes_build_info",
|
||||
Help: "A metric with a constant '1' value labeled by major, minor, git version, git commit, git tree state, build date, Go version, and compiler from which Kubernetes was built, and platform on which it is running.",
|
||||
StabilityLevel: ALPHA,
|
||||
},
|
||||
[]string{"major", "minor", "gitVersion", "gitCommit", "gitTreeState", "buildDate", "goVersion", "compiler", "platform"},
|
||||
)
|
||||
)
|
||||
|
||||
// RegisterBuildInfo registers the build and version info in a metadata metric in prometheus
|
||||
func RegisterBuildInfo(r KubeRegistry) {
|
||||
info := version.Get()
|
||||
buildInfo.WithLabelValues(info.Major, info.Minor, info.GitVersion, info.GitCommit, info.GitTreeState, info.BuildDate, info.GoVersion, info.Compiler, info.Platform).Set(1)
|
||||
r.MustRegister(buildInfo)
|
||||
}
|
1
staging/src/k8s.io/component-base/version/.gitattributes
vendored
Normal file
1
staging/src/k8s.io/component-base/version/.gitattributes
vendored
Normal file
@ -0,0 +1 @@
|
||||
base.go export-subst
|
27
staging/src/k8s.io/component-base/version/BUILD
Normal file
27
staging/src/k8s.io/component-base/version/BUILD
Normal file
@ -0,0 +1,27 @@
|
||||
load("@io_bazel_rules_go//go:def.bzl", "go_library")
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = [
|
||||
"base.go",
|
||||
"version.go",
|
||||
],
|
||||
importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/version",
|
||||
importpath = "k8s.io/component-base/version",
|
||||
visibility = ["//visibility:public"],
|
||||
deps = ["//staging/src/k8s.io/apimachinery/pkg/version:go_default_library"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
63
staging/src/k8s.io/component-base/version/base.go
Normal file
63
staging/src/k8s.io/component-base/version/base.go
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
Copyright 2019 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 version
|
||||
|
||||
// Base version information.
|
||||
//
|
||||
// This is the fallback data used when version information from git is not
|
||||
// provided via go ldflags. It provides an approximation of the Kubernetes
|
||||
// version for ad-hoc builds (e.g. `go build`) that cannot get the version
|
||||
// information from git.
|
||||
//
|
||||
// If you are looking at these fields in the git tree, they look
|
||||
// strange. They are modified on the fly by the build process. The
|
||||
// in-tree values are dummy values used for "git archive", which also
|
||||
// works for GitHub tar downloads.
|
||||
//
|
||||
// When releasing a new Kubernetes version, this file is updated by
|
||||
// build/mark_new_version.sh to reflect the new version, and then a
|
||||
// git annotated tag (using format vX.Y where X == Major version and Y
|
||||
// == Minor version) is created to point to the commit that updates
|
||||
// pkg/version/base.go
|
||||
var (
|
||||
// TODO: Deprecate gitMajor and gitMinor, use only gitVersion
|
||||
// instead. First step in deprecation, keep the fields but make
|
||||
// them irrelevant. (Next we'll take it out, which may muck with
|
||||
// scripts consuming the kubectl version output - but most of
|
||||
// these should be looking at gitVersion already anyways.)
|
||||
gitMajor string // major version, always numeric
|
||||
gitMinor string // minor version, numeric possibly followed by "+"
|
||||
|
||||
// semantic version, derived by build scripts (see
|
||||
// https://github.com/kubernetes/community/blob/master/contributors/design-proposals/release/versioning.md
|
||||
// for a detailed discussion of this field)
|
||||
//
|
||||
// TODO: This field is still called "gitVersion" for legacy
|
||||
// reasons. For prerelease versions, the build metadata on the
|
||||
// semantic version is a git hash, but the version itself is no
|
||||
// longer the direct output of "git describe", but a slight
|
||||
// translation to be semver compliant.
|
||||
|
||||
// NOTE: The $Format strings are replaced during 'git archive' thanks to the
|
||||
// companion .gitattributes file containing 'export-subst' in this same
|
||||
// directory. See also https://git-scm.com/docs/gitattributes
|
||||
gitVersion = "v0.0.0-master+$Format:%h$"
|
||||
gitCommit = "$Format:%H$" // sha1 from git, output of $(git rev-parse HEAD)
|
||||
gitTreeState = "" // state of git tree, either "clean" or "dirty"
|
||||
|
||||
buildDate = "1970-01-01T00:00:00Z" // build date in ISO8601 format, output of $(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
||||
)
|
39
staging/src/k8s.io/component-base/version/def.bzl
Normal file
39
staging/src/k8s.io/component-base/version/def.bzl
Normal file
@ -0,0 +1,39 @@
|
||||
# Copyright 2017 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.
|
||||
|
||||
# Implements hack/lib/version.sh's kube::version::ldflags() for Bazel.
|
||||
def version_x_defs():
|
||||
# This should match the list of packages in kube::version::ldflag
|
||||
stamp_pkgs = [
|
||||
"k8s.io/kubernetes/pkg/version",
|
||||
"k8s.io/kubernetes/vendor/k8s.io/component-base/version",
|
||||
]
|
||||
|
||||
# This should match the list of vars in kube::version::ldflags
|
||||
# It should also match the list of vars set in hack/print-workspace-status.sh.
|
||||
stamp_vars = [
|
||||
"buildDate",
|
||||
"gitCommit",
|
||||
"gitMajor",
|
||||
"gitMinor",
|
||||
"gitTreeState",
|
||||
"gitVersion",
|
||||
]
|
||||
|
||||
# Generate the cross-product.
|
||||
x_defs = {}
|
||||
for pkg in stamp_pkgs:
|
||||
for var in stamp_vars:
|
||||
x_defs["%s.%s" % (pkg, var)] = "{%s}" % var
|
||||
return x_defs
|
42
staging/src/k8s.io/component-base/version/version.go
Normal file
42
staging/src/k8s.io/component-base/version/version.go
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
Copyright 2019 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 version
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
|
||||
apimachineryversion "k8s.io/apimachinery/pkg/version"
|
||||
)
|
||||
|
||||
// Get returns the overall codebase version. It's for detecting
|
||||
// what code a binary was built from.
|
||||
func Get() apimachineryversion.Info {
|
||||
// These variables typically come from -ldflags settings and in
|
||||
// their absence fallback to the settings in ./base.go
|
||||
return apimachineryversion.Info{
|
||||
Major: gitMajor,
|
||||
Minor: gitMinor,
|
||||
GitVersion: gitVersion,
|
||||
GitCommit: gitCommit,
|
||||
GitTreeState: gitTreeState,
|
||||
BuildDate: buildDate,
|
||||
GoVersion: runtime.Version(),
|
||||
Compiler: runtime.Compiler,
|
||||
Platform: fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH),
|
||||
}
|
||||
}
|
1
vendor/modules.txt
vendored
1
vendor/modules.txt
vendored
@ -1620,6 +1620,7 @@ k8s.io/component-base/featuregate
|
||||
k8s.io/component-base/featuregate/testing
|
||||
k8s.io/component-base/logs
|
||||
k8s.io/component-base/metrics
|
||||
k8s.io/component-base/version
|
||||
# k8s.io/cri-api v0.0.0 => ./staging/src/k8s.io/cri-api
|
||||
k8s.io/cri-api/pkg/apis
|
||||
k8s.io/cri-api/pkg/apis/runtime/v1alpha2
|
||||
|
Loading…
Reference in New Issue
Block a user