Skip to content

Commit 17c531d

Browse files
committed
feat: Add access mode metric for PersistentVolumes
Expose a kube_persistentvolume_access_mode metric that mirrors the existing PVC access mode metric. This allows consumers to filter and aggregate PersistentVolumes by access mode directly, without having to scrape kube_persistentvolumeclaim_access_mode. Using a small set of access-mode labels keeps cardinality low while still allowing PV metrics to be sliced by access mode. Signed-off-by: vvoeroes <virag.voeroes@inovex.de>
1 parent 3c25265 commit 17c531d

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

docs/metrics/storage/persistentvolume-metrics.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
| kube_persistentvolume_deletion_timestamp | Gauge | Unix deletion timestamp | seconds | `persistentvolume`=&lt;persistentvolume-name&gt; <br> | EXPERIMENTAL |
1313
| kube_persistentvolume_csi_attributes | Gauge | CSI attributes of the Persistent Volume, disabled by default, manage with [--metric-opt-in-list](../../developer/cli-arguments.md)) | | `persistentvolume`=&lt;persistentvolume-name&gt; <br> `csi_mounter`=&lt;csi-mounter&gt; <br> `csi_map_options`=&lt;csi-map-options&gt; | EXPERIMENTAL |
1414
| kube_persistentvolume_volume_mode | Gauge | Volume Mode information for the PersistentVolume. | | `persistentvolume`=&lt;persistentvolume-name&gt; <br>`volumemode`=&lt;volumemode&gt; | EXPERIMENTAL |
15+
| kube_persistentvolume_access_mode | Gauge | Access modes of the PersistentVolume. Only the four official access modes are emitted. | | `persistentvolume`=&lt;persistentvolume-name&gt; <br>`accessmode`=<ReadWriteOnce \| ReadOnlyMany \| ReadWriteMany \| ReadWriteOncePod> | STABLE |
1516

1617
## Useful metrics queries
1718

internal/store/persistentvolume.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func persistentVolumeMetricFamilies(allowAnnotationsList, allowLabelsList []stri
5959
createPersistentVolumeDeletionTimestamp(),
6060
createPersistentVolumeCSIAttributes(),
6161
createPersistentVolumeMode(),
62+
createPersistentVolumeAccessMode(),
6263
}
6364
}
6465

@@ -485,3 +486,27 @@ func createPersistentVolumeMode() generator.FamilyGenerator {
485486
}),
486487
)
487488
}
489+
490+
func createPersistentVolumeAccessMode() generator.FamilyGenerator {
491+
return *generator.NewFamilyGeneratorWithStability(
492+
"kube_persistentvolume_access_mode",
493+
"The access mode(s) specified by the persistent volume.",
494+
metric.Gauge,
495+
basemetrics.STABLE,
496+
"",
497+
wrapPersistentVolumeFunc(func(p *v1.PersistentVolume) *metric.Family {
498+
ms := make([]*metric.Metric, 0, len(p.Spec.AccessModes))
499+
for _, am := range p.Spec.AccessModes {
500+
ms = append(ms, &metric.Metric{
501+
LabelKeys: []string{"access_mode"},
502+
LabelValues: []string{string(am)},
503+
Value: 1,
504+
})
505+
}
506+
507+
return &metric.Family{
508+
Metrics: ms,
509+
}
510+
}),
511+
)
512+
}

internal/store/persistentvolume_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -780,6 +780,26 @@ func TestPersistentVolumeStore(t *testing.T) {
780780
`,
781781
MetricNames: []string{"kube_persistentvolume_volume_mode"},
782782
},
783+
{
784+
Obj: &v1.PersistentVolume{
785+
ObjectMeta: metav1.ObjectMeta{
786+
Name: "test-pv-access-modes",
787+
},
788+
Spec: v1.PersistentVolumeSpec{
789+
AccessModes: []v1.PersistentVolumeAccessMode{
790+
v1.ReadWriteOnce,
791+
v1.ReadOnlyMany,
792+
},
793+
},
794+
},
795+
Want: `
796+
# HELP kube_persistentvolume_access_mode [STABLE] The access mode(s) specified by the persistent volume.
797+
# TYPE kube_persistentvolume_access_mode gauge
798+
kube_persistentvolume_access_mode{persistentvolume="test-pv-access-modes",access_mode="ReadWriteOnce"} 1
799+
kube_persistentvolume_access_mode{persistentvolume="test-pv-access-modes",access_mode="ReadOnlyMany"} 1
800+
`,
801+
MetricNames: []string{"kube_persistentvolume_access_mode"},
802+
},
783803
}
784804
for i, c := range cases {
785805
c.Func = generator.ComposeMetricGenFuncs(persistentVolumeMetricFamilies(c.AllowAnnotationsList, c.AllowLabelsList))

0 commit comments

Comments
 (0)