Skip to content

Commit a0d0a27

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

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
@@ -194,6 +194,12 @@ func useVolumeCloning(req *csi.CreateVolumeRequest) bool {
194194

195195
func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) {
196196
var err error
197+
diskTypeForMetric := ""
198+
defer func() {
199+
if err != nil {
200+
gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, diskTypeForMetric)
201+
}
202+
}()
197203
// Validate arguments
198204
volumeCapabilities := req.GetVolumeCapabilities()
199205
name := req.GetName()
@@ -275,6 +281,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
275281

276282
// Validate if disk already exists
277283
existingDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gceAPIVersion)
284+
diskTypeForMetric = metrics.GetDiskType(existingDisk)
278285
if err != nil {
279286
if !gce.IsGCEError(err, "notFound") {
280287
return nil, common.LoggedError("CreateVolume, failed to getDisk when validating: ", err)
@@ -329,6 +336,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
329336

330337
// Verify that the volume in VolumeContentSource exists.
331338
diskFromSourceVolume, err := gceCS.CloudProvider.GetDisk(ctx, project, sourceVolKey, gceAPIVersion)
339+
diskTypeForMetric = metrics.GetDiskType(diskFromSourceVolume)
332340
if err != nil {
333341
if gce.IsGCEError(err, "notFound") {
334342
return nil, status.Errorf(codes.NotFound, "CreateVolume source volume %s does not exist", volumeContentSourceVolumeID)
@@ -385,15 +393,14 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
385393

386394
// Create the disk
387395
var disk *gce.CloudDisk
396+
diskTypeForMetric = params.DiskType
388397
switch params.ReplicationType {
389398
case replicationTypeNone:
390399
if len(zones) != 1 {
391400
return nil, status.Errorf(codes.Internal, "CreateVolume failed to get a single zone for creating zonal disk, instead got: %v", zones)
392401
}
393402
disk, err = createSingleZoneDisk(ctx, gceCS.CloudProvider, name, zones, params, capacityRange, capBytes, snapshotID, volumeContentSourceVolumeID, multiWriter)
394403
if err != nil {
395-
// Emit metric for expected disk type from storage class
396-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
397404
return nil, common.LoggedError("CreateVolume failed to create single zonal disk "+name+": ", err)
398405
}
399406
case replicationTypeRegionalPD:
@@ -402,8 +409,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
402409
}
403410
disk, err = createRegionalDisk(ctx, gceCS.CloudProvider, name, zones, params, capacityRange, capBytes, snapshotID, volumeContentSourceVolumeID, multiWriter)
404411
if err != nil {
405-
// Emit metric for expected disk type from storage class
406-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
407412
return nil, common.LoggedError("CreateVolume failed to create regional disk "+name+": ", err)
408413
}
409414
default:
@@ -412,8 +417,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
412417

413418
ready, err := isDiskReady(disk)
414419
if err != nil {
415-
// Emit metric for expected disk type from storage class as the disk is not ready and might not have PD type populated
416-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
417420
return nil, status.Errorf(codes.Internal, "CreateVolume disk %v had error checking ready status: %v", volKey, err.Error())
418421
}
419422
if !ready {
@@ -426,6 +429,13 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
426429
}
427430

428431
func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) {
432+
var err error
433+
diskTypeForMetric := ""
434+
defer func() {
435+
if err != nil {
436+
gceCS.Metrics.RecordOperationErrorMetrics("DeleteVolume", err, diskTypeForMetric)
437+
}
438+
}()
429439
// Validate arguments
430440
volumeID := req.GetVolumeId()
431441
if len(volumeID) == 0 {
@@ -441,6 +451,8 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
441451
}
442452

443453
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
454+
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
455+
diskTypeForMetric = metrics.GetDiskType(disk)
444456
if err != nil {
445457
if gce.IsGCENotFoundError(err) {
446458
klog.Warningf("DeleteVolume treating volume as deleted because cannot find volume %v: %v", volumeID, err.Error())
@@ -464,12 +476,20 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
464476
}
465477

466478
func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
479+
var err error
480+
diskTypeForMetric := ""
481+
defer func() {
482+
if err != nil {
483+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskTypeForMetric)
484+
}
485+
}()
467486
// Only valid requests will be accepted
468-
_, _, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
487+
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
469488
if err != nil {
470489
return nil, err
471490
}
472-
491+
diskToPublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
492+
diskTypeForMetric = metrics.GetDiskType(diskToPublish)
473493
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
474494
if gceCS.errorBackoff.blocking(backoffId) {
475495
return nil, status.Errorf(codes.Unavailable, "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId)
@@ -525,7 +545,6 @@ func parseMachineType(machineTypeUrl string) string {
525545

526546
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
527547
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
528-
529548
if err != nil {
530549
return nil, err
531550
}
@@ -554,9 +573,8 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
554573
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID)
555574
}
556575
defer gceCS.volumeLocks.Release(lockingVolumeID)
557-
diskToPublish, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
576+
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
558577
if err != nil {
559-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskNotFound)
560578
if gce.IsGCENotFoundError(err) {
561579
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error())
562580
}
@@ -606,15 +624,11 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
606624
machineType := parseMachineType(instance.MachineType)
607625
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)
608626
}
609-
// Emit metric for error
610-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, metrics.GetDiskType(diskToPublish))
611627
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error())
612628
}
613629

614630
err = gceCS.CloudProvider.WaitForAttach(ctx, project, volKey, instanceZone, instanceName)
615631
if err != nil {
616-
// Emit metric for error
617-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, metrics.GetDiskType(diskToPublish))
618632
return nil, status.Errorf(codes.Internal, "Errored during WaitForAttach: %v", err.Error())
619633
}
620634

@@ -623,12 +637,20 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
623637
}
624638

625639
func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) {
626-
// Only valid requests will be queued
627-
_, _, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req)
640+
var err error
641+
diskTypeForMetric := ""
642+
defer func() {
643+
if err != nil {
644+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskTypeForMetric)
645+
}
646+
}()
647+
project, volKey, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req)
628648
if err != nil {
629649
return nil, err
630650
}
631-
651+
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
652+
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
653+
// Only valid requests will be queued
632654
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
633655
if gceCS.errorBackoff.blocking(backoffId) {
634656
return nil, status.Errorf(codes.Unavailable, "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId)
@@ -715,14 +737,8 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C
715737
klog.V(4).Infof("ControllerUnpublishVolume succeeded for disk %v from node %v. Already not attached.", volKey, nodeID)
716738
return &csi.ControllerUnpublishVolumeResponse{}, nil
717739
}
718-
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gce.GCEAPIVersionV1)
719-
if err != nil {
720-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskNotFound)
721-
common.LoggedError("Failed to getDisk: ", err)
722-
}
723740
err = gceCS.CloudProvider.DetachDisk(ctx, project, deviceName, instanceZone, instanceName)
724741
if err != nil {
725-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, metrics.GetDiskType(diskToUnpublish))
726742
return nil, common.LoggedError("Failed to detach: ", err)
727743
}
728744

@@ -731,6 +747,13 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C
731747
}
732748

733749
func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context, req *csi.ValidateVolumeCapabilitiesRequest) (*csi.ValidateVolumeCapabilitiesResponse, error) {
750+
var err error
751+
diskTypeForMetric := ""
752+
defer func() {
753+
if err != nil {
754+
gceCS.Metrics.RecordOperationErrorMetrics("ValidateVolumeCapabilities", err, diskTypeForMetric)
755+
}
756+
}()
734757
if req.GetVolumeCapabilities() == nil || len(req.GetVolumeCapabilities()) == 0 {
735758
return nil, status.Error(codes.InvalidArgument, "Volume Capabilities must be provided")
736759
}
@@ -742,7 +765,6 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
742765
if err != nil {
743766
return nil, status.Errorf(codes.InvalidArgument, "Volume ID is invalid: %v", err.Error())
744767
}
745-
746768
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
747769
if err != nil {
748770
if gce.IsGCENotFoundError(err) {
@@ -757,6 +779,7 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
757779
defer gceCS.volumeLocks.Release(volumeID)
758780

759781
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
782+
diskTypeForMetric = metrics.GetDiskType(disk)
760783
if err != nil {
761784
if gce.IsGCENotFoundError(err) {
762785
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.Name, err.Error())
@@ -883,6 +906,13 @@ func (gceCS *GCEControllerServer) ControllerGetCapabilities(ctx context.Context,
883906
}
884907

885908
func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) {
909+
var err error
910+
diskTypeForMetric := ""
911+
defer func() {
912+
if err != nil {
913+
gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskTypeForMetric)
914+
}
915+
}()
886916
// Validate arguments
887917
volumeID := req.GetSourceVolumeId()
888918
if len(req.Name) == 0 {
@@ -902,7 +932,8 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C
902932
defer gceCS.volumeLocks.Release(volumeID)
903933

904934
// Check if volume exists
905-
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
935+
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
936+
diskTypeForMetric = metrics.GetDiskType(disk)
906937
if err != nil {
907938
if gce.IsGCENotFoundError(err) {
908939
return nil, status.Errorf(codes.NotFound, "CreateSnapshot could not find disk %v: %v", volKey.String(), err.Error())
@@ -940,10 +971,6 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
940971
if err != nil {
941972
return nil, status.Errorf(codes.InvalidArgument, "Invalid volume key: %v", volKey)
942973
}
943-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gce.GCEAPIVersionV1)
944-
if err != nil {
945-
common.LoggedError("Failed to getDisk: ", err)
946-
}
947974
// Check if PD snapshot already exists
948975
var snapshot *compute.Snapshot
949976
snapshot, err = gceCS.CloudProvider.GetSnapshot(ctx, project, snapshotName)
@@ -955,17 +982,14 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
955982
snapshot, err = gceCS.CloudProvider.CreateSnapshot(ctx, project, volKey, snapshotName, snapshotParams)
956983
if err != nil {
957984
if gce.IsGCEError(err, "notFound") {
958-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskNotFound)
959985
return nil, status.Errorf(codes.NotFound, "Could not find volume with ID %v: %v", volKey.String(), err.Error())
960986
}
961-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, metrics.GetDiskType(sourceDisk))
962987
return nil, common.LoggedError("Failed to create snapshot: ", err)
963988
}
964989
}
965990

966991
err = gceCS.validateExistingSnapshot(snapshot, volKey)
967992
if err != nil {
968-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, metrics.GetDiskType(sourceDisk))
969993
return nil, status.Errorf(codes.AlreadyExists, "Error in creating snapshot: %v", err.Error())
970994
}
971995

@@ -1119,6 +1143,13 @@ func isCSISnapshotReady(status string) (bool, error) {
11191143
}
11201144

11211145
func (gceCS *GCEControllerServer) DeleteSnapshot(ctx context.Context, req *csi.DeleteSnapshotRequest) (*csi.DeleteSnapshotResponse, error) {
1146+
var err error
1147+
diskTypeForMetric := ""
1148+
defer func() {
1149+
if err != nil {
1150+
gceCS.Metrics.RecordOperationErrorMetrics("DeleteSnapshot", err, diskTypeForMetric)
1151+
}
1152+
}()
11221153
// Validate arguments
11231154
snapshotID := req.GetSnapshotId()
11241155
if len(snapshotID) == 0 {
@@ -1203,6 +1234,13 @@ func (gceCS *GCEControllerServer) ListSnapshots(ctx context.Context, req *csi.Li
12031234
}
12041235

12051236
func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, req *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) {
1237+
var err error
1238+
diskTypeForMetric := ""
1239+
defer func() {
1240+
if err != nil {
1241+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskTypeForMetric)
1242+
}
1243+
}()
12061244
volumeID := req.GetVolumeId()
12071245
if len(volumeID) == 0 {
12081246
return nil, status.Error(codes.InvalidArgument, "ControllerExpandVolume volume ID must be provided")
@@ -1217,22 +1255,17 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re
12171255
if err != nil {
12181256
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error())
12191257
}
1220-
1258+
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1259+
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12211260
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
12221261
if err != nil {
1223-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskNotFound)
12241262
if gce.IsGCENotFoundError(err) {
12251263
return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error())
12261264
}
12271265
return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err)
12281266
}
1229-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1230-
if err != nil {
1231-
common.LoggedError("Failed to getDisk: ", err)
1232-
}
12331267
resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes)
12341268
if err != nil {
1235-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, metrics.GetDiskType(sourceDisk))
12361269
return nil, common.LoggedError("ControllerExpandVolume failed to resize disk: ", err)
12371270
}
12381271

0 commit comments

Comments
 (0)