Skip to content

Commit 7324e70

Browse files
authored
Merge pull request #2175 from opeco17/feature/allow-annotations-and-labels-for-resource-quota
feat: enable metric-annotations-allowlist and metric-labels-allowlist for ResourceQuota
2 parents 6b1daa7 + 634c04e commit 7324e70

File tree

4 files changed

+89
-5
lines changed

4 files changed

+89
-5
lines changed

docs/resourcequota-metrics.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@
44
| ---------- | ----------- | ----------- | ----------- |
55
| kube_resourcequota | Gauge | `resourcequota`=&lt;quota-name&gt; <br> `namespace`=&lt;namespace&gt; <br> `resource`=&lt;ResourceName&gt; <br> `type`=&lt;quota-type&gt; | STABLE |
66
| kube_resourcequota_created | Gauge | `resourcequota`=&lt;quota-name&gt; <br> `namespace`=&lt;namespace&gt; | STABLE |
7+
| kube_resourcequota_annotations | Gauge | `resourcequota`=&lt;quota-name&gt; <br> `namespace`=&lt;namespace&gt; <br> `annotation_RESOURCE_QUOTA_ANNOTATION`=&lt;RESOURCE_QUOTA_ANNOTATION&gt; | EXPERIMENTAL |
8+
| kube_resourcequota_labels | Gauge | `resourcequota`=&lt;quota-name&gt; <br> `namespace`=&lt;namespace&gt; <br> `label_RESOURCE_QUOTA_LABEL`=&lt;RESOURCE_QUOTA_LABEL&gt; | EXPERIMENTAL |

internal/store/builder.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ func (b *Builder) buildReplicationControllerStores() []cache.Store {
431431
}
432432

433433
func (b *Builder) buildResourceQuotaStores() []cache.Store {
434-
return b.buildStoresFunc(resourceQuotaMetricFamilies, &v1.ResourceQuota{}, createResourceQuotaListWatch, b.useAPIServerCache)
434+
return b.buildStoresFunc(resourceQuotaMetricFamilies(b.allowAnnotationsList["resourcequotas"], b.allowLabelsList["resourcequotas"]), &v1.ResourceQuota{}, createResourceQuotaListWatch, b.useAPIServerCache)
435435
}
436436

437437
func (b *Builder) buildSecretStores() []cache.Store {

internal/store/resourcequota.go

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,15 @@ import (
3232
)
3333

3434
var (
35+
descResourceQuotaAnnotationsName = "kube_resourcequota_annotations"
36+
descResourceQuotaAnnotationsHelp = "Kubernetes annotations converted to Prometheus labels."
37+
descResourceQuotaLabelsName = "kube_resourcequota_labels"
38+
descResourceQuotaLabelsHelp = "Kubernetes labels converted to Prometheus labels."
3539
descResourceQuotaLabelsDefaultLabels = []string{"namespace", "resourcequota"}
40+
)
3641

37-
resourceQuotaMetricFamilies = []generator.FamilyGenerator{
42+
func resourceQuotaMetricFamilies(allowAnnotationsList, allowLabelsList []string) []generator.FamilyGenerator {
43+
return []generator.FamilyGenerator{
3844
*generator.NewFamilyGeneratorWithStability(
3945
"kube_resourcequota_created",
4046
"Unix creation timestamp",
@@ -87,8 +93,52 @@ var (
8793
}
8894
}),
8995
),
96+
*generator.NewFamilyGeneratorWithStability(
97+
descResourceQuotaAnnotationsName,
98+
descResourceQuotaAnnotationsHelp,
99+
metric.Gauge,
100+
basemetrics.ALPHA,
101+
"",
102+
wrapResourceQuotaFunc(func(d *v1.ResourceQuota) *metric.Family {
103+
if len(allowAnnotationsList) == 0 {
104+
return &metric.Family{}
105+
}
106+
annotationKeys, annotationValues := createPrometheusLabelKeysValues("annotation", d.Annotations, allowAnnotationsList)
107+
return &metric.Family{
108+
Metrics: []*metric.Metric{
109+
{
110+
LabelKeys: annotationKeys,
111+
LabelValues: annotationValues,
112+
Value: 1,
113+
},
114+
},
115+
}
116+
}),
117+
),
118+
*generator.NewFamilyGeneratorWithStability(
119+
descResourceQuotaLabelsName,
120+
descResourceQuotaLabelsHelp,
121+
metric.Gauge,
122+
basemetrics.STABLE,
123+
"",
124+
wrapResourceQuotaFunc(func(d *v1.ResourceQuota) *metric.Family {
125+
if len(allowLabelsList) == 0 {
126+
return &metric.Family{}
127+
}
128+
labelKeys, labelValues := createPrometheusLabelKeysValues("label", d.Labels, allowLabelsList)
129+
return &metric.Family{
130+
Metrics: []*metric.Metric{
131+
{
132+
LabelKeys: labelKeys,
133+
LabelValues: labelValues,
134+
Value: 1,
135+
},
136+
},
137+
}
138+
}),
139+
),
90140
}
91-
)
141+
}
92142

93143
func wrapResourceQuotaFunc(f func(*v1.ResourceQuota) *metric.Family) func(interface{}) *metric.Family {
94144
return func(obj interface{}) *metric.Family {

internal/store/resourcequota_test.go

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,13 @@ func TestResourceQuotaStore(t *testing.T) {
3232
// output so we only have to modify a single place when doing adjustments.
3333
const metadata = `
3434
# HELP kube_resourcequota [STABLE] Information about resource quota.
35+
# HELP kube_resourcequota_annotations Kubernetes annotations converted to Prometheus labels.
3536
# TYPE kube_resourcequota gauge
3637
# HELP kube_resourcequota_created [STABLE] Unix creation timestamp
38+
# HELP kube_resourcequota_labels [STABLE] Kubernetes labels converted to Prometheus labels.
39+
# TYPE kube_resourcequota_annotations gauge
3740
# TYPE kube_resourcequota_created gauge
41+
# TYPE kube_resourcequota_labels gauge
3842
`
3943
cases := []generateMetricsTestCase{
4044
// Verify populating base metric and that metric for unset fields are skipped.
@@ -132,10 +136,38 @@ func TestResourceQuotaStore(t *testing.T) {
132136
kube_resourcequota{namespace="testNS",resource="storage",resourcequota="quotaTest",type="used"} 9e+09
133137
`,
134138
},
139+
// Verify kube_resourcequota_annotations and kube_resourcequota_labels are shown.
140+
{
141+
AllowAnnotationsList: []string{
142+
"foo",
143+
},
144+
AllowLabelsList: []string{
145+
"hello",
146+
},
147+
Obj: &v1.ResourceQuota{
148+
ObjectMeta: metav1.ObjectMeta{
149+
Name: "quotaTest",
150+
CreationTimestamp: metav1.Time{Time: time.Unix(1500000000, 0)},
151+
Namespace: "testNS",
152+
Annotations: map[string]string{
153+
"foo": "bar",
154+
},
155+
Labels: map[string]string{
156+
"hello": "world",
157+
},
158+
},
159+
Status: v1.ResourceQuotaStatus{},
160+
},
161+
Want: metadata + `
162+
kube_resourcequota_annotations{annotation_foo="bar",namespace="testNS",resourcequota="quotaTest"} 1
163+
kube_resourcequota_created{namespace="testNS",resourcequota="quotaTest"} 1.5e+09
164+
kube_resourcequota_labels{label_hello="world",namespace="testNS",resourcequota="quotaTest"} 1
165+
`,
166+
},
135167
}
136168
for i, c := range cases {
137-
c.Func = generator.ComposeMetricGenFuncs(resourceQuotaMetricFamilies)
138-
c.Headers = generator.ExtractMetricFamilyHeaders(resourceQuotaMetricFamilies)
169+
c.Func = generator.ComposeMetricGenFuncs(resourceQuotaMetricFamilies(c.AllowAnnotationsList, c.AllowLabelsList))
170+
c.Headers = generator.ExtractMetricFamilyHeaders(resourceQuotaMetricFamilies(c.AllowAnnotationsList, c.AllowLabelsList))
139171
if err := c.run(); err != nil {
140172
t.Errorf("unexpected collecting result in %vth run:\n%s", i, err)
141173
}

0 commit comments

Comments
 (0)