Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 45e5719

Browse files
author
Kubernetes Submit Queue
authored
Merge pull request #33792 from caesarxuchao/decouple-workqueue-prometheus
Automatic merge from submit-queue decouple workqueue metrics from prometheus <!-- Thanks for sending a pull request! Here are some tips for you: 1. If this is your first time, read our contributor guidelines https://github.com/kubernetes/kubernetes/blob/master/CONTRIBUTING.md and developer guide https://github.com/kubernetes/kubernetes/blob/master/docs/devel/development.md 2. If you want *faster* PR reviews, read how: https://github.com/kubernetes/kubernetes/blob/master/docs/devel/faster_reviews.md 3. Follow the instructions for writing a release note: https://github.com/kubernetes/kubernetes/blob/master/docs/devel/pull-requests.md#release-notes --> **What this PR does / why we need it**: We want to include the workqueue in client-go, but do not want to having to import Prometheus. This PR decouples the workqueue from prometheus. **Which issue this PR fixes** *(optional, in `fixes #<issue number>(, #<issue_number>, ...)` format, will close that issue when PR gets merged)*: fixes # Partially address #33497 User requested for `workqueue` in client-go: https://github.com/kubernetes/client-go/issues/4#issuecomment-249444848 **Special notes for your reviewer**: **Release note**: <!-- Steps to write your release note: 1. Use the release-note-* labels to set the release note state (if you have access) 2. Enter your extended release note in the below block; leaving it blank means using the PR title as the release note. If no release note is required, just write `NONE`. --> ```release-note The implicit registration of Prometheus metrics for workqueue has been removed, and a plug-able interface was added. If you were using workqueue in your own binaries and want these metrics, add the following to your imports in the main package: "k8s.io/pkg/util/workqueue/prometheus". ```
2 parents 63139f9 + feb0d1d commit 45e5719

5 files changed

Lines changed: 189 additions & 62 deletions

File tree

cmd/kube-controller-manager/controller-manager.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ import (
3030
"k8s.io/kubernetes/pkg/healthz"
3131
"k8s.io/kubernetes/pkg/util/flag"
3232
"k8s.io/kubernetes/pkg/util/logs"
33-
_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
33+
_ "k8s.io/kubernetes/pkg/util/workqueue/prometheus" // for workqueue metric registration
34+
_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
3435
"k8s.io/kubernetes/pkg/version/verflag"
3536

3637
"github.com/spf13/pflag"

federation/cmd/federation-controller-manager/controller-manager.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"k8s.io/kubernetes/pkg/healthz"
2727
"k8s.io/kubernetes/pkg/util/flag"
2828
"k8s.io/kubernetes/pkg/util/logs"
29+
_ "k8s.io/kubernetes/pkg/util/workqueue/prometheus" // for workqueue metric registration
2930
"k8s.io/kubernetes/pkg/version/verflag"
3031
)
3132

pkg/util/workqueue/metrics.go

Lines changed: 103 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -17,63 +17,54 @@ limitations under the License.
1717
package workqueue
1818

1919
import (
20+
"sync"
2021
"time"
21-
22-
"github.com/prometheus/client_golang/prometheus"
2322
)
2423

24+
// This file provides abstractions for setting the provider (e.g., prometheus)
25+
// of metrics.
26+
2527
type queueMetrics interface {
2628
add(item t)
2729
get(item t)
2830
done(item t)
2931
}
3032

31-
type defaultQueueMetrics struct {
32-
depth prometheus.Gauge
33-
adds prometheus.Counter
34-
latency prometheus.Summary
35-
workDuration prometheus.Summary
36-
addTimes map[t]time.Time
37-
processingStartTimes map[t]time.Time
33+
// GaugeMetric represents a single numerical value that can arbitrarily go up
34+
// and down.
35+
type GaugeMetric interface {
36+
Inc()
37+
Dec()
3838
}
3939

40-
func newQueueMetrics(name string) queueMetrics {
41-
var ret *defaultQueueMetrics
42-
if len(name) == 0 {
43-
return ret
44-
}
40+
// CounterMetric represents a single numerical value that only ever
41+
// goes up.
42+
type CounterMetric interface {
43+
Inc()
44+
}
4545

46-
ret = &defaultQueueMetrics{
47-
depth: prometheus.NewGauge(prometheus.GaugeOpts{
48-
Subsystem: name,
49-
Name: "depth",
50-
Help: "Current depth of workqueue: " + name,
51-
}),
52-
adds: prometheus.NewCounter(prometheus.CounterOpts{
53-
Subsystem: name,
54-
Name: "adds",
55-
Help: "Total number of adds handled by workqueue: " + name,
56-
}),
57-
latency: prometheus.NewSummary(prometheus.SummaryOpts{
58-
Subsystem: name,
59-
Name: "queue_latency",
60-
Help: "How long an item stays in workqueue" + name + " before being requested.",
61-
}),
62-
workDuration: prometheus.NewSummary(prometheus.SummaryOpts{
63-
Subsystem: name,
64-
Name: "work_duration",
65-
Help: "How long processing an item from workqueue" + name + " takes.",
66-
}),
67-
addTimes: map[t]time.Time{},
68-
processingStartTimes: map[t]time.Time{},
69-
}
46+
// SummaryMetric captures individual observations.
47+
type SummaryMetric interface {
48+
Observe(float64)
49+
}
50+
51+
type noopMetric struct{}
7052

71-
prometheus.Register(ret.depth)
72-
prometheus.Register(ret.adds)
73-
prometheus.Register(ret.latency)
74-
prometheus.Register(ret.workDuration)
53+
func (noopMetric) Inc() {}
54+
func (noopMetric) Dec() {}
55+
func (noopMetric) Observe(float64) {}
7556

76-
return ret
57+
type defaultQueueMetrics struct {
58+
// current depth of a workqueue
59+
depth GaugeMetric
60+
// total number of adds handled by a workqueue
61+
adds CounterMetric
62+
// how long an item stays in a workqueue
63+
latency SummaryMetric
64+
// how long processing an item from a workqueue takes
65+
workDuration SummaryMetric
66+
addTimes map[t]time.Time
67+
processingStartTimes map[t]time.Time
7768
}
7869

7970
func (m *defaultQueueMetrics) add(item t) {
@@ -122,32 +113,83 @@ type retryMetrics interface {
122113
}
123114

124115
type defaultRetryMetrics struct {
125-
retries prometheus.Counter
116+
retries CounterMetric
126117
}
127118

128-
func newRetryMetrics(name string) retryMetrics {
129-
var ret *defaultRetryMetrics
130-
if len(name) == 0 {
131-
return ret
119+
func (m *defaultRetryMetrics) retry() {
120+
if m == nil {
121+
return
132122
}
133123

134-
ret = &defaultRetryMetrics{
135-
retries: prometheus.NewCounter(prometheus.CounterOpts{
136-
Subsystem: name,
137-
Name: "retries",
138-
Help: "Total number of retries handled by workqueue: " + name,
139-
}),
140-
}
124+
m.retries.Inc()
125+
}
126+
127+
// MetricsProvider generates various metrics used by the queue.
128+
type MetricsProvider interface {
129+
NewDepthMetric(name string) GaugeMetric
130+
NewAddsMetric(name string) CounterMetric
131+
NewLatencyMetric(name string) SummaryMetric
132+
NewWorkDurationMetric(name string) SummaryMetric
133+
NewRetriesMetric(name string) CounterMetric
134+
}
141135

142-
prometheus.Register(ret.retries)
136+
type noopMetricsProvider struct{}
143137

144-
return ret
138+
func (_ noopMetricsProvider) NewDepthMetric(name string) GaugeMetric {
139+
return noopMetric{}
145140
}
146141

147-
func (m *defaultRetryMetrics) retry() {
148-
if m == nil {
149-
return
142+
func (_ noopMetricsProvider) NewAddsMetric(name string) CounterMetric {
143+
return noopMetric{}
144+
}
145+
146+
func (_ noopMetricsProvider) NewLatencyMetric(name string) SummaryMetric {
147+
return noopMetric{}
148+
}
149+
150+
func (_ noopMetricsProvider) NewWorkDurationMetric(name string) SummaryMetric {
151+
return noopMetric{}
152+
}
153+
154+
func (_ noopMetricsProvider) NewRetriesMetric(name string) CounterMetric {
155+
return noopMetric{}
156+
}
157+
158+
var metricsFactory = struct {
159+
metricsProvider MetricsProvider
160+
setProviders sync.Once
161+
}{
162+
metricsProvider: noopMetricsProvider{},
163+
}
164+
165+
func newQueueMetrics(name string) queueMetrics {
166+
var ret *defaultQueueMetrics
167+
if len(name) == 0 {
168+
return ret
169+
}
170+
return &defaultQueueMetrics{
171+
depth: metricsFactory.metricsProvider.NewDepthMetric(name),
172+
adds: metricsFactory.metricsProvider.NewAddsMetric(name),
173+
latency: metricsFactory.metricsProvider.NewLatencyMetric(name),
174+
workDuration: metricsFactory.metricsProvider.NewWorkDurationMetric(name),
175+
addTimes: map[t]time.Time{},
176+
processingStartTimes: map[t]time.Time{},
150177
}
178+
}
151179

152-
m.retries.Inc()
180+
func newRetryMetrics(name string) retryMetrics {
181+
var ret *defaultRetryMetrics
182+
if len(name) == 0 {
183+
return ret
184+
}
185+
return &defaultRetryMetrics{
186+
retries: metricsFactory.metricsProvider.NewRetriesMetric(name),
187+
}
188+
}
189+
190+
// SetProvider sets the metrics provider of the metricsFactory.
191+
func SetProvider(metricsProvider MetricsProvider) {
192+
metricsFactory.setProviders.Do(func() {
193+
metricsFactory.metricsProvider = metricsProvider
194+
})
153195
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
Copyright 2016 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package prometheus
18+
19+
import (
20+
"k8s.io/kubernetes/pkg/util/workqueue"
21+
22+
"github.com/prometheus/client_golang/prometheus"
23+
)
24+
25+
// Package prometheus sets the workqueue DefaultMetricsFactory to produce
26+
// prometheus metrics. To use this package, you just have to import it.
27+
28+
func init() {
29+
workqueue.SetProvider(prometheusMetricsProvider{})
30+
}
31+
32+
type prometheusMetricsProvider struct{}
33+
34+
func (_ prometheusMetricsProvider) NewDepthMetric(name string) workqueue.GaugeMetric {
35+
depth := prometheus.NewGauge(prometheus.GaugeOpts{
36+
Subsystem: name,
37+
Name: "depth",
38+
Help: "Current depth of workqueue: " + name,
39+
})
40+
prometheus.Register(depth)
41+
return depth
42+
}
43+
44+
func (_ prometheusMetricsProvider) NewAddsMetric(name string) workqueue.CounterMetric {
45+
adds := prometheus.NewCounter(prometheus.CounterOpts{
46+
Subsystem: name,
47+
Name: "adds",
48+
Help: "Total number of adds handled by workqueue: " + name,
49+
})
50+
prometheus.Register(adds)
51+
return adds
52+
}
53+
54+
func (_ prometheusMetricsProvider) NewLatencyMetric(name string) workqueue.SummaryMetric {
55+
latency := prometheus.NewSummary(prometheus.SummaryOpts{
56+
Subsystem: name,
57+
Name: "queue_latency",
58+
Help: "How long an item stays in workqueue" + name + " before being requested.",
59+
})
60+
prometheus.Register(latency)
61+
return latency
62+
}
63+
64+
func (_ prometheusMetricsProvider) NewWorkDurationMetric(name string) workqueue.SummaryMetric {
65+
workDuration := prometheus.NewSummary(prometheus.SummaryOpts{
66+
Subsystem: name,
67+
Name: "work_duration",
68+
Help: "How long processing an item from workqueue" + name + " takes.",
69+
})
70+
prometheus.Register(workDuration)
71+
return workDuration
72+
}
73+
74+
func (_ prometheusMetricsProvider) NewRetriesMetric(name string) workqueue.CounterMetric {
75+
retries := prometheus.NewCounter(prometheus.CounterOpts{
76+
Subsystem: name,
77+
Name: "retries",
78+
Help: "Total number of retries handled by workqueue: " + name,
79+
})
80+
prometheus.Register(retries)
81+
return retries
82+
}

plugin/pkg/admission/resourcequota/controller.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/kubernetes/pkg/util/sets"
3434
"k8s.io/kubernetes/pkg/util/wait"
3535
"k8s.io/kubernetes/pkg/util/workqueue"
36+
_ "k8s.io/kubernetes/pkg/util/workqueue/prometheus" // for workqueue metric registration
3637
)
3738

3839
// Evaluator is used to see if quota constraints are satisfied.

0 commit comments

Comments
 (0)