Skip to content

Commit b3dde20

Browse files
authored
Merge pull request kubernetes#84907 from RainbowMango/pr_migrate_custom_collector_kubelet
migrate kubelet custom metrics to stability framework part 1
2 parents 9646bd9 + e4a128a commit b3dde20

File tree

12 files changed

+104
-89
lines changed

12 files changed

+104
-89
lines changed

pkg/kubelet/metrics/collectors/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ go_library(
1313
"//pkg/kubelet/metrics:go_default_library",
1414
"//pkg/kubelet/server/stats:go_default_library",
1515
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
16-
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
16+
"//staging/src/k8s.io/component-base/metrics:go_default_library",
1717
"//vendor/k8s.io/klog:go_default_library",
1818
],
1919
)

pkg/kubelet/metrics/collectors/log_metrics.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@ limitations under the License.
1717
package collectors
1818

1919
import (
20-
"github.com/prometheus/client_golang/prometheus"
20+
"k8s.io/component-base/metrics"
2121
"k8s.io/klog"
22-
2322
statsapi "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1"
2423
)
2524

2625
var (
27-
descLogSize = prometheus.NewDesc(
26+
descLogSize = metrics.NewDesc(
2827
"kubelet_container_log_filesystem_used_bytes",
2928
"Bytes used by the container's logs on the filesystem.",
3029
[]string{
@@ -33,28 +32,35 @@ var (
3332
"pod",
3433
"container",
3534
}, nil,
35+
metrics.ALPHA,
36+
"",
3637
)
3738
)
3839

3940
type logMetricsCollector struct {
41+
metrics.BaseStableCollector
42+
4043
podStats func() ([]statsapi.PodStats, error)
4144
}
4245

43-
// NewLogMetricsCollector implements the prometheus.Collector interface and
46+
// Check if logMetricsCollector implements necessary interface
47+
var _ metrics.StableCollector = &logMetricsCollector{}
48+
49+
// NewLogMetricsCollector implements the metrics.StableCollector interface and
4450
// exposes metrics about container's log volume size.
45-
func NewLogMetricsCollector(podStats func() ([]statsapi.PodStats, error)) prometheus.Collector {
51+
func NewLogMetricsCollector(podStats func() ([]statsapi.PodStats, error)) metrics.StableCollector {
4652
return &logMetricsCollector{
4753
podStats: podStats,
4854
}
4955
}
5056

51-
// Describe implements the prometheus.Collector interface.
52-
func (c *logMetricsCollector) Describe(ch chan<- *prometheus.Desc) {
57+
// DescribeWithStability implements the metrics.StableCollector interface.
58+
func (c *logMetricsCollector) DescribeWithStability(ch chan<- *metrics.Desc) {
5359
ch <- descLogSize
5460
}
5561

56-
// Collect implements the prometheus.Collector interface.
57-
func (c *logMetricsCollector) Collect(ch chan<- prometheus.Metric) {
62+
// CollectWithStability implements the metrics.StableCollector interface.
63+
func (c *logMetricsCollector) CollectWithStability(ch chan<- metrics.Metric) {
5864
podStats, err := c.podStats()
5965
if err != nil {
6066
klog.Errorf("failed to get pod stats: %v", err)
@@ -64,9 +70,9 @@ func (c *logMetricsCollector) Collect(ch chan<- prometheus.Metric) {
6470
for _, ps := range podStats {
6571
for _, c := range ps.Containers {
6672
if c.Logs != nil && c.Logs.UsedBytes != nil {
67-
ch <- prometheus.MustNewConstMetric(
73+
ch <- metrics.NewLazyConstMetric(
6874
descLogSize,
69-
prometheus.GaugeValue,
75+
metrics.GaugeValue,
7076
float64(*c.Logs.UsedBytes),
7177
ps.PodRef.UID,
7278
ps.PodRef.Namespace,

pkg/kubelet/metrics/collectors/log_metrics_test.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,24 @@ import (
2525
)
2626

2727
func TestNoMetricsCollected(t *testing.T) {
28+
// Refresh Desc to share with different registry
29+
descLogSize = descLogSize.GetRawDesc()
30+
2831
collector := &logMetricsCollector{
2932
podStats: func() ([]statsapi.PodStats, error) {
3033
return []statsapi.PodStats{}, nil
3134
},
3235
}
3336

34-
if err := testutil.CollectAndCompare(collector, strings.NewReader(""), ""); err != nil {
37+
if err := testutil.CustomCollectAndCompare(collector, strings.NewReader(""), ""); err != nil {
3538
t.Fatal(err)
3639
}
3740
}
3841

3942
func TestMetricsCollected(t *testing.T) {
43+
// Refresh Desc to share with different registry
44+
descLogSize = descLogSize.GetRawDesc()
45+
4046
size := uint64(18)
4147
collector := &logMetricsCollector{
4248
podStats: func() ([]statsapi.PodStats, error) {
@@ -60,8 +66,8 @@ func TestMetricsCollected(t *testing.T) {
6066
},
6167
}
6268

63-
err := testutil.CollectAndCompare(collector, strings.NewReader(`
64-
# HELP kubelet_container_log_filesystem_used_bytes Bytes used by the container's logs on the filesystem.
69+
err := testutil.CustomCollectAndCompare(collector, strings.NewReader(`
70+
# HELP kubelet_container_log_filesystem_used_bytes [ALPHA] Bytes used by the container's logs on the filesystem.
6571
# TYPE kubelet_container_log_filesystem_used_bytes gauge
6672
kubelet_container_log_filesystem_used_bytes{container="containerName1",namespace="some-namespace",pod="podName1",uid="UID_some_id"} 18
6773
`), "kubelet_container_log_filesystem_used_bytes")

pkg/kubelet/metrics/collectors/volume_stats.go

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,58 +17,68 @@ limitations under the License.
1717
package collectors
1818

1919
import (
20-
"github.com/prometheus/client_golang/prometheus"
2120
"k8s.io/apimachinery/pkg/util/sets"
22-
"k8s.io/klog"
21+
"k8s.io/component-base/metrics"
2322
stats "k8s.io/kubernetes/pkg/kubelet/apis/stats/v1alpha1"
24-
"k8s.io/kubernetes/pkg/kubelet/metrics"
23+
kubeletmetrics "k8s.io/kubernetes/pkg/kubelet/metrics"
2524
serverstats "k8s.io/kubernetes/pkg/kubelet/server/stats"
2625
)
2726

2827
var (
29-
volumeStatsCapacityBytesDesc = prometheus.NewDesc(
30-
prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsCapacityBytesKey),
28+
volumeStatsCapacityBytesDesc = metrics.NewDesc(
29+
metrics.BuildFQName("", kubeletmetrics.KubeletSubsystem, kubeletmetrics.VolumeStatsCapacityBytesKey),
3130
"Capacity in bytes of the volume",
3231
[]string{"namespace", "persistentvolumeclaim"}, nil,
32+
metrics.ALPHA, "",
3333
)
34-
volumeStatsAvailableBytesDesc = prometheus.NewDesc(
35-
prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsAvailableBytesKey),
34+
volumeStatsAvailableBytesDesc = metrics.NewDesc(
35+
metrics.BuildFQName("", kubeletmetrics.KubeletSubsystem, kubeletmetrics.VolumeStatsAvailableBytesKey),
3636
"Number of available bytes in the volume",
3737
[]string{"namespace", "persistentvolumeclaim"}, nil,
38+
metrics.ALPHA, "",
3839
)
39-
volumeStatsUsedBytesDesc = prometheus.NewDesc(
40-
prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsUsedBytesKey),
40+
volumeStatsUsedBytesDesc = metrics.NewDesc(
41+
metrics.BuildFQName("", kubeletmetrics.KubeletSubsystem, kubeletmetrics.VolumeStatsUsedBytesKey),
4142
"Number of used bytes in the volume",
4243
[]string{"namespace", "persistentvolumeclaim"}, nil,
44+
metrics.ALPHA, "",
4345
)
44-
volumeStatsInodesDesc = prometheus.NewDesc(
45-
prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsInodesKey),
46+
volumeStatsInodesDesc = metrics.NewDesc(
47+
metrics.BuildFQName("", kubeletmetrics.KubeletSubsystem, kubeletmetrics.VolumeStatsInodesKey),
4648
"Maximum number of inodes in the volume",
4749
[]string{"namespace", "persistentvolumeclaim"}, nil,
50+
metrics.ALPHA, "",
4851
)
49-
volumeStatsInodesFreeDesc = prometheus.NewDesc(
50-
prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsInodesFreeKey),
52+
volumeStatsInodesFreeDesc = metrics.NewDesc(
53+
metrics.BuildFQName("", kubeletmetrics.KubeletSubsystem, kubeletmetrics.VolumeStatsInodesFreeKey),
5154
"Number of free inodes in the volume",
5255
[]string{"namespace", "persistentvolumeclaim"}, nil,
56+
metrics.ALPHA, "",
5357
)
54-
volumeStatsInodesUsedDesc = prometheus.NewDesc(
55-
prometheus.BuildFQName("", metrics.KubeletSubsystem, metrics.VolumeStatsInodesUsedKey),
58+
volumeStatsInodesUsedDesc = metrics.NewDesc(
59+
metrics.BuildFQName("", kubeletmetrics.KubeletSubsystem, kubeletmetrics.VolumeStatsInodesUsedKey),
5660
"Number of used inodes in the volume",
5761
[]string{"namespace", "persistentvolumeclaim"}, nil,
62+
metrics.ALPHA, "",
5863
)
5964
)
6065

6166
type volumeStatsCollector struct {
67+
metrics.BaseStableCollector
68+
6269
statsProvider serverstats.Provider
6370
}
6471

65-
// NewVolumeStatsCollector creates a volume stats prometheus collector.
66-
func NewVolumeStatsCollector(statsProvider serverstats.Provider) prometheus.Collector {
72+
// Check if volumeStatsCollector implements necessary interface
73+
var _ metrics.StableCollector = &volumeStatsCollector{}
74+
75+
// NewVolumeStatsCollector creates a volume stats metrics.StableCollector.
76+
func NewVolumeStatsCollector(statsProvider serverstats.Provider) metrics.StableCollector {
6777
return &volumeStatsCollector{statsProvider: statsProvider}
6878
}
6979

70-
// Describe implements the prometheus.Collector interface.
71-
func (collector *volumeStatsCollector) Describe(ch chan<- *prometheus.Desc) {
80+
// DescribeWithStability implements the metrics.StableCollector interface.
81+
func (collector *volumeStatsCollector) DescribeWithStability(ch chan<- *metrics.Desc) {
7282
ch <- volumeStatsCapacityBytesDesc
7383
ch <- volumeStatsAvailableBytesDesc
7484
ch <- volumeStatsUsedBytesDesc
@@ -77,20 +87,16 @@ func (collector *volumeStatsCollector) Describe(ch chan<- *prometheus.Desc) {
7787
ch <- volumeStatsInodesUsedDesc
7888
}
7989

80-
// Collect implements the prometheus.Collector interface.
81-
func (collector *volumeStatsCollector) Collect(ch chan<- prometheus.Metric) {
90+
// CollectWithStability implements the metrics.StableCollector interface.
91+
func (collector *volumeStatsCollector) CollectWithStability(ch chan<- metrics.Metric) {
8292
podStats, err := collector.statsProvider.ListPodStats()
8393
if err != nil {
8494
return
8595
}
86-
addGauge := func(desc *prometheus.Desc, pvcRef *stats.PVCReference, v float64, lv ...string) {
96+
addGauge := func(desc *metrics.Desc, pvcRef *stats.PVCReference, v float64, lv ...string) {
8797
lv = append([]string{pvcRef.Namespace, pvcRef.Name}, lv...)
88-
metric, err := prometheus.NewConstMetric(desc, prometheus.GaugeValue, v, lv...)
89-
if err != nil {
90-
klog.Warningf("Failed to generate metric: %v", err)
91-
return
92-
}
93-
ch <- metric
98+
99+
ch <- metrics.NewLazyConstMetric(desc, metrics.GaugeValue, v, lv...)
94100
}
95101
allPVCs := sets.String{}
96102
for _, podStat := range podStats {

pkg/kubelet/metrics/collectors/volume_stats_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,17 @@ func TestVolumeStatsCollector(t *testing.T) {
3434
// Fixed metadata on type and help text. We prepend this to every expected
3535
// output so we only have to modify a single place when doing adjustments.
3636
const metadata = `
37-
# HELP kubelet_volume_stats_available_bytes Number of available bytes in the volume
37+
# HELP kubelet_volume_stats_available_bytes [ALPHA] Number of available bytes in the volume
3838
# TYPE kubelet_volume_stats_available_bytes gauge
39-
# HELP kubelet_volume_stats_capacity_bytes Capacity in bytes of the volume
39+
# HELP kubelet_volume_stats_capacity_bytes [ALPHA] Capacity in bytes of the volume
4040
# TYPE kubelet_volume_stats_capacity_bytes gauge
41-
# HELP kubelet_volume_stats_inodes Maximum number of inodes in the volume
41+
# HELP kubelet_volume_stats_inodes [ALPHA] Maximum number of inodes in the volume
4242
# TYPE kubelet_volume_stats_inodes gauge
43-
# HELP kubelet_volume_stats_inodes_free Number of free inodes in the volume
43+
# HELP kubelet_volume_stats_inodes_free [ALPHA] Number of free inodes in the volume
4444
# TYPE kubelet_volume_stats_inodes_free gauge
45-
# HELP kubelet_volume_stats_inodes_used Number of used inodes in the volume
45+
# HELP kubelet_volume_stats_inodes_used [ALPHA] Number of used inodes in the volume
4646
# TYPE kubelet_volume_stats_inodes_used gauge
47-
# HELP kubelet_volume_stats_used_bytes Number of used bytes in the volume
47+
# HELP kubelet_volume_stats_used_bytes [ALPHA] Number of used bytes in the volume
4848
# TYPE kubelet_volume_stats_used_bytes gauge
4949
`
5050

@@ -132,7 +132,7 @@ func TestVolumeStatsCollector(t *testing.T) {
132132
mockStatsProvider := new(statstest.StatsProvider)
133133
mockStatsProvider.On("ListPodStats").Return(podStats, nil)
134134
mockStatsProvider.On("ListPodStatsAndUpdateCPUNanoCoreUsage").Return(podStats, nil)
135-
if err := testutil.CollectAndCompare(&volumeStatsCollector{statsProvider: mockStatsProvider}, strings.NewReader(want), metrics...); err != nil {
135+
if err := testutil.CustomCollectAndCompare(&volumeStatsCollector{statsProvider: mockStatsProvider}, strings.NewReader(want), metrics...); err != nil {
136136
t.Errorf("unexpected collecting result:\n%s", err)
137137
}
138138
}

pkg/kubelet/metrics/metrics.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@ var (
499499
var registerMetrics sync.Once
500500

501501
// Register registers all metrics.
502-
func Register(containerCache kubecontainer.RuntimeCache, collectors ...metrics.Collector) {
502+
func Register(containerCache kubecontainer.RuntimeCache, collectors ...metrics.StableCollector) {
503503
// Register the metrics.
504504
registerMetrics.Do(func() {
505505
legacyregistry.MustRegister(NodeName)
@@ -540,7 +540,7 @@ func Register(containerCache kubecontainer.RuntimeCache, collectors ...metrics.C
540540
legacyregistry.MustRegister(ConfigError)
541541
}
542542
for _, collector := range collectors {
543-
legacyregistry.RawMustRegister(collector)
543+
legacyregistry.CustomMustRegister(collector)
544544
}
545545
})
546546
}

pkg/kubelet/pluginmanager/metrics/BUILD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ go_library(
77
visibility = ["//visibility:public"],
88
deps = [
99
"//pkg/kubelet/pluginmanager/cache:go_default_library",
10-
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
11-
"//vendor/k8s.io/klog:go_default_library",
10+
"//staging/src/k8s.io/component-base/metrics:go_default_library",
11+
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
1212
],
1313
)
1414

pkg/kubelet/pluginmanager/metrics/metrics.go

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ package metrics
1919
import (
2020
"sync"
2121

22-
"github.com/prometheus/client_golang/prometheus"
23-
"k8s.io/klog"
22+
"k8s.io/component-base/metrics"
23+
"k8s.io/component-base/metrics/legacyregistry"
2424
"k8s.io/kubernetes/pkg/kubelet/pluginmanager/cache"
2525
)
2626

@@ -32,11 +32,13 @@ const (
3232
var (
3333
registerMetrics sync.Once
3434

35-
totalPluginsDesc = prometheus.NewDesc(
35+
totalPluginsDesc = metrics.NewDesc(
3636
pluginManagerTotalPlugins,
3737
"Number of plugins in Plugin Manager",
3838
[]string{"socket_path", "state"},
3939
nil,
40+
metrics.ALPHA,
41+
"",
4042
)
4143
)
4244

@@ -55,35 +57,33 @@ func (pc pluginCount) add(state, pluginName string) {
5557
// Register registers Plugin Manager metrics.
5658
func Register(asw cache.ActualStateOfWorld, dsw cache.DesiredStateOfWorld) {
5759
registerMetrics.Do(func() {
58-
prometheus.MustRegister(&totalPluginsCollector{asw, dsw})
60+
legacyregistry.CustomMustRegister(&totalPluginsCollector{asw: asw, dsw: dsw})
5961
})
6062
}
6163

6264
type totalPluginsCollector struct {
65+
metrics.BaseStableCollector
66+
6367
asw cache.ActualStateOfWorld
6468
dsw cache.DesiredStateOfWorld
6569
}
6670

67-
var _ prometheus.Collector = &totalPluginsCollector{}
71+
var _ metrics.StableCollector = &totalPluginsCollector{}
6872

69-
// Describe implements the prometheus.Collector interface.
70-
func (c *totalPluginsCollector) Describe(ch chan<- *prometheus.Desc) {
73+
// DescribeWithStability implements the metrics.StableCollector interface.
74+
func (c *totalPluginsCollector) DescribeWithStability(ch chan<- *metrics.Desc) {
7175
ch <- totalPluginsDesc
7276
}
7377

74-
// Collect implements the prometheus.Collector interface.
75-
func (c *totalPluginsCollector) Collect(ch chan<- prometheus.Metric) {
78+
// CollectWithStability implements the metrics.StableCollector interface.
79+
func (c *totalPluginsCollector) CollectWithStability(ch chan<- metrics.Metric) {
7680
for stateName, pluginCount := range c.getPluginCount() {
7781
for socketPath, count := range pluginCount {
78-
metric, err := prometheus.NewConstMetric(totalPluginsDesc,
79-
prometheus.GaugeValue,
82+
ch <- metrics.NewLazyConstMetric(totalPluginsDesc,
83+
metrics.GaugeValue,
8084
float64(count),
8185
socketPath,
8286
stateName)
83-
if err != nil {
84-
klog.Warningf("Failed to create metric : %v", err)
85-
}
86-
ch <- metric
8787
}
8888
}
8989
}

pkg/kubelet/pluginmanager/metrics/metrics_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func TestMetricCollection(t *testing.T) {
4242
t.Fatalf("AddOrUpdatePlugin failed. Expected: <no error> Actual: <%v>", err)
4343
}
4444

45-
metricCollector := &totalPluginsCollector{asw, dsw}
45+
metricCollector := &totalPluginsCollector{asw: asw, dsw: dsw}
4646

4747
// Check if getPluginCount returns correct data
4848
count := metricCollector.getPluginCount()

pkg/kubelet/volumemanager/metrics/BUILD

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ go_library(
99
"//pkg/kubelet/volumemanager/cache:go_default_library",
1010
"//pkg/volume:go_default_library",
1111
"//pkg/volume/util:go_default_library",
12+
"//staging/src/k8s.io/component-base/metrics:go_default_library",
1213
"//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library",
13-
"//vendor/github.com/prometheus/client_golang/prometheus:go_default_library",
14-
"//vendor/k8s.io/klog:go_default_library",
1514
],
1615
)
1716

0 commit comments

Comments
 (0)