Skip to content

Commit d20e223

Browse files
committed
Stop create hidden metrics for custom metrics
1 parent 70b245e commit d20e223

File tree

4 files changed

+28
-46
lines changed

4 files changed

+28
-46
lines changed

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

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package metrics
1818

1919
import (
2020
"fmt"
21-
"strings"
2221

2322
"github.com/blang/semver"
2423
"github.com/prometheus/client_golang/prometheus"
@@ -46,7 +45,6 @@ type StableCollector interface {
4645
type BaseStableCollector struct {
4746
descriptors []*Desc // stores all Desc collected from DescribeWithStability().
4847
registrable []*Desc // stores registrable Desc(not be hidden), is a subset of descriptors.
49-
hidden []*Desc // stores hidden Desc
5048
self StableCollector
5149
}
5250

@@ -59,7 +57,7 @@ func (bsc *BaseStableCollector) DescribeWithStability(ch chan<- *Desc) {
5957
// Describe sends all descriptors to the provided channel.
6058
// It intend to be called by prometheus registry.
6159
func (bsc *BaseStableCollector) Describe(ch chan<- *prometheus.Desc) {
62-
for _, d := range bsc.descriptors {
60+
for _, d := range bsc.registrable {
6361
ch <- d.toPrometheusDesc()
6462
}
6563
}
@@ -80,10 +78,8 @@ func (bsc *BaseStableCollector) Collect(ch chan<- prometheus.Metric) {
8078
}()
8179

8280
for m := range mch {
83-
// Hidden metrics should be ignored.
84-
// TODO(RainbowMango): There is no convenient method to identify if the metrics should be ignored.
85-
// Use a temporary solution here. (try to search in hidden list)
86-
if strings.Contains(m.Desc().String(), hiddenFlag) {
81+
// nil Metric usually means hidden metrics
82+
if m == nil {
8783
continue
8884
}
8985

@@ -127,16 +123,16 @@ func (bsc *BaseStableCollector) Create(version *semver.Version, self StableColle
127123
d.createLock.Lock()
128124
defer d.createLock.Unlock()
129125

130-
d.isCreated = true
131-
if d.IsHidden() { // hidden metrics also needs initialize because user may send them in CollectWithStability method.
132-
d.initializeHiddenDesc()
133-
bsc.hidden = append(bsc.hidden, d)
126+
if d.IsHidden() {
127+
// do nothing for hidden metrics
134128
} else if d.IsDeprecated() {
135129
d.initializeDeprecatedDesc()
136130
bsc.registrable = append(bsc.registrable, d)
131+
d.isCreated = true
137132
} else {
138133
d.initialize()
139134
bsc.registrable = append(bsc.registrable, d)
135+
d.isCreated = true
140136
}
141137
})
142138
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,25 +52,25 @@ func (tc *testCustomCollector) DescribeWithStability(ch chan<- *Desc) {
5252
}
5353

5454
func (tc *testCustomCollector) CollectWithStability(ch chan<- Metric) {
55-
ch <- MustNewConstMetric(
55+
ch <- NewLazyConstMetric(
5656
alphaDesc,
5757
GaugeValue,
5858
1,
5959
"value",
6060
)
61-
ch <- MustNewConstMetric(
61+
ch <- NewLazyConstMetric(
6262
stableDesc,
6363
GaugeValue,
6464
1,
6565
"value",
6666
)
67-
ch <- MustNewConstMetric(
67+
ch <- NewLazyConstMetric(
6868
deprecatedDesc,
6969
GaugeValue,
7070
1,
7171
"value",
7272
)
73-
ch <- MustNewConstMetric(
73+
ch <- NewLazyConstMetric(
7474
hiddenDesc,
7575
GaugeValue,
7676
1,

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

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import (
2626
"k8s.io/klog"
2727
)
2828

29-
var hiddenFlag = "metricsshouldbehidden"
30-
3129
// Desc is a prometheus.Desc extension.
3230
//
3331
// Use NewDesc to create new Desc instances.
@@ -72,20 +70,14 @@ type Desc struct {
7270
func NewDesc(fqName string, help string, variableLabels []string, constLabels Labels,
7371
stabilityLevel StabilityLevel, deprecatedVersion string) *Desc {
7472
d := &Desc{
75-
fqName: fqName,
76-
help: help,
77-
variableLabels: variableLabels,
78-
constLabels: constLabels,
79-
}
80-
81-
// TODO(RainbowMango): replace by stabilityLevel.setDefault() after PR(https://github.com/kubernetes/kubernetes/pull/82957) be merged.
82-
if stabilityLevel == "" {
83-
d.stabilityLevel = ALPHA
84-
} else {
85-
d.stabilityLevel = stabilityLevel
73+
fqName: fqName,
74+
help: help,
75+
variableLabels: variableLabels,
76+
constLabels: constLabels,
77+
stabilityLevel: stabilityLevel,
78+
deprecatedVersion: deprecatedVersion,
8679
}
87-
88-
d.deprecatedVersion = deprecatedVersion
80+
d.stabilityLevel.setDefaults()
8981

9082
return d
9183
}
@@ -148,14 +140,6 @@ func (d *Desc) markDeprecated() {
148140
})
149141
}
150142

151-
// markHidden mark a special flag to 'HELP'.
152-
// The metrics marked with this flag will be ignored when collecting automatically.
153-
func (d *Desc) markHidden() {
154-
d.hideOnce.Do(func() {
155-
d.help = fmt.Sprintf("(%s) %s", hiddenFlag, d.help)
156-
})
157-
}
158-
159143
func (d *Desc) annotateStabilityLevel() {
160144
d.annotateOnce.Do(func() {
161145
d.help = fmt.Sprintf("[%v] %v", d.stabilityLevel, d.help)
@@ -172,8 +156,3 @@ func (d *Desc) initializeDeprecatedDesc() {
172156
d.markDeprecated()
173157
d.initialize()
174158
}
175-
176-
func (d *Desc) initializeHiddenDesc() {
177-
d.markHidden()
178-
d.initializeDeprecatedDesc()
179-
}

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ limitations under the License.
1616

1717
package metrics
1818

19-
import "github.com/prometheus/client_golang/prometheus"
19+
import (
20+
"github.com/prometheus/client_golang/prometheus"
21+
)
2022

2123
// ValueType is an enumeration of metric types that represent a simple value.
2224
type ValueType int
@@ -33,7 +35,12 @@ func (vt *ValueType) toPromValueType() prometheus.ValueType {
3335
return prometheus.ValueType(*vt)
3436
}
3537

36-
// MustNewConstMetric is a wrapper of prometheus.MustNewConstMetric
37-
func MustNewConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric {
38+
// NewLazyConstMetric is a helper of MustNewConstMetric.
39+
//
40+
// Note: If the metrics described by the desc is hidden, the metrics will not be created.
41+
func NewLazyConstMetric(desc *Desc, valueType ValueType, value float64, labelValues ...string) Metric {
42+
if desc.IsHidden() {
43+
return nil
44+
}
3845
return prometheus.MustNewConstMetric(desc.toPrometheusDesc(), valueType.toPromValueType(), value, labelValues...)
3946
}

0 commit comments

Comments
 (0)