Skip to content

Commit a25165b

Browse files
authored
Provide AutoScalingGroupName for webhook notifications (#384)
1 parent e40b55a commit a25165b

File tree

6 files changed

+66
-50
lines changed

6 files changed

+66
-50
lines changed

pkg/monitor/sqsevent/asg-lifecycle-event.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,13 @@ func (m SQSMonitor) asgTerminationToInterruptionEvent(event EventBridgeEvent, me
7070
}
7171

7272
interruptionEvent := monitor.InterruptionEvent{
73-
EventID: fmt.Sprintf("asg-lifecycle-term-%x", event.ID),
74-
Kind: SQSTerminateKind,
75-
StartTime: event.getTime(),
76-
NodeName: nodeName,
77-
InstanceID: lifecycleDetail.EC2InstanceID,
78-
Description: fmt.Sprintf("ASG Lifecycle Termination event received. Instance will be interrupted at %s \n", event.getTime()),
73+
EventID: fmt.Sprintf("asg-lifecycle-term-%x", event.ID),
74+
Kind: SQSTerminateKind,
75+
AutoScalingGroupName: lifecycleDetail.AutoScalingGroupName,
76+
StartTime: event.getTime(),
77+
NodeName: nodeName,
78+
InstanceID: lifecycleDetail.EC2InstanceID,
79+
Description: fmt.Sprintf("ASG Lifecycle Termination event received. Instance will be interrupted at %s \n", event.getTime()),
7980
}
8081

8182
interruptionEvent.PostDrainTask = func(interruptionEvent monitor.InterruptionEvent, _ node.Node) error {

pkg/monitor/sqsevent/ec2-state-change-event.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,15 @@ func (m SQSMonitor) ec2StateChangeToInterruptionEvent(event EventBridgeEvent, me
6565
if err != nil {
6666
return monitor.InterruptionEvent{}, err
6767
}
68-
68+
asgName, err := m.retrieveAutoScalingGroupName(ec2StateChangeDetail.InstanceID)
6969
interruptionEvent := monitor.InterruptionEvent{
70-
EventID: fmt.Sprintf("ec2-state-change-event-%x", event.ID),
71-
Kind: SQSTerminateKind,
72-
StartTime: event.getTime(),
73-
NodeName: nodeName,
74-
InstanceID: ec2StateChangeDetail.InstanceID,
75-
Description: fmt.Sprintf("EC2 State Change event received. Instance went into %s at %s \n", ec2StateChangeDetail.State, event.getTime()),
70+
EventID: fmt.Sprintf("ec2-state-change-event-%x", event.ID),
71+
Kind: SQSTerminateKind,
72+
StartTime: event.getTime(),
73+
NodeName: nodeName,
74+
AutoScalingGroupName: asgName,
75+
InstanceID: ec2StateChangeDetail.InstanceID,
76+
Description: fmt.Sprintf("EC2 State Change event received. Instance went into %s at %s \n", ec2StateChangeDetail.State, event.getTime()),
7677
}
7778
interruptionEvent.PostDrainTask = func(interruptionEvent monitor.InterruptionEvent, n node.Node) error {
7879
errs := m.deleteMessages([]*sqs.Message{message})

pkg/monitor/sqsevent/rebalance-recommendation-event.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,16 @@ func (m SQSMonitor) rebalanceRecommendationToInterruptionEvent(event EventBridge
5757
if err != nil {
5858
return monitor.InterruptionEvent{}, err
5959
}
60+
asgName, err := m.retrieveAutoScalingGroupName(rebalanceRecDetail.InstanceID)
6061

6162
interruptionEvent := monitor.InterruptionEvent{
62-
EventID: fmt.Sprintf("rebalance-recommendation-event-%x", event.ID),
63-
Kind: SQSTerminateKind,
64-
StartTime: event.getTime(),
65-
NodeName: nodeName,
66-
InstanceID: rebalanceRecDetail.InstanceID,
67-
Description: fmt.Sprintf("Rebalance recommendation event received. Instance will be cordoned at %s \n", event.getTime()),
63+
EventID: fmt.Sprintf("rebalance-recommendation-event-%x", event.ID),
64+
Kind: SQSTerminateKind,
65+
AutoScalingGroupName: asgName,
66+
StartTime: event.getTime(),
67+
NodeName: nodeName,
68+
InstanceID: rebalanceRecDetail.InstanceID,
69+
Description: fmt.Sprintf("Rebalance recommendation event received. Instance will be cordoned at %s \n", event.getTime()),
6870
}
6971
interruptionEvent.PostDrainTask = func(interruptionEvent monitor.InterruptionEvent, n node.Node) error {
7072
errs := m.deleteMessages([]*sqs.Message{message})

pkg/monitor/sqsevent/spot-itn-event.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,15 @@ func (m SQSMonitor) spotITNTerminationToInterruptionEvent(event EventBridgeEvent
5959
if err != nil {
6060
return monitor.InterruptionEvent{}, err
6161
}
62-
62+
asgName, err := m.retrieveAutoScalingGroupName(spotInterruptionDetail.InstanceID)
6363
interruptionEvent := monitor.InterruptionEvent{
64-
EventID: fmt.Sprintf("spot-itn-event-%x", event.ID),
65-
Kind: SQSTerminateKind,
66-
StartTime: event.getTime(),
67-
NodeName: nodeName,
68-
InstanceID: spotInterruptionDetail.InstanceID,
69-
Description: fmt.Sprintf("Spot Interruption event received. Instance will be interrupted at %s \n", event.getTime()),
64+
EventID: fmt.Sprintf("spot-itn-event-%x", event.ID),
65+
Kind: SQSTerminateKind,
66+
AutoScalingGroupName: asgName,
67+
StartTime: event.getTime(),
68+
NodeName: nodeName,
69+
InstanceID: spotInterruptionDetail.InstanceID,
70+
Description: fmt.Sprintf("Spot Interruption event received. Instance will be interrupted at %s \n", event.getTime()),
7071
}
7172
interruptionEvent.PostDrainTask = func(interruptionEvent monitor.InterruptionEvent, n node.Node) error {
7273
errs := m.deleteMessages([]*sqs.Message{message})

pkg/monitor/sqsevent/sqs-monitor.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -222,20 +222,11 @@ func (m SQSMonitor) isInstanceManaged(instanceID string) (bool, error) {
222222
if instanceID == "" {
223223
return false, fmt.Errorf("Instance ID was empty when calling isInstanceManaged")
224224
}
225-
asgDescribeInstanceInput := autoscaling.DescribeAutoScalingInstancesInput{
226-
InstanceIds: []*string{&instanceID},
227-
MaxRecords: aws.Int64(50),
228-
}
229-
asgs, err := m.ASG.DescribeAutoScalingInstances(&asgDescribeInstanceInput)
230-
if err != nil {
225+
asgName, err := m.retrieveAutoScalingGroupName(instanceID)
226+
if asgName == "" {
231227
return false, err
232228
}
233-
if len(asgs.AutoScalingInstances) == 0 {
234-
log.Debug().Str("instance_id", instanceID).Msg("Did not find an Auto Scaling Group for the given instance id")
235-
return false, nil
236-
}
237-
asgName := asgs.AutoScalingInstances[0].AutoScalingGroupName
238-
asgFilter := autoscaling.Filter{Name: aws.String("auto-scaling-group"), Values: []*string{asgName}}
229+
asgFilter := autoscaling.Filter{Name: aws.String("auto-scaling-group"), Values: []*string{aws.String(asgName)}}
239230
asgDescribeTagsInput := autoscaling.DescribeTagsInput{
240231
Filters: []*autoscaling.Filter{&asgFilter},
241232
}
@@ -259,3 +250,21 @@ func (m SQSMonitor) isInstanceManaged(instanceID string) (bool, error) {
259250
}
260251
return isManaged, err
261252
}
253+
254+
// retrieveAutoScalingGroupName returns the autoscaling group name for a given instanceID
255+
func (m SQSMonitor) retrieveAutoScalingGroupName(instanceID string) (string, error) {
256+
asgDescribeInstanceInput := autoscaling.DescribeAutoScalingInstancesInput{
257+
InstanceIds: []*string{&instanceID},
258+
MaxRecords: aws.Int64(50),
259+
}
260+
asgs, err := m.ASG.DescribeAutoScalingInstances(&asgDescribeInstanceInput)
261+
if err != nil {
262+
return "", err
263+
}
264+
if len(asgs.AutoScalingInstances) == 0 {
265+
log.Debug().Str("instance_id", instanceID).Msg("Did not find an Auto Scaling Group for the given instance id")
266+
return "", nil
267+
}
268+
asgName := asgs.AutoScalingInstances[0].AutoScalingGroupName
269+
return *asgName, err
270+
}

pkg/monitor/types.go

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,20 @@ type DrainTask func(InterruptionEvent, node.Node) error
2424

2525
// InterruptionEvent gives more context of the interruption event
2626
type InterruptionEvent struct {
27-
EventID string
28-
Kind string
29-
Description string
30-
State string
31-
NodeName string
32-
InstanceID string
33-
StartTime time.Time
34-
EndTime time.Time
35-
Drained bool
36-
InProgress bool
37-
PreDrainTask DrainTask `json:"-"`
38-
PostDrainTask DrainTask `json:"-"`
27+
EventID string
28+
Kind string
29+
Description string
30+
State string
31+
AutoScalingGroupName string
32+
NodeName string
33+
NodeLabels map[string]string
34+
InstanceID string
35+
StartTime time.Time
36+
EndTime time.Time
37+
Drained bool
38+
InProgress bool
39+
PreDrainTask DrainTask `json:"-"`
40+
PostDrainTask DrainTask `json:"-"`
3941
}
4042

4143
// TimeUntilEvent returns the duration until the event start time

0 commit comments

Comments
 (0)