Skip to content

Commit a1565f3

Browse files
authored
Merge pull request #1116 from shvbsle/tagging_delay_metrics
feat: add tagging controller delays and work queue size metrics
2 parents 24c855a + 022cac3 commit a1565f3

3 files changed

Lines changed: 90 additions & 0 deletions

File tree

pkg/controllers/tagging/metrics.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ import (
2020
"k8s.io/component-base/metrics/legacyregistry"
2121
)
2222

23+
const (
24+
metricsSubsystem = "tagging_controller"
25+
)
26+
2327
var register sync.Once
2428

2529
var (
@@ -30,12 +34,23 @@ var (
3034
StabilityLevel: metrics.ALPHA,
3135
},
3236
[]string{"error_type", "instance_id"})
37+
38+
initialNodeTaggingDelay = metrics.NewHistogram(
39+
&metrics.HistogramOpts{
40+
Subsystem: metricsSubsystem,
41+
Name: "inital_node_tagging_delay_seconds",
42+
Help: "Latency (in seconds) between node creation and its first successful tagging by TaggingController.",
43+
Buckets: metrics.ExponentialBuckets(1, 4, 6), // 1s -> ~17m
44+
StabilityLevel: metrics.ALPHA,
45+
},
46+
)
3347
)
3448

3549
// registerMetrics registers tagging-controller metrics.
3650
func registerMetrics() {
3751
register.Do(func() {
3852
legacyregistry.MustRegister(workItemError)
53+
legacyregistry.MustRegister(initialNodeTaggingDelay)
3954
})
4055
}
4156

pkg/controllers/tagging/tagging_controller.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,10 @@ func (tc *Controller) tagEc2Instance(node *v1.Node) error {
347347

348348
klog.Infof("Successfully labeled node %s with %v.", node.GetName(), labels)
349349

350+
if tc.isInitialTag(node) {
351+
initialNodeTaggingDelay.Observe(time.Since(node.CreationTimestamp.Time).Seconds())
352+
}
353+
350354
return nil
351355
}
352356

@@ -403,6 +407,11 @@ func (tc *Controller) enqueueNode(node *v1.Node, action string) {
403407
}
404408
}
405409

410+
func (tc *Controller) isInitialTag(node *v1.Node) bool {
411+
_, ok := node.Labels[taggingControllerLabelKey]
412+
return !ok
413+
}
414+
406415
func (tc *Controller) isTaggingRequired(node *v1.Node) bool {
407416
if node.Labels == nil {
408417
return true

pkg/controllers/tagging/tagging_controller_test.go

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,3 +347,69 @@ func syncNodeStore(nodeinformer coreinformers.NodeInformer, f *fake.Clientset) e
347347
}
348348
return nodeinformer.Informer().GetStore().Replace(newElems, "newRV")
349349
}
350+
351+
func Test_isInitialTag(t *testing.T) {
352+
testcases := []struct {
353+
name string
354+
node *v1.Node
355+
expectedValue bool
356+
}{
357+
{
358+
name: "node0 is recently created with no labels and will be tagged for the first time",
359+
node: &v1.Node{
360+
ObjectMeta: metav1.ObjectMeta{
361+
Name: "node0",
362+
},
363+
},
364+
expectedValue: true,
365+
},
366+
{
367+
name: "node0 has other labels but no taggingControllerLabelKey and will be tagged for the first time",
368+
node: &v1.Node{
369+
ObjectMeta: metav1.ObjectMeta{
370+
Name: "node0",
371+
Labels: map[string]string{
372+
"some-other-label": "value",
373+
},
374+
},
375+
},
376+
expectedValue: true,
377+
},
378+
{
379+
name: "node0 with taggingControllerLabelKey implies that the node was already tagged",
380+
node: &v1.Node{
381+
ObjectMeta: metav1.ObjectMeta{
382+
Name: "node0",
383+
Labels: map[string]string{
384+
taggingControllerLabelKey: "9767c4972ba72e87ab553bad2afde741", // MD5 for key1=value1
385+
},
386+
},
387+
},
388+
expectedValue: false,
389+
},
390+
{
391+
name: "node0 with taggingControllerLabelKey and other labels should not be initial tag",
392+
node: &v1.Node{
393+
ObjectMeta: metav1.ObjectMeta{
394+
Name: "node0",
395+
Labels: map[string]string{
396+
taggingControllerLabelKey: "9767c4972ba72e87ab553bad2afde741", // MD5 for key1=value1
397+
"some-other-label": "value",
398+
},
399+
},
400+
},
401+
expectedValue: false,
402+
},
403+
}
404+
405+
tc := &Controller{}
406+
407+
for _, testcase := range testcases {
408+
t.Run(testcase.name, func(t *testing.T) {
409+
result := tc.isInitialTag(testcase.node)
410+
if result != testcase.expectedValue {
411+
t.Errorf("isInitialTag() = %v, want %v", result, testcase.expectedValue)
412+
}
413+
})
414+
}
415+
}

0 commit comments

Comments
 (0)