Skip to content

Commit b037203

Browse files
author
Han Kang
committed
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
1 parent d951d19 commit b037203

File tree

19 files changed

+289
-345
lines changed

19 files changed

+289
-345
lines changed

hack/lib/version.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ kube::version::ldflags() {
161161
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/client-go/pkg/version.${key}=${val}'"
162162
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/kubectl/pkg/version.${key}=${val}'"
163163
"-X '${KUBE_GO_PACKAGE}/cmd/kubeadm/app/version.${key}=${val}'"
164+
"-X '${KUBE_GO_PACKAGE}/vendor/k8s.io/component-base/version.${key}=${val}'"
164165
)
165166
}
166167

staging/src/k8s.io/component-base/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ filegroup(
1515
"//staging/src/k8s.io/component-base/featuregate:all-srcs",
1616
"//staging/src/k8s.io/component-base/logs:all-srcs",
1717
"//staging/src/k8s.io/component-base/metrics:all-srcs",
18+
"//staging/src/k8s.io/component-base/version:all-srcs",
1819
],
1920
tags = ["automanaged"],
2021
visibility = ["//visibility:public"],

staging/src/k8s.io/component-base/metrics/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ load(
55
"go_library",
66
"go_test",
77
)
8+
load("//staging/src/k8s.io/component-base/version:def.bzl", "version_x_defs")
89

910
go_library(
1011
name = "go_default_library",
@@ -17,13 +18,15 @@ go_library(
1718
"processstarttime.go",
1819
"registry.go",
1920
"summary.go",
21+
"version.go",
2022
"version_parser.go",
2123
"wrappers.go",
2224
],
2325
importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics",
2426
importpath = "k8s.io/component-base/metrics",
2527
deps = [
2628
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
29+
"//staging/src/k8s.io/component-base/version:go_default_library",
2730
"//vendor/github.com/blang/semver:go_default_library",
2831
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
2932
"//vendor/github.com/prometheus/client_model/go:go_default_library",

staging/src/k8s.io/component-base/metrics/counter_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func TestCounter(t *testing.T) {
7272

7373
for _, test := range tests {
7474
t.Run(test.desc, func(t *testing.T) {
75-
registry := NewKubeRegistry(apimachineryversion.Info{
75+
registry := newKubeRegistry(apimachineryversion.Info{
7676
Major: "1",
7777
Minor: "15",
7878
GitVersion: "v1.15.0-alpha-1.12345",
@@ -184,7 +184,7 @@ func TestCounterVec(t *testing.T) {
184184

185185
for _, test := range tests {
186186
t.Run(test.desc, func(t *testing.T) {
187-
registry := NewKubeRegistry(apimachineryversion.Info{
187+
registry := newKubeRegistry(apimachineryversion.Info{
188188
Major: "1",
189189
Minor: "15",
190190
GitVersion: "v1.15.0-alpha-1.12345",

staging/src/k8s.io/component-base/metrics/gauge_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func TestGauge(t *testing.T) {
7373

7474
for _, test := range tests {
7575
t.Run(test.desc, func(t *testing.T) {
76-
registry := NewKubeRegistry(apimachineryversion.Info{
76+
registry := newKubeRegistry(apimachineryversion.Info{
7777
Major: "1",
7878
Minor: "15",
7979
GitVersion: "v1.15.0-alpha-1.12345",
@@ -169,7 +169,7 @@ func TestGaugeVec(t *testing.T) {
169169

170170
for _, test := range tests {
171171
t.Run(test.desc, func(t *testing.T) {
172-
registry := NewKubeRegistry(apimachineryversion.Info{
172+
registry := newKubeRegistry(apimachineryversion.Info{
173173
Major: "1",
174174
Minor: "15",
175175
GitVersion: "v1.15.0-alpha-1.12345",

staging/src/k8s.io/component-base/metrics/histogram_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ func TestHistogram(t *testing.T) {
7777

7878
for _, test := range tests {
7979
t.Run(test.desc, func(t *testing.T) {
80-
registry := NewKubeRegistry(apimachineryversion.Info{
80+
registry := newKubeRegistry(apimachineryversion.Info{
8181
Major: "1",
8282
Minor: "15",
8383
GitVersion: "v1.15.0-alpha-1.12345",
@@ -177,7 +177,7 @@ func TestHistogramVec(t *testing.T) {
177177

178178
for _, test := range tests {
179179
t.Run(test.desc, func(t *testing.T) {
180-
registry := NewKubeRegistry(apimachineryversion.Info{
180+
registry := newKubeRegistry(apimachineryversion.Info{
181181
Major: "1",
182182
Minor: "15",
183183
GitVersion: "v1.15.0-alpha-1.12345",
Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
package(default_visibility = ["//visibility:public"])
22

3-
load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
3+
load("@io_bazel_rules_go//go:def.bzl", "go_library")
44

55
go_library(
66
name = "go_default_library",
77
srcs = ["registry.go"],
88
importmap = "k8s.io/kubernetes/vendor/k8s.io/component-base/metrics/legacyregistry",
99
importpath = "k8s.io/component-base/metrics/legacyregistry",
1010
deps = [
11-
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
1211
"//staging/src/k8s.io/component-base/metrics:go_default_library",
1312
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
1413
"//vendor/github.com/prometheus/client_golang/prometheus/promhttp:go_default_library",
15-
"//vendor/github.com/prometheus/client_model/go:go_default_library",
1614
],
1715
)
1816

@@ -28,16 +26,3 @@ filegroup(
2826
srcs = [":package-srcs"],
2927
tags = ["automanaged"],
3028
)
31-
32-
go_test(
33-
name = "go_default_test",
34-
srcs = ["registry_test.go"],
35-
embed = [":go_default_library"],
36-
deps = [
37-
"//staging/src/k8s.io/apimachinery/pkg/version:go_default_library",
38-
"//staging/src/k8s.io/component-base/metrics:go_default_library",
39-
"//vendor/github.com/blang/semver:go_default_library",
40-
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
41-
"//vendor/github.com/stretchr/testify/assert:go_default_library",
42-
],
43-
)

staging/src/k8s.io/component-base/metrics/legacyregistry/registry.go

Lines changed: 46 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -17,112 +17,69 @@ limitations under the License.
1717
package legacyregistry
1818

1919
import (
20-
"fmt"
21-
"net/http"
22-
"reflect"
23-
"sync"
24-
2520
"github.com/prometheus/client_golang/prometheus"
2621
"github.com/prometheus/client_golang/prometheus/promhttp"
27-
dto "github.com/prometheus/client_model/go"
28-
29-
apimachineryversion "k8s.io/apimachinery/pkg/version"
3022
"k8s.io/component-base/metrics"
23+
"net/http"
3124
)
3225

3326
var (
34-
globalRegistryFactory = metricsRegistryFactory{
35-
registerQueue: make([]metrics.Registerable, 0),
36-
mustRegisterQueue: make([]metrics.Registerable, 0),
37-
globalRegistry: noopRegistry{},
38-
}
27+
defaultRegistry = metrics.NewKubeRegistry()
28+
// DefaultGatherer exposes the global registry gatherer
29+
DefaultGatherer prometheus.Gatherer = defaultRegistry
3930
)
4031

41-
type noopRegistry struct{}
42-
43-
func (noopRegistry) Register(metrics.Registerable) error { return nil }
44-
func (noopRegistry) MustRegister(...metrics.Registerable) {}
45-
func (noopRegistry) RawRegister(prometheus.Collector) error { return nil }
46-
func (noopRegistry) RawMustRegister(...prometheus.Collector) {}
47-
func (noopRegistry) Unregister(metrics.Registerable) bool { return true }
48-
func (noopRegistry) Gather() ([]*dto.MetricFamily, error) { return nil, nil }
32+
func init() {
33+
RawMustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}))
34+
RawMustRegister(prometheus.NewGoCollector())
35+
}
4936

50-
type metricsRegistryFactory struct {
51-
globalRegistry metrics.KubeRegistry
52-
kubeVersion *apimachineryversion.Info
53-
registrationLock sync.Mutex
54-
registerQueue []metrics.Registerable
55-
mustRegisterQueue []metrics.Registerable
37+
// Handler returns an HTTP handler for the DefaultGatherer. It is
38+
// already instrumented with InstrumentHandler (using "prometheus" as handler
39+
// name).
40+
//
41+
// Deprecated: Please note the issues described in the doc comment of
42+
// InstrumentHandler. You might want to consider using promhttp.Handler instead.
43+
func Handler() http.Handler {
44+
return prometheus.InstrumentHandler("prometheus", promhttp.HandlerFor(defaultRegistry, promhttp.HandlerOpts{}))
5645
}
5746

58-
// HandlerForGlobalRegistry returns a http handler for the global registry. This
59-
// allows us to return a handler for the global registry without having to expose
60-
// the global registry itself directly.
61-
func HandlerForGlobalRegistry(opts promhttp.HandlerOpts) http.Handler {
62-
return promhttp.HandlerFor(globalRegistryFactory.globalRegistry, opts)
47+
// Register registers a collectable metric but uses the global registry
48+
func Register(c metrics.Registerable) error {
49+
err := defaultRegistry.Register(c)
50+
// sideload global prom registry as fallback
51+
prometheus.Register(c)
52+
return err
6353
}
6454

65-
// SetRegistryFactoryVersion sets the kubernetes version information for all
66-
// subsequent metrics registry initializations. Only the first call has an effect.
67-
// If a version is not set, then metrics registry creation will no-opt
68-
func SetRegistryFactoryVersion(ver apimachineryversion.Info) []error {
69-
globalRegistryFactory.registrationLock.Lock()
70-
defer globalRegistryFactory.registrationLock.Unlock()
71-
if globalRegistryFactory.kubeVersion != nil {
72-
if globalRegistryFactory.kubeVersion.String() != ver.String() {
73-
panic(fmt.Sprintf("Cannot load a global registry more than once, had %s tried to load %s",
74-
globalRegistryFactory.kubeVersion.String(),
75-
ver.String()))
76-
}
77-
return nil
78-
}
79-
registrationErrs := make([]error, 0)
80-
preloadedMetrics := []prometheus.Collector{
81-
prometheus.NewGoCollector(),
82-
prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{}),
83-
}
84-
globalRegistryFactory.globalRegistry = metrics.NewKubeRegistry(ver)
85-
globalRegistryFactory.globalRegistry.RawMustRegister(preloadedMetrics...)
86-
globalRegistryFactory.kubeVersion = &ver
87-
for _, c := range globalRegistryFactory.registerQueue {
88-
err := globalRegistryFactory.globalRegistry.Register(c)
89-
if err != nil {
90-
registrationErrs = append(registrationErrs, err)
91-
}
92-
}
93-
for _, c := range globalRegistryFactory.mustRegisterQueue {
94-
globalRegistryFactory.globalRegistry.MustRegister(c)
55+
// MustRegister registers registerable metrics but uses the global registry.
56+
func MustRegister(cs ...metrics.Registerable) {
57+
defaultRegistry.MustRegister(cs...)
58+
// sideload global prom registry as fallback
59+
for _, c := range cs {
60+
prometheus.Register(c)
9561
}
96-
return registrationErrs
9762
}
9863

99-
// Register registers a collectable metric, but it uses a global registry. Registration is deferred
100-
// until the global registry has a version to use.
101-
func Register(c metrics.Registerable) error {
102-
globalRegistryFactory.registrationLock.Lock()
103-
defer globalRegistryFactory.registrationLock.Unlock()
104-
105-
if reflect.DeepEqual(globalRegistryFactory.globalRegistry, noopRegistry{}) {
106-
globalRegistryFactory.registerQueue = append(globalRegistryFactory.registerQueue, c)
107-
return nil
64+
// RawMustRegister registers prometheus collectors but uses the global registry, this
65+
// bypasses the metric stability framework
66+
//
67+
// Deprecated
68+
func RawMustRegister(cs ...prometheus.Collector) {
69+
defaultRegistry.RawMustRegister(cs...)
70+
// sideload global prom registry as fallback
71+
for _, c := range cs {
72+
prometheus.Register(c)
10873
}
109-
110-
return globalRegistryFactory.globalRegistry.Register(c)
11174
}
11275

113-
// MustRegister works like Register but registers any number of
114-
// Collectors and panics upon the first registration that causes an
115-
// error. Registration is deferred until the global registry has a version to use.
116-
func MustRegister(cs ...metrics.Registerable) {
117-
globalRegistryFactory.registrationLock.Lock()
118-
defer globalRegistryFactory.registrationLock.Unlock()
119-
120-
if reflect.DeepEqual(globalRegistryFactory.globalRegistry, noopRegistry{}) {
121-
for _, c := range cs {
122-
globalRegistryFactory.mustRegisterQueue = append(globalRegistryFactory.mustRegisterQueue, c)
123-
}
124-
return
125-
}
126-
globalRegistryFactory.globalRegistry.MustRegister(cs...)
127-
return
76+
// RawRegister registers a prometheus collector but uses the global registry, this
77+
// bypasses the metric stability framework
78+
//
79+
// Deprecated
80+
func RawRegister(c prometheus.Collector) error {
81+
err := defaultRegistry.RawRegister(c)
82+
// sideload global prom registry as fallback
83+
prometheus.Register(c)
84+
return err
12885
}

0 commit comments

Comments
 (0)