Skip to content

Commit ec6b44a

Browse files
committed
adding metrics for additional method calls
1 parent 0af41c6 commit ec6b44a

File tree

1 file changed

+73
-40
lines changed

1 file changed

+73
-40
lines changed

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

+73-40
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,12 @@ func useVolumeCloning(req *csi.CreateVolumeRequest) bool {
195195

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

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

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

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

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

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

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

467479
func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
480+
var err error
481+
diskTypeForMetric := ""
482+
defer func() {
483+
if err != nil {
484+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskTypeForMetric)
485+
}
486+
}()
468487
// Only valid requests will be accepted
469-
_, _, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
488+
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
470489
if err != nil {
471490
return nil, err
472491
}
473-
492+
diskToPublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
493+
diskTypeForMetric = metrics.GetDiskType(diskToPublish)
474494
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
475495
if gceCS.errorBackoff.blocking(backoffId) {
476496
return nil, status.Errorf(codes.Unavailable, "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId)
@@ -526,7 +546,6 @@ func parseMachineType(machineTypeUrl string) string {
526546

527547
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
528548
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
529-
530549
if err != nil {
531550
return nil, err
532551
}
@@ -555,9 +574,8 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
555574
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID)
556575
}
557576
defer gceCS.volumeLocks.Release(lockingVolumeID)
558-
diskToPublish, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
577+
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
559578
if err != nil {
560-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskNotFound)
561579
if gce.IsGCENotFoundError(err) {
562580
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error())
563581
}
@@ -607,15 +625,11 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
607625
machineType := parseMachineType(instance.MachineType)
608626
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)
609627
}
610-
// Emit metric for error
611-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, metrics.GetDiskType(diskToPublish))
612628
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error())
613629
}
614630

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

@@ -624,12 +638,20 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
624638
}
625639

626640
func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) {
627-
// Only valid requests will be queued
628-
_, _, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req)
641+
var err error
642+
diskTypeForMetric := ""
643+
defer func() {
644+
if err != nil {
645+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskTypeForMetric)
646+
}
647+
}()
648+
project, volKey, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req)
629649
if err != nil {
630650
return nil, err
631651
}
632-
652+
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
653+
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
654+
// Only valid requests will be queued
633655
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
634656
if gceCS.errorBackoff.blocking(backoffId) {
635657
return nil, status.Errorf(codes.Unavailable, "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId)
@@ -717,14 +739,8 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C
717739
klog.V(4).Infof("ControllerUnpublishVolume succeeded for disk %v from node %v. Already not attached.", volKey, nodeID)
718740
return &csi.ControllerUnpublishVolumeResponse{}, nil
719741
}
720-
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gce.GCEAPIVersionV1)
721-
if err != nil {
722-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskNotFound)
723-
common.LoggedError("Failed to getDisk: ", err)
724-
}
725742
err = gceCS.CloudProvider.DetachDisk(ctx, project, deviceName, instanceZone, instanceName)
726743
if err != nil {
727-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, metrics.GetDiskType(diskToUnpublish))
728744
return nil, common.LoggedError("Failed to detach: ", err)
729745
}
730746

@@ -733,6 +749,13 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C
733749
}
734750

735751
func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context, req *csi.ValidateVolumeCapabilitiesRequest) (*csi.ValidateVolumeCapabilitiesResponse, error) {
752+
var err error
753+
diskTypeForMetric := ""
754+
defer func() {
755+
if err != nil {
756+
gceCS.Metrics.RecordOperationErrorMetrics("ValidateVolumeCapabilities", err, diskTypeForMetric)
757+
}
758+
}()
736759
if req.GetVolumeCapabilities() == nil || len(req.GetVolumeCapabilities()) == 0 {
737760
return nil, status.Error(codes.InvalidArgument, "Volume Capabilities must be provided")
738761
}
@@ -744,7 +767,6 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
744767
if err != nil {
745768
return nil, status.Errorf(codes.InvalidArgument, "Volume ID is invalid: %v", err.Error())
746769
}
747-
748770
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
749771
if err != nil {
750772
if gce.IsGCENotFoundError(err) {
@@ -759,6 +781,7 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
759781
defer gceCS.volumeLocks.Release(volumeID)
760782

761783
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
784+
diskTypeForMetric = metrics.GetDiskType(disk)
762785
if err != nil {
763786
if gce.IsGCENotFoundError(err) {
764787
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.Name, err.Error())
@@ -885,6 +908,13 @@ func (gceCS *GCEControllerServer) ControllerGetCapabilities(ctx context.Context,
885908
}
886909

887910
func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) {
911+
var err error
912+
diskTypeForMetric := ""
913+
defer func() {
914+
if err != nil {
915+
gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskTypeForMetric)
916+
}
917+
}()
888918
// Validate arguments
889919
volumeID := req.GetSourceVolumeId()
890920
if len(req.Name) == 0 {
@@ -904,7 +934,8 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C
904934
defer gceCS.volumeLocks.Release(volumeID)
905935

906936
// Check if volume exists
907-
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
937+
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
938+
diskTypeForMetric = metrics.GetDiskType(disk)
908939
if err != nil {
909940
if gce.IsGCENotFoundError(err) {
910941
return nil, status.Errorf(codes.NotFound, "CreateSnapshot could not find disk %v: %v", volKey.String(), err.Error())
@@ -942,10 +973,6 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
942973
if err != nil {
943974
return nil, status.Errorf(codes.InvalidArgument, "Invalid volume key: %v", volKey)
944975
}
945-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gce.GCEAPIVersionV1)
946-
if err != nil {
947-
common.LoggedError("Failed to getDisk: ", err)
948-
}
949976
// Check if PD snapshot already exists
950977
var snapshot *compute.Snapshot
951978
snapshot, err = gceCS.CloudProvider.GetSnapshot(ctx, project, snapshotName)
@@ -957,17 +984,14 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
957984
snapshot, err = gceCS.CloudProvider.CreateSnapshot(ctx, project, volKey, snapshotName, snapshotParams)
958985
if err != nil {
959986
if gce.IsGCEError(err, "notFound") {
960-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskNotFound)
961987
return nil, status.Errorf(codes.NotFound, "Could not find volume with ID %v: %v", volKey.String(), err.Error())
962988
}
963-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, metrics.GetDiskType(sourceDisk))
964989
return nil, common.LoggedError("Failed to create snapshot: ", err)
965990
}
966991
}
967992

968993
err = gceCS.validateExistingSnapshot(snapshot, volKey)
969994
if err != nil {
970-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, metrics.GetDiskType(sourceDisk))
971995
return nil, status.Errorf(codes.AlreadyExists, "Error in creating snapshot: %v", err.Error())
972996
}
973997

@@ -1121,6 +1145,13 @@ func isCSISnapshotReady(status string) (bool, error) {
11211145
}
11221146

11231147
func (gceCS *GCEControllerServer) DeleteSnapshot(ctx context.Context, req *csi.DeleteSnapshotRequest) (*csi.DeleteSnapshotResponse, error) {
1148+
var err error
1149+
diskTypeForMetric := ""
1150+
defer func() {
1151+
if err != nil {
1152+
gceCS.Metrics.RecordOperationErrorMetrics("DeleteSnapshot", err, diskTypeForMetric)
1153+
}
1154+
}()
11241155
// Validate arguments
11251156
snapshotID := req.GetSnapshotId()
11261157
if len(snapshotID) == 0 {
@@ -1205,6 +1236,13 @@ func (gceCS *GCEControllerServer) ListSnapshots(ctx context.Context, req *csi.Li
12051236
}
12061237

12071238
func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, req *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) {
1239+
var err error
1240+
diskTypeForMetric := ""
1241+
defer func() {
1242+
if err != nil {
1243+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskTypeForMetric)
1244+
}
1245+
}()
12081246
volumeID := req.GetVolumeId()
12091247
if len(volumeID) == 0 {
12101248
return nil, status.Error(codes.InvalidArgument, "ControllerExpandVolume volume ID must be provided")
@@ -1219,22 +1257,17 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re
12191257
if err != nil {
12201258
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error())
12211259
}
1222-
1260+
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1261+
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
12231262
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
12241263
if err != nil {
1225-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskNotFound)
12261264
if gce.IsGCENotFoundError(err) {
12271265
return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error())
12281266
}
12291267
return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err)
12301268
}
1231-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1232-
if err != nil {
1233-
common.LoggedError("Failed to getDisk: ", err)
1234-
}
12351269
resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes)
12361270
if err != nil {
1237-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, metrics.GetDiskType(sourceDisk))
12381271
return nil, common.LoggedError("ControllerExpandVolume failed to resize disk: ", err)
12391272
}
12401273

0 commit comments

Comments
 (0)