class SidekiqEcsScaler::Client

SidekiqEcsScaler::Client

Attributes

config[R]

@!attribute [r] config @return [SidekiqEcsScaler::Configuration]

Public Class Methods

new(config) click to toggle source

@param config [SidekiqEcsScaler::Configuration] @return [void]

# File lib/sidekiq-ecs-scaler/client.rb, line 8
def initialize(config)
  @config = config
end

Public Instance Methods

update_desired_count() click to toggle source

@return [Integer, nil]

# File lib/sidekiq-ecs-scaler/client.rb, line 13
def update_desired_count
  return if !config.enabled || config.task_meta.nil?

  desired_count = desired_count_by_latency
  service = describe_service

  if service.desired_count == desired_count
    not_change_log(desired_count)
  else
    update_service(service: service, desired_count: desired_count)
    change_log(service.desired_count, desired_count)
  end

  desired_count
end

Private Instance Methods

change_log(before_count, after_count) click to toggle source

@param before_count [Integer] @param after_count [Integer] @return [void]

# File lib/sidekiq-ecs-scaler/client.rb, line 87
def change_log(before_count, after_count)
  config.logger.info(
    "SidekiqEcsScaler has updated the desired count of tasks from #{before_count} to #{after_count}."
  )
end
describe_service() click to toggle source

@return [Aws::ECS::Types::Service]

# File lib/sidekiq-ecs-scaler/client.rb, line 59
def describe_service
  config.ecs_client.describe_services(
    { cluster: config.task_meta!.cluster, services: [service_name] }
  ).services.first || (raise Error, "Service(#{service_name}) does not exist in cluster!")
end
desired_count_by_latency() click to toggle source

@return [Integer]

# File lib/sidekiq-ecs-scaler/client.rb, line 41
def desired_count_by_latency
  (config.min_count..config.max_count).to_a.at(
    (queue_latency.to_f / config.latency_per_count).floor.to_i
  ) || config.max_count
end
not_change_log(count) click to toggle source

@param count [Integer] @return [void]

# File lib/sidekiq-ecs-scaler/client.rb, line 80
def not_change_log(count)
  config.logger.info("SidekiqEcsScaler doesn't have updated the desired count of tasks from #{count}.")
end
queue_latency() click to toggle source

@return [Float]

# File lib/sidekiq-ecs-scaler/client.rb, line 36
def queue_latency
  Sidekiq::Queue.new(config.queue_name).latency
end
service_name() click to toggle source

@return [String]

# File lib/sidekiq-ecs-scaler/client.rb, line 48
def service_name
  config.task_meta!.then do |task_meta|
    config.ecs_client.describe_tasks(
      { cluster: task_meta.cluster, tasks: [task_meta.task_arn] }
    ).tasks.first&.then { |task| task.group.delete_prefix("service:") } || (
      raise Error, "Task(#{task_meta.task_arn}) does not exist in cluster!"
    )
  end
end
update_service(service:, desired_count:) click to toggle source

@param service [Aws::ECS::Types::Service] @param desired_count [Integer] @return [Aws::ECS::Types::UpdateServiceResponse]

# File lib/sidekiq-ecs-scaler/client.rb, line 68
def update_service(service:, desired_count:)
  config.ecs_client.update_service(
    {
      cluster: service.cluster_arn,
      service: service.service_name,
      desired_count: desired_count
    }
  )
end