Skip to content

Commit ad1da56

Browse files
Sneha-atsunnylovestiramisu
authored andcommitted
adding metrics for additional method calls
1 parent d9d489c commit ad1da56

File tree

1 file changed

+73
-40
lines changed

1 file changed

+73
-40
lines changed

pkg/gce-pd-csi-driver/controller.go

Lines changed: 73 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,12 @@ func useVolumeCloning(req *csi.CreateVolumeRequest) bool {
202202

203203
func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) {
204204
var err error
205+
diskTypeForMetric := ""
206+
defer func() {
207+
if err != nil {
208+
gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, diskTypeForMetric)
209+
}
210+
}()
205211
// Validate arguments
206212
volumeCapabilities := req.GetVolumeCapabilities()
207213
name := req.GetName()
@@ -283,6 +289,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
283289

284290
// Validate if disk already exists
285291
existingDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gceAPIVersion)
292+
diskTypeForMetric = metrics.GetDiskType(existingDisk)
286293
if err != nil {
287294
if !gce.IsGCEError(err, "notFound") {
288295
return nil, common.LoggedError("CreateVolume, failed to getDisk when validating: ", err)
@@ -337,6 +344,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
337344

338345
// Verify that the volume in VolumeContentSource exists.
339346
diskFromSourceVolume, err := gceCS.CloudProvider.GetDisk(ctx, project, sourceVolKey, gceAPIVersion)
347+
diskTypeForMetric = metrics.GetDiskType(diskFromSourceVolume)
340348
if err != nil {
341349
if gce.IsGCEError(err, "notFound") {
342350
return nil, status.Errorf(codes.NotFound, "CreateVolume source volume %s does not exist", volumeContentSourceVolumeID)
@@ -393,15 +401,14 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
393401

394402
// Create the disk
395403
var disk *gce.CloudDisk
404+
diskTypeForMetric = params.DiskType
396405
switch params.ReplicationType {
397406
case replicationTypeNone:
398407
if len(zones) != 1 {
399408
return nil, status.Errorf(codes.Internal, "CreateVolume failed to get a single zone for creating zonal disk, instead got: %v", zones)
400409
}
401410
disk, err = createSingleZoneDisk(ctx, gceCS.CloudProvider, name, zones, params, capacityRange, capBytes, snapshotID, volumeContentSourceVolumeID, multiWriter)
402411
if err != nil {
403-
// Emit metric for expected disk type from storage class
404-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
405412
return nil, common.LoggedError("CreateVolume failed to create single zonal disk "+name+": ", err)
406413
}
407414
case replicationTypeRegionalPD:
@@ -410,8 +417,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
410417
}
411418
disk, err = createRegionalDisk(ctx, gceCS.CloudProvider, name, zones, params, capacityRange, capBytes, snapshotID, volumeContentSourceVolumeID, multiWriter)
412419
if err != nil {
413-
// Emit metric for expected disk type from storage class
414-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
415420
return nil, common.LoggedError("CreateVolume failed to create regional disk "+name+": ", err)
416421
}
417422
default:
@@ -420,8 +425,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
420425

421426
ready, err := isDiskReady(disk)
422427
if err != nil {
423-
// Emit metric for expected disk type from storage class as the disk is not ready and might not have PD type populated
424-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
425428
return nil, status.Errorf(codes.Internal, "CreateVolume disk %v had error checking ready status: %v", volKey, err.Error())
426429
}
427430
if !ready {
@@ -434,6 +437,13 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
434437
}
435438

436439
func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) {
440+
var err error
441+
diskTypeForMetric := ""
442+
defer func() {
443+
if err != nil {
444+
gceCS.Metrics.RecordOperationErrorMetrics("DeleteVolume", err, diskTypeForMetric)
445+
}
446+
}()
437447
// Validate arguments
438448
volumeID := req.GetVolumeId()
439449
if len(volumeID) == 0 {
@@ -449,6 +459,8 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
449459
}
450460

451461
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
462+
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
463+
diskTypeForMetric = metrics.GetDiskType(disk)
452464
if err != nil {
453465
if gce.IsGCENotFoundError(err) {
454466
klog.Warningf("DeleteVolume treating volume as deleted because cannot find volume %v: %v", volumeID, err.Error())
@@ -472,12 +484,20 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
472484
}
473485

474486
func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
487+
var err error
488+
diskTypeForMetric := ""
489+
defer func() {
490+
if err != nil {
491+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskTypeForMetric)
492+
}
493+
}()
475494
// Only valid requests will be accepted
476-
_, _, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
495+
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
477496
if err != nil {
478497
return nil, err
479498
}
480-
499+
diskToPublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
500+
diskTypeForMetric = metrics.GetDiskType(diskToPublish)
481501
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
482502
if gceCS.errorBackoff.blocking(backoffId) {
483503
return nil, status.Errorf(codes.Unavailable, "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId)
@@ -533,7 +553,6 @@ func parseMachineType(machineTypeUrl string) string {
533553

534554
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
535555
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
536-
537556
if err != nil {
538557
return nil, err
539558
}
@@ -562,9 +581,8 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
562581
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID)
563582
}
564583
defer gceCS.volumeLocks.Release(lockingVolumeID)
565-
diskToPublish, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
584+
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
566585
if err != nil {
567-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskNotFound)
568586
if gce.IsGCENotFoundError(err) {
569587
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error())
570588
}
@@ -614,15 +632,11 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
614632
machineType := parseMachineType(instance.MachineType)
615633
return nil, status.Errorf(codes.InvalidArgument, "'%s' is not a compatible disk type with the machine type %s, please review the GCP online documentation for available persistent disk options", udErr.DiskType, machineType)
616634
}
617-
// Emit metric for error
618-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, metrics.GetDiskType(diskToPublish))
619635
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error())
620636
}
621637

622638
err = gceCS.CloudProvider.WaitForAttach(ctx, project, volKey, instanceZone, instanceName)
623639
if err != nil {
624-
// Emit metric for error
625-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, metrics.GetDiskType(diskToPublish))
626640
return nil, status.Errorf(codes.Internal, "Errored during WaitForAttach: %v", err.Error())
627641
}
628642

@@ -631,12 +645,20 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
631645
}
632646

633647
func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) {
634-
// Only valid requests will be queued
635-
_, _, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req)
648+
var err error
649+
diskTypeForMetric := ""
650+
defer func() {
651+
if err != nil {
652+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskTypeForMetric)
653+
}
654+
}()
655+
project, volKey, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req)
636656
if err != nil {
637657
return nil, err
638658
}
639-
659+
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
660+
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
661+
// Only valid requests will be queued
640662
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
641663
if gceCS.errorBackoff.blocking(backoffId) {
642664
return nil, status.Errorf(codes.Unavailable, "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId)
@@ -723,14 +745,8 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C
723745
klog.V(4).Infof("ControllerUnpublishVolume succeeded for disk %v from node %v. Already not attached.", volKey, nodeID)
724746
return &csi.ControllerUnpublishVolumeResponse{}, nil
725747
}
726-
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gce.GCEAPIVersionV1)
727-
if err != nil {
728-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskNotFound)
729-
common.LoggedError("Failed to getDisk: ", err)
730-
}
731748
err = gceCS.CloudProvider.DetachDisk(ctx, project, deviceName, instanceZone, instanceName)
732749
if err != nil {
733-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, metrics.GetDiskType(diskToUnpublish))
734750
return nil, common.LoggedError("Failed to detach: ", err)
735751
}
736752

@@ -739,6 +755,13 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C
739755
}
740756

741757
func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context, req *csi.ValidateVolumeCapabilitiesRequest) (*csi.ValidateVolumeCapabilitiesResponse, error) {
758+
var err error
759+
diskTypeForMetric := ""
760+
defer func() {
761+
if err != nil {
762+
gceCS.Metrics.RecordOperationErrorMetrics("ValidateVolumeCapabilities", err, diskTypeForMetric)
763+
}
764+
}()
742765
if req.GetVolumeCapabilities() == nil || len(req.GetVolumeCapabilities()) == 0 {
743766
return nil, status.Error(codes.InvalidArgument, "Volume Capabilities must be provided")
744767
}
@@ -750,7 +773,6 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
750773
if err != nil {
751774
return nil, status.Errorf(codes.InvalidArgument, "Volume ID is invalid: %v", err.Error())
752775
}
753-
754776
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
755777
if err != nil {
756778
if gce.IsGCENotFoundError(err) {
@@ -765,6 +787,7 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
765787
defer gceCS.volumeLocks.Release(volumeID)
766788

767789
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
790+
diskTypeForMetric = metrics.GetDiskType(disk)
768791
if err != nil {
769792
if gce.IsGCENotFoundError(err) {
770793
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.Name, err.Error())
@@ -891,6 +914,13 @@ func (gceCS *GCEControllerServer) ControllerGetCapabilities(ctx context.Context,
891914
}
892915

893916
func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) {
917+
var err error
918+
diskTypeForMetric := ""
919+
defer func() {
920+
if err != nil {
921+
gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskTypeForMetric)
922+
}
923+
}()
894924
// Validate arguments
895925
volumeID := req.GetSourceVolumeId()
896926
if len(req.Name) == 0 {
@@ -910,7 +940,8 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C
910940
defer gceCS.volumeLocks.Release(volumeID)
911941

912942
// Check if volume exists
913-
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
943+
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
944+
diskTypeForMetric = metrics.GetDiskType(disk)
914945
if err != nil {
915946
if gce.IsGCENotFoundError(err) {
916947
return nil, status.Errorf(codes.NotFound, "CreateSnapshot could not find disk %v: %v", volKey.String(), err.Error())
@@ -948,10 +979,6 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
948979
if err != nil {
949980
return nil, status.Errorf(codes.InvalidArgument, "Invalid volume key: %v", volKey)
950981
}
951-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gce.GCEAPIVersionV1)
952-
if err != nil {
953-
common.LoggedError("Failed to getDisk: ", err)
954-
}
955982
// Check if PD snapshot already exists
956983
var snapshot *compute.Snapshot
957984
snapshot, err = gceCS.CloudProvider.GetSnapshot(ctx, project, snapshotName)
@@ -963,17 +990,14 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
963990
snapshot, err = gceCS.CloudProvider.CreateSnapshot(ctx, project, volKey, snapshotName, snapshotParams)
964991
if err != nil {
965992
if gce.IsGCEError(err, "notFound") {
966-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskNotFound)
967993
return nil, status.Errorf(codes.NotFound, "Could not find volume with ID %v: %v", volKey.String(), err.Error())
968994
}
969-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, metrics.GetDiskType(sourceDisk))
970995
return nil, common.LoggedError("Failed to create snapshot: ", err)
971996
}
972997
}
973998

974999
err = gceCS.validateExistingSnapshot(snapshot, volKey)
9751000
if err != nil {
976-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, metrics.GetDiskType(sourceDisk))
9771001
return nil, status.Errorf(codes.AlreadyExists, "Error in creating snapshot: %v", err.Error())
9781002
}
9791003

@@ -1127,6 +1151,13 @@ func isCSISnapshotReady(status string) (bool, error) {
11271151
}
11281152

11291153
func (gceCS *GCEControllerServer) DeleteSnapshot(ctx context.Context, req *csi.DeleteSnapshotRequest) (*csi.DeleteSnapshotResponse, error) {
1154+
var err error
1155+
diskTypeForMetric := ""
1156+
defer func() {
1157+
if err != nil {
1158+
gceCS.Metrics.RecordOperationErrorMetrics("DeleteSnapshot", err, diskTypeForMetric)
1159+
}
1160+
}()
11301161
// Validate arguments
11311162
snapshotID := req.GetSnapshotId()
11321163
if len(snapshotID) == 0 {
@@ -1211,6 +1242,13 @@ func (gceCS *GCEControllerServer) ListSnapshots(ctx context.Context, req *csi.Li
12111242
}
12121243

12131244
func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, req *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) {
1245+
var err error
1246+
diskTypeForMetric := ""
1247+
defer func() {
1248+
if err != nil {
1249+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskTypeForMetric)
1250+
}
1251+
}()
12141252
volumeID := req.GetVolumeId()
12151253
if len(volumeID) == 0 {
12161254
return nil, status.Error(codes.InvalidArgument, "ControllerExpandVolume volume ID must be provided")
@@ -1225,22 +1263,17 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re
12251263
if err != nil {
12261264
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error())
12271265
}
1228-
1266+
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1267+
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12291268
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
12301269
if err != nil {
1231-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskNotFound)
12321270
if gce.IsGCENotFoundError(err) {
12331271
return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error())
12341272
}
12351273
return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err)
12361274
}
1237-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1238-
if err != nil {
1239-
common.LoggedError("Failed to getDisk: ", err)
1240-
}
12411275
resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes)
12421276
if err != nil {
1243-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, metrics.GetDiskType(sourceDisk))
12441277
return nil, common.LoggedError("ControllerExpandVolume failed to resize disk: ", err)
12451278
}
12461279

0 commit comments

Comments
 (0)