From a78b0e7a06c6ab77e28e882fd0b057f4ae858c6b Mon Sep 17 00:00:00 2001 From: Povilas Versockas Date: Fri, 22 May 2020 15:36:52 +0300 Subject: [PATCH] add aws/gce volume id to kube_persistentvolume_info --- CHANGELOG.md | 4 +++ docs/persistentvolume-metrics.md | 2 +- internal/store/persistentvolume.go | 22 ++++++++++-- internal/store/persistentvolume_test.go | 48 ++++++++++++++++++++++++- 4 files changed, 71 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0e4d909..b1564172 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## MASTER + +* [FEATURE] Add ebs_volume_id and gce_persistent_disk_name to kube_persistentvolume_info metric. #1146 + ## v1.9.5 / 2020-02-20 * [BUGFIX] Switch to using only v1 client of validatingwebhookconfiguration #1052 diff --git a/docs/persistentvolume-metrics.md b/docs/persistentvolume-metrics.md index 28a9e7ae..0f40ff5c 100644 --- a/docs/persistentvolume-metrics.md +++ b/docs/persistentvolume-metrics.md @@ -5,5 +5,5 @@ | kube_persistentvolume_capacity_bytes | Gauge | `persistentvolume`=<pv-name> | STABLE | | kube_persistentvolume_status_phase | Gauge | `persistentvolume`=<pv-name>
`phase`=<Bound\|Failed\|Pending\|Available\|Released>| STABLE | | kube_persistentvolume_labels | Gauge | `persistentvolume`=<persistentvolume-name>
`label_PERSISTENTVOLUME_LABEL`=<PERSISTENTVOLUME_LABEL> | STABLE | -| kube_persistentvolume_info | Gauge | `persistentvolume`=<pv-name>
`storageclass`=<storageclass-name> | STABLE | +| kube_persistentvolume_info | Gauge | `persistentvolume`=<pv-name>
`storageclass`=<storageclass-name>
`gce_persistent_disk_name`=<pd-name>
`ebs_volume_id`=<ebs-volume-id> | STABLE | diff --git a/internal/store/persistentvolume.go b/internal/store/persistentvolume.go index c6d716da..a7b4fe31 100644 --- a/internal/store/persistentvolume.go +++ b/internal/store/persistentvolume.go @@ -102,12 +102,28 @@ var ( Type: metric.Gauge, Help: "Information about persistentvolume.", GenerateFunc: wrapPersistentVolumeFunc(func(p *v1.PersistentVolume) *metric.Family { + var gcePDDiskName, ebsVolumeID string + switch { + case p.Spec.PersistentVolumeSource.GCEPersistentDisk != nil: + gcePDDiskName = p.Spec.PersistentVolumeSource.GCEPersistentDisk.PDName + case p.Spec.PersistentVolumeSource.AWSElasticBlockStore != nil: + ebsVolumeID = p.Spec.PersistentVolumeSource.AWSElasticBlockStore.VolumeID + } + return &metric.Family{ Metrics: []*metric.Metric{ { - LabelKeys: []string{"storageclass"}, - LabelValues: []string{p.Spec.StorageClassName}, - Value: 1, + LabelKeys: []string{ + "storageclass", + "gce_persistent_disk_name", + "ebs_volume_id", + }, + LabelValues: []string{ + p.Spec.StorageClassName, + gcePDDiskName, + ebsVolumeID, + }, + Value: 1, }, }, } diff --git a/internal/store/persistentvolume_test.go b/internal/store/persistentvolume_test.go index 895f8604..e7cb5622 100644 --- a/internal/store/persistentvolume_test.go +++ b/internal/store/persistentvolume_test.go @@ -169,7 +169,53 @@ func TestPersistentVolumeStore(t *testing.T) { Want: ` # HELP kube_persistentvolume_info Information about persistentvolume. # TYPE kube_persistentvolume_info gauge - kube_persistentvolume_info{persistentvolume="test-pv-available",storageclass=""} 1 + kube_persistentvolume_info{ebs_volume_id="",gce_persistent_disk_name="",persistentvolume="test-pv-available",storageclass=""} 1 + `, + MetricNames: []string{"kube_persistentvolume_info"}, + }, + { + Obj: &v1.PersistentVolume{ + Spec: v1.PersistentVolumeSpec{ + PersistentVolumeSource: v1.PersistentVolumeSource{ + GCEPersistentDisk: &v1.GCEPersistentDiskVolumeSource{ + PDName: "name", + }, + }, + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pv-available", + }, + Status: v1.PersistentVolumeStatus{ + Phase: v1.VolumeAvailable, + }, + }, + Want: ` + # HELP kube_persistentvolume_info Information about persistentvolume. + # TYPE kube_persistentvolume_info gauge + kube_persistentvolume_info{ebs_volume_id="",gce_persistent_disk_name="name",persistentvolume="test-pv-available",storageclass=""} 1 + `, + MetricNames: []string{"kube_persistentvolume_info"}, + }, + { + Obj: &v1.PersistentVolume{ + Spec: v1.PersistentVolumeSpec{ + PersistentVolumeSource: v1.PersistentVolumeSource{ + AWSElasticBlockStore: &v1.AWSElasticBlockStoreVolumeSource{ + VolumeID: "aws://eu-west-1c/vol-012d34d567890123b", + }, + }, + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "test-pv-available", + }, + Status: v1.PersistentVolumeStatus{ + Phase: v1.VolumeAvailable, + }, + }, + Want: ` + # HELP kube_persistentvolume_info Information about persistentvolume. + # TYPE kube_persistentvolume_info gauge + kube_persistentvolume_info{ebs_volume_id="aws://eu-west-1c/vol-012d34d567890123b",gce_persistent_disk_name="",persistentvolume="test-pv-available",storageclass=""} 1 `, MetricNames: []string{"kube_persistentvolume_info"}, },