Merge pull request #107006 from gnufied/add-total-mount-time-metrics

Add metric for reporting total end-to-end mount time
This commit is contained in:
Kubernetes Prow Robot 2022-01-07 06:19:31 -08:00 committed by GitHub
commit d1a5513cb0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 0 deletions

View File

@ -23,6 +23,7 @@ package cache
import (
"fmt"
"sync"
"time"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
@ -207,6 +208,8 @@ type podToMount struct {
// volume claim, this contains the volume.Spec.Name() of the persistent
// volume claim
outerVolumeSpecName string
// mountRequestTime stores time at which mount was requested
mountRequestTime time.Time
}
const (
@ -281,6 +284,11 @@ func (dsw *desiredStateOfWorld) AddPodToVolume(
desiredSizeLimit: sizeLimit,
}
}
oldPodMount, ok := dsw.volumesToMount[volumeName].podsToMount[podName]
mountRequestTime := time.Now()
if ok && !volumePlugin.RequiresRemount(volumeSpec) {
mountRequestTime = oldPodMount.mountRequestTime
}
// Create new podToMount object. If it already exists, it is refreshed with
// updated values (this is required for volumes that require remounting on
@ -290,6 +298,7 @@ func (dsw *desiredStateOfWorld) AddPodToVolume(
pod: pod,
volumeSpec: volumeSpec,
outerVolumeSpecName: outerVolumeSpecName,
mountRequestTime: mountRequestTime,
}
return volumeName, nil
}
@ -407,6 +416,7 @@ func (dsw *desiredStateOfWorld) GetVolumesToMount() []VolumeToMount {
OuterVolumeSpecName: podObj.outerVolumeSpecName,
VolumeGidValue: volumeObj.volumeGidValue,
ReportedInUse: volumeObj.reportedInUse,
MountRequestTime: podObj.mountRequestTime,
DesiredSizeLimit: volumeObj.desiredSizeLimit}})
}
}

View File

@ -388,6 +388,9 @@ type VolumeToMount struct {
// DesiredSizeLimit indicates the desired upper bound on the size of the volume
// (if so implemented)
DesiredSizeLimit *resource.Quantity
// time at which volume was requested to be mounted
MountRequestTime time.Time
}
// DeviceMountState represents device mount state in a global path.

View File

@ -778,6 +778,12 @@ func (og *operationGenerator) GenerateMountVolumeFunc(
}
}
// record total time it takes to mount a volume. This is end to end time that includes waiting for volume to attach, node to be update
// plugin call to succeed
mountRequestTime := volumeToMount.MountRequestTime
totalTimeTaken := time.Since(mountRequestTime).Seconds()
util.RecordOperationLatencyMetric(util.GetFullQualifiedPluginNameForVolume(volumePluginName, volumeToMount.VolumeSpec), "overall_volume_mount", totalTimeTaken)
markVolMountedErr := actualStateOfWorld.MarkVolumeAsMounted(markOpts)
if markVolMountedErr != nil {
// On failure, return error. Caller will log and retry.