in pkg/monitor/sqsevent/asg-lifecycle-event.go [170:199]
func (m SQSMonitor) SendHeartbeats(heartbeatInterval int, heartbeatUntil int, lifecycleDetail *LifecycleDetail, stopCh <-chan struct{}) {
ticker := time.NewTicker(time.Duration(heartbeatInterval) * time.Second)
defer ticker.Stop()
timeout := time.After(time.Duration(heartbeatUntil) * time.Second)
for {
select {
case <-stopCh:
log.Info().Str("asgName", lifecycleDetail.AutoScalingGroupName).
Str("lifecycleHookName", lifecycleDetail.LifecycleHookName).
Str("lifecycleActionToken", lifecycleDetail.LifecycleActionToken).
Str("instanceID", lifecycleDetail.EC2InstanceID).
Msg("Successfully cordoned and drained the node, stopping heartbeat")
return
case <-ticker.C:
err := m.recordLifecycleActionHeartbeat(lifecycleDetail)
if err != nil {
log.Err(err).Msg("invalid heartbeat target, stopping heartbeat")
return
}
case <-timeout:
log.Info().Str("asgName", lifecycleDetail.AutoScalingGroupName).
Str("lifecycleHookName", lifecycleDetail.LifecycleHookName).
Str("lifecycleActionToken", lifecycleDetail.LifecycleActionToken).
Str("instanceID", lifecycleDetail.EC2InstanceID).
Msg("Heartbeat deadline exceeded, stopping heartbeat")
return
}
}
}