From 2a48f1ee021e873628f92337b9eaee13d5798375 Mon Sep 17 00:00:00 2001 From: Eric Lin Date: Mon, 27 Nov 2023 13:10:24 +0000 Subject: [PATCH] leaderelection: Instrument for when slowpath is exercised Signed-off-by: Eric Lin Kubernetes-commit: 1e54c050936be1a1e3e5758718ebca86096dbaea --- tools/leaderelection/leaderelection_test.go | 2 ++ tools/leaderelection/metrics.go | 30 ++++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/tools/leaderelection/leaderelection_test.go b/tools/leaderelection/leaderelection_test.go index 8c94b35a..de481e0a 100644 --- a/tools/leaderelection/leaderelection_test.go +++ b/tools/leaderelection/leaderelection_test.go @@ -315,6 +315,7 @@ func testTryAcquireOrRenew(t *testing.T, objectType string) { observedRawRecord: observedRawRecord, observedTime: test.observedTime, clock: clock, + metrics: globalMetricsFactory.newLeaderMetrics(), } if test.expectSuccess != le.tryAcquireOrRenew(context.Background()) { if test.retryAfter != 0 { @@ -491,6 +492,7 @@ func testReleaseLease(t *testing.T, objectType string) { observedRawRecord: observedRawRecord, observedTime: test.observedTime, clock: clock.RealClock{}, + metrics: globalMetricsFactory.newLeaderMetrics(), } if !le.tryAcquireOrRenew(context.Background()) { t.Errorf("unexpected result of tryAcquireOrRenew: [succeeded=%v]", true) diff --git a/tools/leaderelection/metrics.go b/tools/leaderelection/metrics.go index 65917bf8..7438345f 100644 --- a/tools/leaderelection/metrics.go +++ b/tools/leaderelection/metrics.go @@ -26,24 +26,26 @@ import ( type leaderMetricsAdapter interface { leaderOn(name string) leaderOff(name string) + slowpathExercised(name string) } -// GaugeMetric represents a single numerical value that can arbitrarily go up -// and down. -type SwitchMetric interface { +// LeaderMetric instruments metrics used in leader election. +type LeaderMetric interface { On(name string) Off(name string) + SlowpathExercised(name string) } type noopMetric struct{} -func (noopMetric) On(name string) {} -func (noopMetric) Off(name string) {} +func (noopMetric) On(name string) {} +func (noopMetric) Off(name string) {} +func (noopMetric) SlowpathExercised(name string) {} // defaultLeaderMetrics expects the caller to lock before setting any metrics. type defaultLeaderMetrics struct { // leader's value indicates if the current process is the owner of name lease - leader SwitchMetric + leader LeaderMetric } func (m *defaultLeaderMetrics) leaderOn(name string) { @@ -60,19 +62,27 @@ func (m *defaultLeaderMetrics) leaderOff(name string) { m.leader.Off(name) } +func (m *defaultLeaderMetrics) slowpathExercised(name string) { + if m == nil { + return + } + m.leader.SlowpathExercised(name) +} + type noMetrics struct{} -func (noMetrics) leaderOn(name string) {} -func (noMetrics) leaderOff(name string) {} +func (noMetrics) leaderOn(name string) {} +func (noMetrics) leaderOff(name string) {} +func (noMetrics) slowpathExercised(name string) {} // MetricsProvider generates various metrics used by the leader election. type MetricsProvider interface { - NewLeaderMetric() SwitchMetric + NewLeaderMetric() LeaderMetric } type noopMetricsProvider struct{} -func (_ noopMetricsProvider) NewLeaderMetric() SwitchMetric { +func (noopMetricsProvider) NewLeaderMetric() LeaderMetric { return noopMetric{} }