Skip to content

Commit fd13fb8

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

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
@@ -147,6 +147,12 @@ func isDiskReady(disk *gce.CloudDisk) (bool, error) {
147147

148148
func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.CreateVolumeRequest) (*csi.CreateVolumeResponse, error) {
149149
var err error
150+
diskTypeForMetric := ""
151+
defer func() {
152+
if err != nil {
153+
gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, diskTypeForMetric)
154+
}
155+
}()
150156
// Validate arguments
151157
volumeCapabilities := req.GetVolumeCapabilities()
152158
name := req.GetName()
@@ -219,6 +225,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
219225

220226
// Validate if disk already exists
221227
existingDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gceAPIVersion)
228+
diskTypeForMetric = metrics.GetDiskType(existingDisk)
222229
if err != nil {
223230
if !gce.IsGCEError(err, "notFound") {
224231
return nil, common.LoggedError("CreateVolume, failed to getDisk when validating: ", err)
@@ -273,6 +280,7 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
273280

274281
// Verify that the volume in VolumeContentSource exists.
275282
diskFromSourceVolume, err := gceCS.CloudProvider.GetDisk(ctx, project, sourceVolKey, gceAPIVersion)
283+
diskTypeForMetric = metrics.GetDiskType(diskFromSourceVolume)
276284
if err != nil {
277285
if gce.IsGCEError(err, "notFound") {
278286
return nil, status.Errorf(codes.NotFound, "CreateVolume source volume %s does not exist", volumeContentSourceVolumeID)
@@ -329,15 +337,14 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
329337

330338
// Create the disk
331339
var disk *gce.CloudDisk
340+
diskTypeForMetric = params.DiskType
332341
switch params.ReplicationType {
333342
case replicationTypeNone:
334343
if len(zones) != 1 {
335344
return nil, status.Errorf(codes.Internal, "CreateVolume failed to get a single zone for creating zonal disk, instead got: %v", zones)
336345
}
337346
disk, err = createSingleZoneDisk(ctx, gceCS.CloudProvider, name, zones, params, capacityRange, capBytes, snapshotID, volumeContentSourceVolumeID, multiWriter)
338347
if err != nil {
339-
// Emit metric for expected disk type from storage class
340-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
341348
return nil, common.LoggedError("CreateVolume failed to create single zonal disk "+name+": ", err)
342349
}
343350
case replicationTypeRegionalPD:
@@ -346,8 +353,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
346353
}
347354
disk, err = createRegionalDisk(ctx, gceCS.CloudProvider, name, zones, params, capacityRange, capBytes, snapshotID, volumeContentSourceVolumeID, multiWriter)
348355
if err != nil {
349-
// Emit metric for expected disk type from storage class
350-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
351356
return nil, common.LoggedError("CreateVolume failed to create regional disk "+name+": ", err)
352357
}
353358
default:
@@ -356,8 +361,6 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
356361

357362
ready, err := isDiskReady(disk)
358363
if err != nil {
359-
// Emit metric for expected disk type from storage class as the disk is not ready and might not have PD type populated
360-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateVolume", err, params.DiskType)
361364
return nil, status.Errorf(codes.Internal, "CreateVolume disk %v had error checking ready status: %v", volKey, err.Error())
362365
}
363366
if !ready {
@@ -370,6 +373,13 @@ func (gceCS *GCEControllerServer) CreateVolume(ctx context.Context, req *csi.Cre
370373
}
371374

372375
func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.DeleteVolumeRequest) (*csi.DeleteVolumeResponse, error) {
376+
var err error
377+
diskTypeForMetric := ""
378+
defer func() {
379+
if err != nil {
380+
gceCS.Metrics.RecordOperationErrorMetrics("DeleteVolume", err, diskTypeForMetric)
381+
}
382+
}()
373383
// Validate arguments
374384
volumeID := req.GetVolumeId()
375385
if len(volumeID) == 0 {
@@ -385,6 +395,8 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
385395
}
386396

387397
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
398+
disk, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
399+
diskTypeForMetric = metrics.GetDiskType(disk)
388400
if err != nil {
389401
if gce.IsGCENotFoundError(err) {
390402
klog.Warningf("DeleteVolume treating volume as deleted because cannot find volume %v: %v", volumeID, err.Error())
@@ -408,12 +420,20 @@ func (gceCS *GCEControllerServer) DeleteVolume(ctx context.Context, req *csi.Del
408420
}
409421

410422
func (gceCS *GCEControllerServer) ControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
423+
var err error
424+
diskTypeForMetric := ""
425+
defer func() {
426+
if err != nil {
427+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskTypeForMetric)
428+
}
429+
}()
411430
// Only valid requests will be accepted
412-
_, _, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
431+
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
413432
if err != nil {
414433
return nil, err
415434
}
416-
435+
diskToPublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
436+
diskTypeForMetric = metrics.GetDiskType(diskToPublish)
417437
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
418438
if gceCS.errorBackoff.blocking(backoffId) {
419439
return nil, status.Errorf(codes.Unavailable, "ControllerPublish not permitted on node %q due to backoff condition", req.NodeId)
@@ -469,7 +489,6 @@ func parseMachineType(machineTypeUrl string) string {
469489

470490
func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Context, req *csi.ControllerPublishVolumeRequest) (*csi.ControllerPublishVolumeResponse, error) {
471491
project, volKey, err := gceCS.validateControllerPublishVolumeRequest(ctx, req)
472-
473492
if err != nil {
474493
return nil, err
475494
}
@@ -498,9 +517,8 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
498517
return nil, status.Errorf(codes.Aborted, common.VolumeOperationAlreadyExistsFmt, lockingVolumeID)
499518
}
500519
defer gceCS.volumeLocks.Release(lockingVolumeID)
501-
diskToPublish, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
520+
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
502521
if err != nil {
503-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, diskNotFound)
504522
if gce.IsGCENotFoundError(err) {
505523
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.String(), err.Error())
506524
}
@@ -550,15 +568,11 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
550568
machineType := parseMachineType(instance.MachineType)
551569
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)
552570
}
553-
// Emit metric for error
554-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, metrics.GetDiskType(diskToPublish))
555571
return nil, status.Errorf(codes.Internal, "Failed to Attach: %v", err.Error())
556572
}
557573

558574
err = gceCS.CloudProvider.WaitForAttach(ctx, project, volKey, instanceZone, instanceName)
559575
if err != nil {
560-
// Emit metric for error
561-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerPublishVolume", err, metrics.GetDiskType(diskToPublish))
562576
return nil, status.Errorf(codes.Internal, "Errored during WaitForAttach: %v", err.Error())
563577
}
564578

@@ -567,12 +581,20 @@ func (gceCS *GCEControllerServer) executeControllerPublishVolume(ctx context.Con
567581
}
568582

569583
func (gceCS *GCEControllerServer) ControllerUnpublishVolume(ctx context.Context, req *csi.ControllerUnpublishVolumeRequest) (*csi.ControllerUnpublishVolumeResponse, error) {
570-
// Only valid requests will be queued
571-
_, _, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req)
584+
var err error
585+
diskTypeForMetric := ""
586+
defer func() {
587+
if err != nil {
588+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskTypeForMetric)
589+
}
590+
}()
591+
project, volKey, err := gceCS.validateControllerUnpublishVolumeRequest(ctx, req)
572592
if err != nil {
573593
return nil, err
574594
}
575-
595+
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
596+
diskTypeForMetric = metrics.GetDiskType(diskToUnpublish)
597+
// Only valid requests will be queued
576598
backoffId := gceCS.errorBackoff.backoffId(req.NodeId, req.VolumeId)
577599
if gceCS.errorBackoff.blocking(backoffId) {
578600
return nil, status.Errorf(codes.Unavailable, "ControllerUnpublish not permitted on node %q due to backoff condition", req.NodeId)
@@ -660,14 +682,8 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C
660682
klog.V(4).Infof("ControllerUnpublishVolume succeeded for disk %v from node %v. Already not attached.", volKey, nodeID)
661683
return &csi.ControllerUnpublishVolumeResponse{}, nil
662684
}
663-
diskToUnpublish, _ := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gce.GCEAPIVersionV1)
664-
if err != nil {
665-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, diskNotFound)
666-
common.LoggedError("Failed to getDisk: ", err)
667-
}
668685
err = gceCS.CloudProvider.DetachDisk(ctx, project, deviceName, instanceZone, instanceName)
669686
if err != nil {
670-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerUnpublishVolume", err, metrics.GetDiskType(diskToUnpublish))
671687
return nil, common.LoggedError("Failed to detach: ", err)
672688
}
673689

@@ -676,6 +692,13 @@ func (gceCS *GCEControllerServer) executeControllerUnpublishVolume(ctx context.C
676692
}
677693

678694
func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context, req *csi.ValidateVolumeCapabilitiesRequest) (*csi.ValidateVolumeCapabilitiesResponse, error) {
695+
var err error
696+
diskTypeForMetric := ""
697+
defer func() {
698+
if err != nil {
699+
gceCS.Metrics.RecordOperationErrorMetrics("ValidateVolumeCapabilities", err, diskTypeForMetric)
700+
}
701+
}()
679702
if req.GetVolumeCapabilities() == nil || len(req.GetVolumeCapabilities()) == 0 {
680703
return nil, status.Error(codes.InvalidArgument, "Volume Capabilities must be provided")
681704
}
@@ -687,7 +710,6 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
687710
if err != nil {
688711
return nil, status.Errorf(codes.InvalidArgument, "Volume ID is invalid: %v", err.Error())
689712
}
690-
691713
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
692714
if err != nil {
693715
if gce.IsGCENotFoundError(err) {
@@ -702,6 +724,7 @@ func (gceCS *GCEControllerServer) ValidateVolumeCapabilities(ctx context.Context
702724
defer gceCS.volumeLocks.Release(volumeID)
703725

704726
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
727+
diskTypeForMetric = metrics.GetDiskType(disk)
705728
if err != nil {
706729
if gce.IsGCENotFoundError(err) {
707730
return nil, status.Errorf(codes.NotFound, "Could not find disk %v: %v", volKey.Name, err.Error())
@@ -828,6 +851,13 @@ func (gceCS *GCEControllerServer) ControllerGetCapabilities(ctx context.Context,
828851
}
829852

830853
func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.CreateSnapshotRequest) (*csi.CreateSnapshotResponse, error) {
854+
var err error
855+
diskTypeForMetric := ""
856+
defer func() {
857+
if err != nil {
858+
gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskTypeForMetric)
859+
}
860+
}()
831861
// Validate arguments
832862
volumeID := req.GetSourceVolumeId()
833863
if len(req.Name) == 0 {
@@ -847,7 +877,8 @@ func (gceCS *GCEControllerServer) CreateSnapshot(ctx context.Context, req *csi.C
847877
defer gceCS.volumeLocks.Release(volumeID)
848878

849879
// Check if volume exists
850-
_, err = gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
880+
disk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
881+
diskTypeForMetric = metrics.GetDiskType(disk)
851882
if err != nil {
852883
if gce.IsGCENotFoundError(err) {
853884
return nil, status.Errorf(codes.NotFound, "CreateSnapshot could not find disk %v: %v", volKey.String(), err.Error())
@@ -885,10 +916,6 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
885916
if err != nil {
886917
return nil, status.Errorf(codes.InvalidArgument, "Invalid volume key: %v", volKey)
887918
}
888-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, gceCS.CloudProvider.GetDefaultProject(), volKey, gce.GCEAPIVersionV1)
889-
if err != nil {
890-
common.LoggedError("Failed to getDisk: ", err)
891-
}
892919
// Check if PD snapshot already exists
893920
var snapshot *compute.Snapshot
894921
snapshot, err = gceCS.CloudProvider.GetSnapshot(ctx, project, snapshotName)
@@ -900,17 +927,14 @@ func (gceCS *GCEControllerServer) createPDSnapshot(ctx context.Context, project
900927
snapshot, err = gceCS.CloudProvider.CreateSnapshot(ctx, project, volKey, snapshotName, snapshotParams)
901928
if err != nil {
902929
if gce.IsGCEError(err, "notFound") {
903-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, diskNotFound)
904930
return nil, status.Errorf(codes.NotFound, "Could not find volume with ID %v: %v", volKey.String(), err.Error())
905931
}
906-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, metrics.GetDiskType(sourceDisk))
907932
return nil, common.LoggedError("Failed to create snapshot: ", err)
908933
}
909934
}
910935

911936
err = gceCS.validateExistingSnapshot(snapshot, volKey)
912937
if err != nil {
913-
defer gceCS.Metrics.RecordOperationErrorMetrics("CreateSnapshot", err, metrics.GetDiskType(sourceDisk))
914938
return nil, status.Errorf(codes.AlreadyExists, "Error in creating snapshot: %v", err.Error())
915939
}
916940

@@ -1064,6 +1088,13 @@ func isCSISnapshotReady(status string) (bool, error) {
10641088
}
10651089

10661090
func (gceCS *GCEControllerServer) DeleteSnapshot(ctx context.Context, req *csi.DeleteSnapshotRequest) (*csi.DeleteSnapshotResponse, error) {
1091+
var err error
1092+
diskTypeForMetric := ""
1093+
defer func() {
1094+
if err != nil {
1095+
gceCS.Metrics.RecordOperationErrorMetrics("DeleteSnapshot", err, diskTypeForMetric)
1096+
}
1097+
}()
10671098
// Validate arguments
10681099
snapshotID := req.GetSnapshotId()
10691100
if len(snapshotID) == 0 {
@@ -1148,6 +1179,13 @@ func (gceCS *GCEControllerServer) ListSnapshots(ctx context.Context, req *csi.Li
11481179
}
11491180

11501181
func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, req *csi.ControllerExpandVolumeRequest) (*csi.ControllerExpandVolumeResponse, error) {
1182+
var err error
1183+
diskTypeForMetric := ""
1184+
defer func() {
1185+
if err != nil {
1186+
gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskTypeForMetric)
1187+
}
1188+
}()
11511189
volumeID := req.GetVolumeId()
11521190
if len(volumeID) == 0 {
11531191
return nil, status.Error(codes.InvalidArgument, "ControllerExpandVolume volume ID must be provided")
@@ -1162,22 +1200,17 @@ func (gceCS *GCEControllerServer) ControllerExpandVolume(ctx context.Context, re
11621200
if err != nil {
11631201
return nil, status.Errorf(codes.InvalidArgument, "ControllerExpandVolume Volume ID is invalid: %v", err.Error())
11641202
}
1165-
1203+
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1204+
diskTypeForMetric = metrics.GetDiskType(sourceDisk)
11661205
project, volKey, err = gceCS.CloudProvider.RepairUnderspecifiedVolumeKey(ctx, project, volKey)
11671206
if err != nil {
1168-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, diskNotFound)
11691207
if gce.IsGCENotFoundError(err) {
11701208
return nil, status.Errorf(codes.NotFound, "ControllerExpandVolume could not find volume with ID %v: %v", volumeID, err.Error())
11711209
}
11721210
return nil, common.LoggedError("ControllerExpandVolume error repairing underspecified volume key: ", err)
11731211
}
1174-
sourceDisk, err := gceCS.CloudProvider.GetDisk(ctx, project, volKey, gce.GCEAPIVersionV1)
1175-
if err != nil {
1176-
common.LoggedError("Failed to getDisk: ", err)
1177-
}
11781212
resizedGb, err := gceCS.CloudProvider.ResizeDisk(ctx, project, volKey, reqBytes)
11791213
if err != nil {
1180-
defer gceCS.Metrics.RecordOperationErrorMetrics("ControllerExpandVolume", err, metrics.GetDiskType(sourceDisk))
11811214
return nil, common.LoggedError("ControllerExpandVolume failed to resize disk: ", err)
11821215
}
11831216

0 commit comments

Comments
 (0)