Skip to content

Commit 05bf8b8

Browse files
jigisha620DerekFrank
authored andcommitted
chore: Update pod metrics when pod is completed (kubernetes-sigs#2259)
1 parent ccf36cd commit 05bf8b8

File tree

7 files changed

+144
-93
lines changed

7 files changed

+144
-93
lines changed

pkg/controllers/metrics/pod/controller.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import (
3939
"sigs.k8s.io/karpenter/pkg/controllers/state"
4040
"sigs.k8s.io/karpenter/pkg/metrics"
4141
"sigs.k8s.io/karpenter/pkg/operator/injection"
42+
podutils "sigs.k8s.io/karpenter/pkg/utils/pod"
4243
)
4344

4445
const (
@@ -304,28 +305,11 @@ func (c *Controller) recordPodStartupMetric(pod *corev1.Pod, schedulableTime tim
304305
c.pendingPods.Insert(key)
305306
return
306307
}
307-
cond, ok := lo.Find(pod.Status.Conditions, func(c corev1.PodCondition) bool {
308-
return c.Type == corev1.PodReady
308+
cond, ready := lo.Find(pod.Status.Conditions, func(c corev1.PodCondition) bool {
309+
return c.Type == corev1.PodReady && c.Status == corev1.ConditionTrue
309310
})
310311
if c.pendingPods.Has(key) {
311-
if !ok || cond.Status != corev1.ConditionTrue {
312-
PodUnstartedTimeSeconds.Set(time.Since(pod.CreationTimestamp.Time).Seconds(), map[string]string{
313-
podName: pod.Name,
314-
podNamespace: pod.Namespace,
315-
})
316-
if !schedulableTime.IsZero() {
317-
PodProvisioningUnstartedTimeSeconds.Set(time.Since(schedulableTime).Seconds(), map[string]string{
318-
podName: pod.Name,
319-
podNamespace: pod.Namespace,
320-
})
321-
} else {
322-
// Idempotently delete the unstarted_time_seconds metric if the schedulable time is zero
323-
PodProvisioningUnstartedTimeSeconds.Delete(map[string]string{
324-
podName: pod.Name,
325-
podNamespace: pod.Namespace,
326-
})
327-
}
328-
} else {
312+
if ready || podutils.IsTerminal(pod) {
329313
// Delete the unstarted metric since the pod is now started
330314
PodUnstartedTimeSeconds.Delete(map[string]string{
331315
podName: pod.Name,
@@ -342,6 +326,23 @@ func (c *Controller) recordPodStartupMetric(pod *corev1.Pod, schedulableTime tim
342326
c.pendingPods.Delete(key)
343327
// Clear cluster state's representation of these pods as we don't need to keep track of them anymore
344328
c.cluster.ClearPodSchedulingMappings(client.ObjectKeyFromObject(pod))
329+
} else {
330+
PodUnstartedTimeSeconds.Set(time.Since(pod.CreationTimestamp.Time).Seconds(), map[string]string{
331+
podName: pod.Name,
332+
podNamespace: pod.Namespace,
333+
})
334+
if !schedulableTime.IsZero() {
335+
PodProvisioningUnstartedTimeSeconds.Set(time.Since(schedulableTime).Seconds(), map[string]string{
336+
podName: pod.Name,
337+
podNamespace: pod.Namespace,
338+
})
339+
} else {
340+
// Idempotently delete the unstarted_time_seconds metric if the schedulable time is zero
341+
PodProvisioningUnstartedTimeSeconds.Delete(map[string]string{
342+
podName: pod.Name,
343+
podNamespace: pod.Namespace,
344+
})
345+
}
345346
}
346347
}
347348
}

pkg/controllers/metrics/pod/suite_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,92 @@ var _ = Describe("Pod Metrics", func() {
248248
_, found = FindMetricWithLabelValues("karpenter_pods_provisioning_startup_duration_seconds", nil)
249249
Expect(found).To(BeTrue())
250250
})
251+
It("should update the pod startup and unstarted time metrics when the pod has succeeded", func() {
252+
p := test.Pod()
253+
p.Status.Phase = corev1.PodPending
254+
255+
fakeClock.Step(1 * time.Hour)
256+
cluster.MarkPodSchedulingDecisions(ctx, map[*corev1.Pod]error{}, map[string][]*corev1.Pod{"n1": {p}}, map[string][]*corev1.Pod{"nc1": {p}})
257+
ExpectApplied(ctx, env.Client, p)
258+
ExpectReconcileSucceeded(ctx, podController, client.ObjectKeyFromObject(p)) //This will add pod to pending pods and unscheduled pods set
259+
_, found := FindMetricWithLabelValues("karpenter_pods_unstarted_time_seconds", map[string]string{
260+
"name": p.GetName(),
261+
"namespace": p.GetNamespace(),
262+
})
263+
Expect(found).To(BeTrue())
264+
_, found = FindMetricWithLabelValues("karpenter_pods_provisioning_unstarted_time_seconds", map[string]string{
265+
"name": p.GetName(),
266+
"namespace": p.GetNamespace(),
267+
})
268+
Expect(found).To(BeTrue())
269+
270+
// Pod has now succeeded but readiness condition is set to false because the pod is now completed
271+
p.Status.Phase = corev1.PodSucceeded
272+
p.Status.Conditions = []corev1.PodCondition{
273+
{Type: corev1.PodReady, Status: corev1.ConditionFalse, LastTransitionTime: metav1.Now()},
274+
{Type: corev1.PodScheduled, Status: corev1.ConditionTrue, LastTransitionTime: metav1.Now()},
275+
}
276+
ExpectApplied(ctx, env.Client, p)
277+
ExpectReconcileSucceeded(ctx, podController, client.ObjectKeyFromObject(p)) //This will check if the pod was scheduled and completed
278+
_, found = FindMetricWithLabelValues("karpenter_pods_unstarted_time_seconds", map[string]string{
279+
"name": p.GetName(),
280+
"namespace": p.GetNamespace(),
281+
})
282+
Expect(found).To(BeFalse())
283+
_, found = FindMetricWithLabelValues("karpenter_pods_provisioning_unstarted_time_seconds", map[string]string{
284+
"name": p.GetName(),
285+
"namespace": p.GetNamespace(),
286+
})
287+
Expect(found).To(BeFalse())
288+
289+
_, found = FindMetricWithLabelValues("karpenter_pods_startup_duration_seconds", nil)
290+
Expect(found).To(BeTrue())
291+
_, found = FindMetricWithLabelValues("karpenter_pods_provisioning_startup_duration_seconds", nil)
292+
Expect(found).To(BeTrue())
293+
})
294+
It("should update the pod startup and unstarted time metrics when the pod has failed", func() {
295+
p := test.Pod()
296+
p.Status.Phase = corev1.PodPending
297+
298+
fakeClock.Step(1 * time.Hour)
299+
cluster.MarkPodSchedulingDecisions(ctx, map[*corev1.Pod]error{}, map[string][]*corev1.Pod{"n1": {p}}, map[string][]*corev1.Pod{"nc1": {p}})
300+
ExpectApplied(ctx, env.Client, p)
301+
ExpectReconcileSucceeded(ctx, podController, client.ObjectKeyFromObject(p)) //This will add pod to pending pods and unscheduled pods set
302+
_, found := FindMetricWithLabelValues("karpenter_pods_unstarted_time_seconds", map[string]string{
303+
"name": p.GetName(),
304+
"namespace": p.GetNamespace(),
305+
})
306+
Expect(found).To(BeTrue())
307+
_, found = FindMetricWithLabelValues("karpenter_pods_provisioning_unstarted_time_seconds", map[string]string{
308+
"name": p.GetName(),
309+
"namespace": p.GetNamespace(),
310+
})
311+
Expect(found).To(BeTrue())
312+
313+
// Pod has now failed and readiness condition is set to false
314+
p.Status.Phase = corev1.PodFailed
315+
p.Status.Conditions = []corev1.PodCondition{
316+
{Type: corev1.PodReady, Status: corev1.ConditionFalse, LastTransitionTime: metav1.Now()},
317+
{Type: corev1.PodScheduled, Status: corev1.ConditionTrue, LastTransitionTime: metav1.Now()},
318+
}
319+
ExpectApplied(ctx, env.Client, p)
320+
ExpectReconcileSucceeded(ctx, podController, client.ObjectKeyFromObject(p)) //This will check if the pod was scheduled and completed
321+
_, found = FindMetricWithLabelValues("karpenter_pods_unstarted_time_seconds", map[string]string{
322+
"name": p.GetName(),
323+
"namespace": p.GetNamespace(),
324+
})
325+
Expect(found).To(BeFalse())
326+
_, found = FindMetricWithLabelValues("karpenter_pods_provisioning_unstarted_time_seconds", map[string]string{
327+
"name": p.GetName(),
328+
"namespace": p.GetNamespace(),
329+
})
330+
Expect(found).To(BeFalse())
331+
332+
_, found = FindMetricWithLabelValues("karpenter_pods_startup_duration_seconds", nil)
333+
Expect(found).To(BeTrue())
334+
_, found = FindMetricWithLabelValues("karpenter_pods_provisioning_startup_duration_seconds", nil)
335+
Expect(found).To(BeTrue())
336+
})
251337
It("should create and delete provisioning undecided metrics based on scheduling simulatinos", func() {
252338
p := test.Pod()
253339
p.Status.Phase = corev1.PodPending

pkg/controllers/node/termination/controller.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,17 +132,18 @@ func (c *Controller) finalize(ctx context.Context, node *corev1.Node) (reconcile
132132
}
133133
return reconcile.Result{}, serrors.Wrap(fmt.Errorf("tainting node, %w", err), "taint", pretty.Taint(v1.DisruptedNoScheduleTaint))
134134
}
135-
136135
for _, f := range []terminationFunc{
137136
c.awaitDrain,
138137
c.awaitVolumeDetachment,
139138
c.awaitInstanceTermination,
140139
} {
141140
result, err := f(ctx, nodeClaim, node, nodeTerminationTime)
141+
142142
if result != nil || err != nil {
143143
return *result, err
144144
}
145145
}
146+
146147
if err := c.removeFinalizer(ctx, node); err != nil {
147148
return reconcile.Result{}, err
148149
}

pkg/controllers/node/termination/suite_test.go

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package termination_test
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"sync"
2223
"testing"
2324
"time"
@@ -89,6 +90,7 @@ var _ = Describe("Termination", func() {
8990

9091
nodePool = test.NodePool()
9192
nodeClaim, node = test.NodeClaimAndNode(v1.NodeClaim{ObjectMeta: metav1.ObjectMeta{Finalizers: []string{v1.TerminationFinalizer}}})
93+
9294
node.Labels[v1.NodePoolLabelKey] = test.NodePool().Name
9395
cloudProvider.CreatedNodeClaims[node.Spec.ProviderID] = nodeClaim
9496
})
@@ -189,6 +191,8 @@ var _ = Describe("Termination", func() {
189191
Expect(env.Client.Delete(ctx, node)).To(Succeed())
190192
// We only reconcile once since this label should be applied before draining the node
191193
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node))
194+
ExpectObjectReconcileFailed(ctx, env.Client, queue, pod)
195+
192196
node = ExpectNodeExists(ctx, env.Client, node.Name)
193197
Expect(node.Labels[corev1.LabelNodeExcludeBalancers]).Should(Equal("karpenter"))
194198
})
@@ -200,27 +204,29 @@ var _ = Describe("Termination", func() {
200204
ObjectMeta: metav1.ObjectMeta{OwnerReferences: defaultOwnerRefs},
201205
})
202206
ExpectApplied(ctx, env.Client, node, nodeClaim, podEvict, podSkip)
207+
ExpectMakeNodesReady(ctx, env.Client, node) // Remove the not-ready taint
203208

204209
// Trigger Termination Controller
205210
Expect(env.Client.Delete(ctx, node)).To(Succeed())
206211
node = ExpectNodeExists(ctx, env.Client, node.Name)
207-
ExpectObjectReconciled(ctx, env.Client, terminationController, node)
208212
Expect(queue.Has(podSkip)).To(BeFalse())
209213
ExpectObjectReconciled(ctx, env.Client, queue, podEvict)
210214

211215
// Expect node to exist and be draining
216+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
212217
ExpectNodeWithNodeClaimDraining(env.Client, node.Name)
213218

214219
// Expect podEvict to be evicting, and delete it
215220
EventuallyExpectTerminating(ctx, env.Client, podEvict)
216221
ExpectDeleted(ctx, env.Client, podEvict)
222+
ExpectObjectReconciled(ctx, env.Client, queue, podSkip)
217223

218224
// Reconcile to delete node
219225
node = ExpectNodeExists(ctx, env.Client, node.Name)
220-
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
221226
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // VolumeDetachment
222227
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationInitiation
223-
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
228+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
229+
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // FinalizerRemoval
224230
ExpectNotFound(ctx, env.Client, node)
225231
})
226232
It("should not evict pods that tolerate karpenter disruption taint with exists operator", func() {
@@ -231,15 +237,16 @@ var _ = Describe("Termination", func() {
231237
ObjectMeta: metav1.ObjectMeta{OwnerReferences: defaultOwnerRefs},
232238
})
233239
ExpectApplied(ctx, env.Client, node, nodeClaim, podEvict, podSkip)
240+
ExpectMakeNodesReady(ctx, env.Client, node) // Remove the not-ready taint
234241

235242
// Trigger Termination Controller
236243
Expect(env.Client.Delete(ctx, node)).To(Succeed())
237244
node = ExpectNodeExists(ctx, env.Client, node.Name)
238-
ExpectObjectReconciled(ctx, env.Client, terminationController, node)
239245
Expect(queue.Has(podSkip)).To(BeFalse())
240246
ExpectObjectReconciled(ctx, env.Client, queue, podEvict)
241247

242248
// Expect node to exist and be draining
249+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
243250
ExpectNodeWithNodeClaimDraining(env.Client, node.Name)
244251

245252
// Expect podEvict to be evicting, and delete it
@@ -250,10 +257,10 @@ var _ = Describe("Termination", func() {
250257

251258
// Reconcile to delete node
252259
node = ExpectNodeExists(ctx, env.Client, node.Name)
253-
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
254260
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // VolumeDetachment
255261
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationInitiation
256-
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
262+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
263+
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // FinalizerRemoval
257264
ExpectNotFound(ctx, env.Client, node)
258265
})
259266
It("should evict pods that tolerate the node.kubernetes.io/unschedulable taint", func() {
@@ -271,6 +278,7 @@ var _ = Describe("Termination", func() {
271278
ExpectObjectReconciled(ctx, env.Client, queue, podEvict)
272279

273280
// Expect node to exist and be draining
281+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
274282
ExpectNodeWithNodeClaimDraining(env.Client, node.Name)
275283

276284
// Expect podEvict to be evicting, and delete it
@@ -279,10 +287,10 @@ var _ = Describe("Termination", func() {
279287

280288
// Reconcile to delete node
281289
node = ExpectNodeExists(ctx, env.Client, node.Name)
282-
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
283290
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // VolumeDetachment
284291
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationInitiation
285-
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
292+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
293+
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // FinalizerRemoval
286294
ExpectNotFound(ctx, env.Client, node)
287295
})
288296
It("should delete nodes that have pods without an ownerRef", func() {
@@ -303,17 +311,18 @@ var _ = Describe("Termination", func() {
303311
EventuallyExpectTerminating(ctx, env.Client, pod)
304312

305313
// Expect node to exist and be draining
314+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
306315
ExpectNodeWithNodeClaimDraining(env.Client, node.Name)
307316

308317
// Delete no owner refs pod to simulate successful eviction
309318
ExpectDeleted(ctx, env.Client, pod)
310319

311320
// Reconcile node to evict pod and delete node
312321
node = ExpectNodeExists(ctx, env.Client, node.Name)
313-
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
314322
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // VolumeDetachment
315323
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationInitiation
316-
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
324+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
325+
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // FinalizerRemoval
317326
ExpectNotFound(ctx, env.Client, node)
318327
})
319328
It("should delete nodes with terminal pods", func() {
@@ -367,7 +376,7 @@ var _ = Describe("Termination", func() {
367376
Expect(queue.Has(podNoEvict)).To(BeTrue())
368377

369378
// Attempt to evict the pod, but fail to do so
370-
ExpectObjectReconciled(ctx, env.Client, queue, podNoEvict)
379+
ExpectObjectReconcileFailed(ctx, env.Client, queue, podNoEvict)
371380

372381
// Expect podNoEvict to fail eviction due to PDB, and be retried
373382
Expect(queue.Has(podNoEvict)).To(BeTrue())
@@ -378,10 +387,10 @@ var _ = Describe("Termination", func() {
378387

379388
// Reconcile to delete node
380389
node = ExpectNodeExists(ctx, env.Client, node.Name)
381-
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // DrainValidation
382390
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // VolumeDetachment
383391
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationInitiation
384-
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
392+
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // InstanceTerminationValidation
393+
ExpectNotRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // Finalizer Removal
385394
ExpectNotFound(ctx, env.Client, node)
386395
})
387396
It("should evict pods in order and wait until pods are fully deleted", func() {
@@ -432,6 +441,7 @@ var _ = Describe("Termination", func() {
432441
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node))
433442
ExpectNodeWithNodeClaimDraining(env.Client, node.Name)
434443
for _, pod := range podGroup {
444+
Expect(queue.Has(pod)).To(BeTrue())
435445
ExpectObjectReconciled(ctx, env.Client, queue, pod)
436446
}
437447
// Start draining the pod group, but don't complete it yet
@@ -440,7 +450,7 @@ var _ = Describe("Termination", func() {
440450
// Look at the next pod group and ensure that none of the pods have started terminating on it
441451
if i != len(podGroups)-1 {
442452
for _, pod := range podGroups[i+1] {
443-
ExpectObjectReconciled(ctx, env.Client, queue, pod)
453+
Expect(queue.Has(pod)).To(BeFalse())
444454
}
445455
ConsistentlyExpectNotTerminating(ctx, env.Client, lo.Map(podGroups[i+1], func(p *corev1.Pod, _ int) client.Object { return p })...)
446456
}
@@ -518,6 +528,7 @@ var _ = Describe("Termination", func() {
518528

519529
// Expect mirror pod to not be queued for eviction
520530
Expect(queue.Has(podNoEvict)).To(BeFalse())
531+
ExpectObjectReconciled(ctx, env.Client, queue, podEvict)
521532

522533
// Expect podEvict to be enqueued for eviction then be successful
523534
EventuallyExpectTerminating(ctx, env.Client, podEvict)
@@ -712,8 +723,8 @@ var _ = Describe("Termination", func() {
712723
})
713724
ExpectApplied(ctx, env.Client, node, pod)
714725

715-
// Trigger eviction queue with the pod key still in it
716-
ExpectObjectReconciled(ctx, env.Client, queue, pod)
726+
// Trigger eviction queue with the old pod key still in it
727+
queue.Add(pod)
717728

718729
Consistently(func(g Gomega) {
719730
g.Expect(env.Client.Get(ctx, client.ObjectKeyFromObject(pod), pod)).To(Succeed())
@@ -920,29 +931,6 @@ var _ = Describe("Termination", func() {
920931
Expect(ok).To(BeTrue())
921932
Expect(lo.FromPtr(m.GetHistogram().SampleCount)).To(BeNumerically("==", 1))
922933
})
923-
It("should update the eviction queueDepth metric when reconciling pods", func() {
924-
minAvailable := intstr.FromInt32(0)
925-
labelSelector := map[string]string{test.RandomName(): test.RandomName()}
926-
pdb := test.PodDisruptionBudget(test.PDBOptions{
927-
Labels: labelSelector,
928-
// Don't let any pod evict
929-
MinAvailable: &minAvailable,
930-
})
931-
ExpectApplied(ctx, env.Client, pdb, node, nodeClaim)
932-
pods := test.Pods(5, test.PodOptions{NodeName: node.Name, ObjectMeta: metav1.ObjectMeta{
933-
OwnerReferences: defaultOwnerRefs,
934-
Labels: labelSelector,
935-
}})
936-
ExpectApplied(ctx, env.Client, lo.Map(pods, func(p *corev1.Pod, _ int) client.Object { return p })...)
937-
938-
wqDepthBefore, _ := FindMetricWithLabelValues("workqueue_adds_total", map[string]string{"name": "eviction.workqueue"})
939-
Expect(env.Client.Delete(ctx, node)).To(Succeed())
940-
node = ExpectNodeExists(ctx, env.Client, node.Name)
941-
ExpectRequeued(ExpectObjectReconciled(ctx, env.Client, terminationController, node)) // Drain
942-
wqDepthAfter, ok := FindMetricWithLabelValues("workqueue_adds_total", map[string]string{"name": "eviction.workqueue"})
943-
Expect(ok).To(BeTrue())
944-
Expect(lo.FromPtr(wqDepthAfter.GetCounter().Value) - lo.FromPtr(wqDepthBefore.GetCounter().Value)).To(BeNumerically("==", 5))
945-
})
946934
})
947935
})
948936

0 commit comments

Comments
 (0)