11require "yaml"
2+ require 'prometheus/client'
3+ require 'prometheus/client/push'
24
35module Scaltainer
46 class Runner
5- def initialize ( configfile , statefile , logger , wait , orchestrator )
7+ def initialize ( configfile , statefile , logger , wait , orchestrator , pushgateway )
68 @orchestrator = orchestrator
79 @logger = logger
810 @default_service_config = {
@@ -19,18 +21,20 @@ def initialize(configfile, statefile, logger, wait, orchestrator)
1921 endpoint = config [ "endpoint" ]
2022 service_type_web = ServiceTypeWeb . new ( endpoint )
2123 service_type_worker = ServiceTypeWorker . new ( endpoint )
24+ register_pushgateway ( pushgateway ) if pushgateway
25+ namespace = config [ "namespace" ] || config [ "stack_name" ]
2226 loop do
23- run config , state , service_type_web , service_type_worker
27+ run config , state , service_type_web , service_type_worker , namespace
2428 save_state statefile , state
29+ sync_pushgateway ( namespace , state ) if pushgateway
2530 sleep wait
2631 break if wait == 0
2732 end
2833 end
2934
3035 private
3136
32- def run ( config , state , service_type_web , service_type_worker )
33- namespace = config [ "namespace" ] || config [ "stack_name" ]
37+ def run ( config , state , service_type_web , service_type_worker , namespace )
3438 iterate_services config [ "web_services" ] , namespace , service_type_web , state
3539 iterate_services config [ "worker_services" ] , namespace , service_type_worker , state
3640 end
@@ -82,9 +86,11 @@ def process_service(service_name, config, state, namespace, type, metrics)
8286 adjusted_replicas = type . adjust_desired_replicas ( desired_replicas , config )
8387 @logger . debug "Desired number of replicas for #{ service . type } #{ service . name } is adjusted to #{ adjusted_replicas } "
8488 replica_diff = adjusted_replicas - current_replicas
89+ state [ "replicas" ] = current_replicas
8590 type . yield_to_scale ( replica_diff , config , state , metric ,
8691 service . name , @logger ) do
8792 scale_out service , current_replicas , adjusted_replicas
93+ state [ "replicas" ] = adjusted_replicas
8894 end
8995 end
9096
@@ -113,5 +119,27 @@ def scale_out(service, current_replicas, desired_replicas)
113119 end
114120 end
115121
122+ def register_pushgateway ( pushgateway )
123+ @registry = Prometheus ::Client . registry
124+ @replicas_gauge = @registry . gauge ( :rayyan_controller_replicas , docstring : 'Rayyan replicas' , labels : [ :controller , :namespace ] )
125+ @ticks_counter = @registry . counter ( :rayyan_scaltainer_ticks , docstring : 'Rayyan Scaltainer ticks' , labels : [ :namespace ] )
126+
127+ @pushgateway = Prometheus ::Client ::Push . new ( "scaltainer" , "scaltainer" , "http://#{ pushgateway } " )
128+ end
129+
130+ def sync_pushgateway ( namespace , state )
131+ @logger . debug ( "Now syncing state #{ state } in namespace #{ namespace } " )
132+ state . each do |service , state |
133+ @replicas_gauge . set ( state [ "replicas" ] , labels : { namespace : namespace , controller : service } ) if state [ "replicas" ]
134+ end
135+ @ticks_counter . increment ( labels : { namespace : namespace } )
136+ begin
137+ @pushgateway . add ( @registry )
138+ rescue => e
139+ @logger . warn "[#{ e . class } ] Error pushing metrics to the configured Prometheus Push Gateway: #{ e . message } "
140+ end
141+ @logger . info "Pushed metrics successfully to the configured Prometheus Push Gateway"
142+ end
143+
116144 end # class
117145end # module
0 commit comments