Class: Judoscale::Config

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/judoscale/config.rb

Defined Under Namespace

Classes: JobAdapterConfig, RuntimeContainer

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConfig

Returns a new instance of Config.



95
96
97
# File 'lib/judoscale/config.rb', line 95

def initialize
  reset
end

Class Attribute Details

.adapter_configsObject (readonly)

Returns the value of attribute adapter_configs.



66
67
68
# File 'lib/judoscale/config.rb', line 66

def adapter_configs
  @adapter_configs
end

Instance Attribute Details

#api_base_urlObject

Returns the value of attribute api_base_url.



91
92
93
# File 'lib/judoscale/config.rb', line 91

def api_base_url
  @api_base_url
end

#current_runtime_containerObject

Returns the value of attribute current_runtime_container.



91
92
93
# File 'lib/judoscale/config.rb', line 91

def current_runtime_container
  @current_runtime_container
end

#log_levelObject

Returns the value of attribute log_level.



93
94
95
# File 'lib/judoscale/config.rb', line 93

def log_level
  @log_level
end

#log_tagObject

Returns the value of attribute log_tag.



91
92
93
# File 'lib/judoscale/config.rb', line 91

def log_tag
  @log_tag
end

#loggerObject

Returns the value of attribute logger.



91
92
93
# File 'lib/judoscale/config.rb', line 91

def logger
  @logger
end

#max_request_size_bytesObject

Returns the value of attribute max_request_size_bytes.



91
92
93
# File 'lib/judoscale/config.rb', line 91

def max_request_size_bytes
  @max_request_size_bytes
end

#report_interval_secondsObject

Returns the value of attribute report_interval_seconds.



91
92
93
# File 'lib/judoscale/config.rb', line 91

def report_interval_seconds
  @report_interval_seconds
end

Class Method Details

.coerce_log_level(level) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/judoscale/config.rb', line 77

def self.coerce_log_level(level)
  if level.is_a?(Integer)
    level
  else
    upcased_level = level.to_s.upcase

    if ::Logger::Severity.const_defined?(upcased_level)
      ::Logger::Severity.const_get(upcased_level)
    else
      raise ArgumentError, "invalid log level: #{level}"
    end
  end
end

.expose_adapter_config(config_instance) ⇒ Object



69
70
71
72
73
74
75
# File 'lib/judoscale/config.rb', line 69

def self.expose_adapter_config(config_instance)
  adapter_configs << config_instance

  define_method(config_instance.identifier) do
    config_instance
  end
end

Instance Method Details

#as_jsonObject



136
137
138
139
140
141
142
143
144
145
# File 'lib/judoscale/config.rb', line 136

def as_json
  adapter_configs_json = self.class.adapter_configs.reduce({}) { |hash, config| hash.merge!(config.as_json) }

  {
    log_level: log_level,
    logger: logger.class.name,
    report_interval_seconds: report_interval_seconds,
    max_request_size_bytes: max_request_size_bytes
  }.merge!(adapter_configs_json)
end

#ignore_large_requests?Boolean

Returns:

  • (Boolean)


147
148
149
# File 'lib/judoscale/config.rb', line 147

def ignore_large_requests?
  @max_request_size_bytes
end

#resetObject



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/judoscale/config.rb', line 99

def reset
  @api_base_url = ENV["JUDOSCALE_URL"] || ENV["RAILS_AUTOSCALE_URL"]
  @log_tag = "Judoscale"
  @max_request_size_bytes = 100_000 # ignore request payloads over 100k since they skew the queue times
  @report_interval_seconds = 10

  self.log_level = ENV["JUDOSCALE_LOG_LEVEL"] || ENV["RAILS_AUTOSCALE_LOG_LEVEL"]
  @logger = ::Logger.new($stdout)

  self.class.adapter_configs.each(&:reset)

  @current_runtime_container =
    if ENV.include?("DYNO")
      RuntimeContainer.new ENV["DYNO"]
    elsif ENV.include?("RENDER_INSTANCE_ID")
      # Deprecated API url using the service ID for legacy render services not using `JUDOSCALE_URL`.
      @api_base_url ||= "https://adapter.judoscale.com/api/#{ENV["RENDER_SERVICE_ID"]}"

      instance = ENV["RENDER_INSTANCE_ID"].delete_prefix("#{ENV["RENDER_SERVICE_ID"]}-")
      RuntimeContainer.new instance
    elsif ENV.include?("ECS_CONTAINER_METADATA_URI")
      instance = ENV["ECS_CONTAINER_METADATA_URI"].split("/").last
      RuntimeContainer.new instance
    elsif ENV.include?("FLY_MACHINE_ID")
      RuntimeContainer.new ENV["FLY_MACHINE_ID"]
    elsif ENV.include?("RAILWAY_REPLICA_ID")
      RuntimeContainer.new ENV["RAILWAY_REPLICA_ID"]
    else
      # Unsupported platform...
      RuntimeContainer.new("")
    end
end