Skip to content

Commit b6c5667

Browse files
committed
Add retention policy metrics for KEP-1847
1 parent 846222b commit b6c5667

File tree

3 files changed

+119
-8
lines changed

3 files changed

+119
-8
lines changed

docs/statefulset-metrics.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
| kube_statefulset_status_observed_generation | Gauge | `statefulset`=&lt;statefulset-name&gt; <br> `namespace`=&lt;statefulset-namespace&gt; | STABLE |
1212
| kube_statefulset_replicas | Gauge | `statefulset`=&lt;statefulset-name&gt; <br> `namespace`=&lt;statefulset-namespace&gt; | STABLE |
1313
| kube_statefulset_metadata_generation | Gauge | `statefulset`=&lt;statefulset-name&gt; <br> `namespace`=&lt;statefulset-namespace&gt; | STABLE |
14+
| kube_statefulset_persistentvolumeclaim_retention_policy | Gauge | `statefulset`=&lt;statefulset-name&gt; <br> `namespace`=&lt;statefulset-namespace&gt; <br> `when_deleted`=&lt;statefulset-when-deleted-pvc-policy&gt; <br> `when_scaled`=&lt;statefulset-when-scaled-pvc-policy&gt; | ALPHA |
1415
| kube_statefulset_created | Gauge | `statefulset`=&lt;statefulset-name&gt; <br> `namespace`=&lt;statefulset-namespace&gt; | STABLE |
1516
| kube_statefulset_labels | Gauge | `statefulset`=&lt;statefulset-name&gt; <br> `namespace`=&lt;statefulset-namespace&gt; <br> `label_STATEFULSET_LABEL`=&lt;STATEFULSET_LABEL&gt; | STABLE |
1617
| kube_statefulset_status_current_revision | Gauge | `statefulset`=&lt;statefulset-name&gt; <br> `namespace`=&lt;statefulset-namespace&gt; <br> `revision`=&lt;statefulset-current-revision&gt; | STABLE |

internal/store/statefulset.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,32 @@ func statefulSetMetricFamilies(allowAnnotationsList, allowLabelsList []string) [
193193
}
194194
}),
195195
),
196+
*generator.NewFamilyGeneratorWithStability(
197+
"kube_statefulset_persistentvolumeclaim_retention_policy",
198+
"Count of retention policy for StatefulSet template PVCs",
199+
metric.Gauge,
200+
basemetrics.ALPHA,
201+
"",
202+
wrapStatefulSetFunc(func(s *v1.StatefulSet) *metric.Family {
203+
deletedPolicyLabel := ""
204+
scaledPolicyLabel := ""
205+
if policy := s.Spec.PersistentVolumeClaimRetentionPolicy; policy != nil {
206+
deletedPolicyLabel = string(policy.WhenDeleted)
207+
scaledPolicyLabel = string(policy.WhenScaled)
208+
}
209+
ms := []*metric.Metric{}
210+
if deletedPolicyLabel != "" || scaledPolicyLabel != "" {
211+
ms = append(ms, &metric.Metric{
212+
LabelKeys: []string{"when_deleted", "when_scaled"},
213+
LabelValues: []string{deletedPolicyLabel, scaledPolicyLabel},
214+
Value: 1,
215+
})
216+
}
217+
return &metric.Family{
218+
Metrics: ms,
219+
}
220+
}),
221+
),
196222
*generator.NewFamilyGenerator(
197223
descStatefulSetAnnotationsName,
198224
descStatefulSetAnnotationsHelp,
@@ -268,6 +294,7 @@ func statefulSetMetricFamilies(allowAnnotationsList, allowLabelsList []string) [
268294
),
269295
}
270296
}
297+
271298
func wrapStatefulSetFunc(f func(*v1.StatefulSet) *metric.Family) func(interface{}) *metric.Family {
272299
return func(obj interface{}) *metric.Family {
273300
statefulSet := obj.(*v1.StatefulSet)

internal/store/statefulset_test.go

Lines changed: 91 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func TestStatefulSetStore(t *testing.T) {
6363
# HELP kube_statefulset_created [STABLE] Unix creation timestamp
6464
# HELP kube_statefulset_labels [STABLE] Kubernetes labels converted to Prometheus labels.
6565
# HELP kube_statefulset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state for the StatefulSet.
66+
# HELP kube_statefulset_persistentvolumeclaim_retention_policy Count of retention policy for StatefulSet template PVCs
6667
# HELP kube_statefulset_replicas [STABLE] Number of desired pods for a StatefulSet.
6768
# HELP kube_statefulset_status_current_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).
6869
# HELP kube_statefulset_status_observed_generation [STABLE] The generation observed by the StatefulSet controller.
@@ -75,6 +76,7 @@ func TestStatefulSetStore(t *testing.T) {
7576
# TYPE kube_statefulset_created gauge
7677
# TYPE kube_statefulset_labels gauge
7778
# TYPE kube_statefulset_metadata_generation gauge
79+
# TYPE kube_statefulset_persistentvolumeclaim_retention_policy gauge
7880
# TYPE kube_statefulset_replicas gauge
7981
# TYPE kube_statefulset_status_current_revision gauge
8082
# TYPE kube_statefulset_status_observed_generation gauge
@@ -110,6 +112,7 @@ func TestStatefulSetStore(t *testing.T) {
110112
"kube_statefulset_status_replicas_updated",
111113
"kube_statefulset_status_update_revision",
112114
"kube_statefulset_status_current_revision",
115+
"kube_statefulset_persistentvolumeclaim_retention_policy",
113116
},
114117
},
115118
{
@@ -140,6 +143,7 @@ func TestStatefulSetStore(t *testing.T) {
140143
Want: `
141144
# HELP kube_statefulset_labels [STABLE] Kubernetes labels converted to Prometheus labels.
142145
# HELP kube_statefulset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state for the StatefulSet.
146+
# HELP kube_statefulset_persistentvolumeclaim_retention_policy Count of retention policy for StatefulSet template PVCs
143147
# HELP kube_statefulset_replicas [STABLE] Number of desired pods for a StatefulSet.
144148
# HELP kube_statefulset_status_current_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).
145149
# HELP kube_statefulset_status_observed_generation [STABLE] The generation observed by the StatefulSet controller.
@@ -151,6 +155,7 @@ func TestStatefulSetStore(t *testing.T) {
151155
# HELP kube_statefulset_status_update_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)
152156
# TYPE kube_statefulset_labels gauge
153157
# TYPE kube_statefulset_metadata_generation gauge
158+
# TYPE kube_statefulset_persistentvolumeclaim_retention_policy gauge
154159
# TYPE kube_statefulset_replicas gauge
155160
# TYPE kube_statefulset_status_current_revision gauge
156161
# TYPE kube_statefulset_status_observed_generation gauge
@@ -161,14 +166,14 @@ func TestStatefulSetStore(t *testing.T) {
161166
# TYPE kube_statefulset_status_replicas_updated gauge
162167
# TYPE kube_statefulset_status_update_revision gauge
163168
kube_statefulset_status_update_revision{namespace="ns2",revision="ur2",statefulset="statefulset2"} 1
164-
kube_statefulset_status_replicas{namespace="ns2",statefulset="statefulset2"} 5
169+
kube_statefulset_status_replicas{namespace="ns2",statefulset="statefulset2"} 5
165170
kube_statefulset_status_replicas_available{namespace="ns2",statefulset="statefulset2"} 4
166171
kube_statefulset_status_replicas_current{namespace="ns2",statefulset="statefulset2"} 2
167172
kube_statefulset_status_replicas_ready{namespace="ns2",statefulset="statefulset2"} 5
168173
kube_statefulset_status_replicas_updated{namespace="ns2",statefulset="statefulset2"} 3
169-
kube_statefulset_status_observed_generation{namespace="ns2",statefulset="statefulset2"} 2
170-
kube_statefulset_replicas{namespace="ns2",statefulset="statefulset2"} 6
171-
kube_statefulset_metadata_generation{namespace="ns2",statefulset="statefulset2"} 21
174+
kube_statefulset_status_observed_generation{namespace="ns2",statefulset="statefulset2"} 2
175+
kube_statefulset_replicas{namespace="ns2",statefulset="statefulset2"} 6
176+
kube_statefulset_metadata_generation{namespace="ns2",statefulset="statefulset2"} 21
172177
kube_statefulset_labels{namespace="ns2",statefulset="statefulset2"} 1
173178
kube_statefulset_status_current_revision{namespace="ns2",revision="cr2",statefulset="statefulset2"} 1
174179
`,
@@ -184,6 +189,7 @@ func TestStatefulSetStore(t *testing.T) {
184189
"kube_statefulset_status_replicas_updated",
185190
"kube_statefulset_status_update_revision",
186191
"kube_statefulset_status_current_revision",
192+
"kube_statefulset_persistentvolumeclaim_retention_policy",
187193
},
188194
},
189195
{
@@ -210,6 +216,7 @@ func TestStatefulSetStore(t *testing.T) {
210216
Want: `
211217
# HELP kube_statefulset_labels [STABLE] Kubernetes labels converted to Prometheus labels.
212218
# HELP kube_statefulset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state for the StatefulSet.
219+
# HELP kube_statefulset_persistentvolumeclaim_retention_policy Count of retention policy for StatefulSet template PVCs
213220
# HELP kube_statefulset_replicas [STABLE] Number of desired pods for a StatefulSet.
214221
# HELP kube_statefulset_status_current_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).
215222
# HELP kube_statefulset_status_replicas [STABLE] The number of replicas per StatefulSet.
@@ -220,6 +227,7 @@ func TestStatefulSetStore(t *testing.T) {
220227
# HELP kube_statefulset_status_update_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)
221228
# TYPE kube_statefulset_labels gauge
222229
# TYPE kube_statefulset_metadata_generation gauge
230+
# TYPE kube_statefulset_persistentvolumeclaim_retention_policy gauge
223231
# TYPE kube_statefulset_replicas gauge
224232
# TYPE kube_statefulset_status_current_revision gauge
225233
# TYPE kube_statefulset_status_replicas gauge
@@ -229,13 +237,13 @@ func TestStatefulSetStore(t *testing.T) {
229237
# TYPE kube_statefulset_status_replicas_updated gauge
230238
# TYPE kube_statefulset_status_update_revision gauge
231239
kube_statefulset_status_update_revision{namespace="ns3",revision="ur3",statefulset="statefulset3"} 1
232-
kube_statefulset_status_replicas{namespace="ns3",statefulset="statefulset3"} 7
240+
kube_statefulset_status_replicas{namespace="ns3",statefulset="statefulset3"} 7
233241
kube_statefulset_status_replicas_available{namespace="ns3",statefulset="statefulset3"} 0
234242
kube_statefulset_status_replicas_current{namespace="ns3",statefulset="statefulset3"} 0
235243
kube_statefulset_status_replicas_ready{namespace="ns3",statefulset="statefulset3"} 0
236244
kube_statefulset_status_replicas_updated{namespace="ns3",statefulset="statefulset3"} 0
237-
kube_statefulset_replicas{namespace="ns3",statefulset="statefulset3"} 9
238-
kube_statefulset_metadata_generation{namespace="ns3",statefulset="statefulset3"} 36
245+
kube_statefulset_replicas{namespace="ns3",statefulset="statefulset3"} 9
246+
kube_statefulset_metadata_generation{namespace="ns3",statefulset="statefulset3"} 36
239247
kube_statefulset_labels{namespace="ns3",statefulset="statefulset3"} 1
240248
kube_statefulset_status_current_revision{namespace="ns3",revision="cr3",statefulset="statefulset3"} 1
241249
`,
@@ -250,14 +258,89 @@ func TestStatefulSetStore(t *testing.T) {
250258
"kube_statefulset_status_replicas_updated",
251259
"kube_statefulset_status_update_revision",
252260
"kube_statefulset_status_current_revision",
261+
"kube_statefulset_persistentvolumeclaim_retention_policy",
262+
},
263+
},
264+
{
265+
Obj: &v1.StatefulSet{
266+
ObjectMeta: metav1.ObjectMeta{
267+
Name: "statefulset4",
268+
Namespace: "ns4",
269+
Labels: map[string]string{
270+
"app": "example4",
271+
},
272+
Generation: 1,
273+
},
274+
Spec: v1.StatefulSetSpec{
275+
Replicas: &statefulSet1Replicas,
276+
ServiceName: "statefulset4service",
277+
PersistentVolumeClaimRetentionPolicy: &v1.StatefulSetPersistentVolumeClaimRetentionPolicy{
278+
WhenDeleted: v1.RetainPersistentVolumeClaimRetentionPolicyType,
279+
WhenScaled: v1.DeletePersistentVolumeClaimRetentionPolicyType,
280+
},
281+
},
282+
Status: v1.StatefulSetStatus{
283+
ObservedGeneration: 0,
284+
Replicas: 7,
285+
UpdateRevision: "ur3",
286+
CurrentRevision: "cr3",
287+
},
288+
},
289+
Want: `
290+
# HELP kube_statefulset_labels [STABLE] Kubernetes labels converted to Prometheus labels.
291+
# HELP kube_statefulset_metadata_generation [STABLE] Sequence number representing a specific generation of the desired state for the StatefulSet.
292+
# HELP kube_statefulset_persistentvolumeclaim_retention_policy Count of retention policy for StatefulSet template PVCs
293+
# HELP kube_statefulset_replicas [STABLE] Number of desired pods for a StatefulSet.
294+
# HELP kube_statefulset_status_current_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [0,currentReplicas).
295+
# HELP kube_statefulset_status_replicas [STABLE] The number of replicas per StatefulSet.
296+
# HELP kube_statefulset_status_replicas_available The number of available replicas per StatefulSet.
297+
# HELP kube_statefulset_status_replicas_current [STABLE] The number of current replicas per StatefulSet.
298+
# HELP kube_statefulset_status_replicas_ready [STABLE] The number of ready replicas per StatefulSet.
299+
# HELP kube_statefulset_status_replicas_updated [STABLE] The number of updated replicas per StatefulSet.
300+
# HELP kube_statefulset_status_update_revision [STABLE] Indicates the version of the StatefulSet used to generate Pods in the sequence [replicas-updatedReplicas,replicas)
301+
# TYPE kube_statefulset_labels gauge
302+
# TYPE kube_statefulset_metadata_generation gauge
303+
# TYPE kube_statefulset_persistentvolumeclaim_retention_policy gauge
304+
# TYPE kube_statefulset_replicas gauge
305+
# TYPE kube_statefulset_status_current_revision gauge
306+
# TYPE kube_statefulset_status_replicas gauge
307+
# TYPE kube_statefulset_status_replicas_available gauge
308+
# TYPE kube_statefulset_status_replicas_current gauge
309+
# TYPE kube_statefulset_status_replicas_ready gauge
310+
# TYPE kube_statefulset_status_replicas_updated gauge
311+
# TYPE kube_statefulset_status_update_revision gauge
312+
kube_statefulset_status_update_revision{namespace="ns4",revision="ur3",statefulset="statefulset4"} 1
313+
kube_statefulset_status_replicas{namespace="ns4",statefulset="statefulset4"} 7
314+
kube_statefulset_status_replicas_available{namespace="ns4",statefulset="statefulset4"} 0
315+
kube_statefulset_status_replicas_current{namespace="ns4",statefulset="statefulset4"} 0
316+
kube_statefulset_status_replicas_ready{namespace="ns4",statefulset="statefulset4"} 0
317+
kube_statefulset_status_replicas_updated{namespace="ns4",statefulset="statefulset4"} 0
318+
kube_statefulset_replicas{namespace="ns4",statefulset="statefulset4"} 3
319+
kube_statefulset_metadata_generation{namespace="ns4",statefulset="statefulset4"} 1
320+
kube_statefulset_persistentvolumeclaim_retention_policy{namespace="ns4",statefulset="statefulset4",when_deleted="Retain",when_scaled="Delete"} 1
321+
kube_statefulset_labels{namespace="ns4",statefulset="statefulset4"} 1
322+
kube_statefulset_status_current_revision{namespace="ns4",revision="cr3",statefulset="statefulset4"} 1
323+
`,
324+
MetricNames: []string{
325+
"kube_statefulset_labels",
326+
"kube_statefulset_metadata_generation",
327+
"kube_statefulset_replicas",
328+
"kube_statefulset_status_replicas",
329+
"kube_statefulset_status_replicas_available",
330+
"kube_statefulset_status_replicas_current",
331+
"kube_statefulset_status_replicas_ready",
332+
"kube_statefulset_status_replicas_updated",
333+
"kube_statefulset_status_update_revision",
334+
"kube_statefulset_status_current_revision",
335+
"kube_statefulset_persistentvolumeclaim_retention_policy",
253336
},
254337
},
255338
}
256339
for i, c := range cases {
257340
c.Func = generator.ComposeMetricGenFuncs(statefulSetMetricFamilies(nil, nil))
258341
c.Headers = generator.ExtractMetricFamilyHeaders(statefulSetMetricFamilies(nil, nil))
259342
if err := c.run(); err != nil {
260-
t.Errorf("unexpected collecting result in %vth run:\n%s", i, err)
343+
t.Errorf("unexpected collecting result for statefulset%d run:\n%s", i+1, err)
261344
}
262345
}
263346
}

0 commit comments

Comments
 (0)