Class: SidekiqEcsScaler::Client

Inherits:
Object
  • Object
show all
Defined in:
lib/sidekiq-ecs-scaler/client.rb

Overview

SidekiqEcsScaler::Client

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ void

Parameters:



8
9
10
# File 'lib/sidekiq-ecs-scaler/client.rb', line 8

def initialize(config)
  @config = config
end

Instance Attribute Details

#configSidekiqEcsScaler::Configuration (readonly, private)



33
34
35
# File 'lib/sidekiq-ecs-scaler/client.rb', line 33

def config
  @config
end

Instance Method Details

#change_log(before_count, after_count) ⇒ void (private)

This method returns an undefined value.

Parameters:

  • before_count (Integer)
  • after_count (Integer)


87
88
89
90
91
# 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_serviceAws::ECS::Types::Service (private)

Returns:

  • (Aws::ECS::Types::Service)


59
60
61
62
63
# 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_latencyInteger (private)

Returns:

  • (Integer)


41
42
43
44
45
# 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) ⇒ void (private)

This method returns an undefined value.

Parameters:

  • count (Integer)


80
81
82
# 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_latencyFloat (private)

Returns:

  • (Float)


36
37
38
# File 'lib/sidekiq-ecs-scaler/client.rb', line 36

def queue_latency
  Sidekiq::Queue.new(config.queue_name).latency
end

#service_nameString (private)

Returns:

  • (String)


48
49
50
51
52
53
54
55
56
# 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_desired_countInteger?

Returns:

  • (Integer, nil)


13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 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

#update_service(service:, desired_count:) ⇒ Aws::ECS::Types::UpdateServiceResponse (private)

Parameters:

  • service (Aws::ECS::Types::Service)
  • desired_count (Integer)

Returns:

  • (Aws::ECS::Types::UpdateServiceResponse)


68
69
70
71
72
73
74
75
76
# 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