Skip to content

Commit 071b076

Browse files
committed
Improve metrics testability
1 parent 0bcb2bb commit 071b076

File tree

5 files changed

+942
-589
lines changed

5 files changed

+942
-589
lines changed

cluster-autoscaler/core/scaledown/nodeevaltracker/max_node_skip_eval_time.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,23 @@ import (
2222
"k8s.io/autoscaler/cluster-autoscaler/metrics"
2323
)
2424

25+
type metricObserver interface {
26+
ObserveMaxNodeSkipEvalDurationSeconds(duration time.Duration)
27+
}
28+
2529
// MaxNodeSkipEvalTime is a time tracker for the biggest evaluation time of a node during ScaleDown
2630
type MaxNodeSkipEvalTime struct {
2731
// lastEvalTime is the time of previous currentlyUnneededNodeNames parsing
2832
lastEvalTime time.Time
2933
// nodeNamesWithTimeStamps is maps of nodeNames with their time of last successful evaluation
3034
nodeNamesWithTimeStamps map[string]time.Time
35+
36+
metrics metricObserver
3137
}
3238

3339
// NewMaxNodeSkipEvalTime returns LongestNodeScaleDownEvalTime with lastEvalTime set to currentTime
3440
func NewMaxNodeSkipEvalTime(currentTime time.Time) *MaxNodeSkipEvalTime {
35-
return &MaxNodeSkipEvalTime{lastEvalTime: currentTime}
41+
return &MaxNodeSkipEvalTime{lastEvalTime: currentTime, metrics: metrics.DefaultMetrics}
3642
}
3743

3844
// Retrieves the time of the last evaluation of a node.
@@ -65,6 +71,6 @@ func (l *MaxNodeSkipEvalTime) Update(nodeNames []string, currentTime time.Time)
6571
l.lastEvalTime = currentTime
6672
minimumTime := l.getMin()
6773
longestDuration := currentTime.Sub(minimumTime)
68-
metrics.ObserveMaxNodeSkipEvalDurationSeconds(longestDuration)
74+
l.metrics.ObserveMaxNodeSkipEvalDurationSeconds(longestDuration)
6975
return longestDuration
7076
}

cluster-autoscaler/core/scaledown/nodeevaltracker/max_node_skip_eval_time_test.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,21 @@ import (
2121
"time"
2222

2323
"github.com/stretchr/testify/assert"
24+
"github.com/stretchr/testify/mock"
2425
)
2526

27+
type mockMetrics struct {
28+
mock.Mock
29+
}
30+
31+
func (m *mockMetrics) ObserveMaxNodeSkipEvalDurationSeconds(duration time.Duration) {
32+
m.Called(duration)
33+
}
34+
35+
func newMaxNodeSkipEvalTime(currentTime time.Time, metrics metricObserver) *MaxNodeSkipEvalTime {
36+
return &MaxNodeSkipEvalTime{lastEvalTime: currentTime, metrics: metrics}
37+
}
38+
2639
func TestMaxNodeSkipEvalTime(t *testing.T) {
2740
type testCase struct {
2841
name string
@@ -66,11 +79,15 @@ func TestMaxNodeSkipEvalTime(t *testing.T) {
6679
t.Run(tc.name, func(t *testing.T) {
6780
t.Parallel()
6881
timestamp := start
69-
maxNodeSkipEvalTime := NewMaxNodeSkipEvalTime(start)
82+
mockMetrics := &mockMetrics{}
83+
maxNodeSkipEvalTime := newMaxNodeSkipEvalTime(start, mockMetrics)
84+
mockMetrics.On("ObserveMaxNodeSkipEvalDurationSeconds", mock.Anything).Return()
85+
7086
for i := 0; i < len(tc.unprocessedNodes); i++ {
7187
timestamp = timestamp.Add(1 * time.Second)
7288
assert.Equal(t, time.Duration(tc.wantMaxSkipEvalTimeSeconds[i])*time.Second, maxNodeSkipEvalTime.Update(tc.unprocessedNodes[i], timestamp))
7389
assert.Equal(t, len(tc.unprocessedNodes[i]), len(maxNodeSkipEvalTime.nodeNamesWithTimeStamps))
90+
mockMetrics.AssertCalled(t, "ObserveMaxNodeSkipEvalDurationSeconds", time.Duration(tc.wantMaxSkipEvalTimeSeconds[i])*time.Second)
7491
}
7592
})
7693
}

0 commit comments

Comments
 (0)