lib/splash/commands.rb in prometheus-splash-0.0.2 vs lib/splash/commands.rb in prometheus-splash-0.0.3

- old
+ new

@@ -1,63 +1,73 @@ require 'open3' require 'date' +require 'socket' - module Splash class CommandWrapper include Splash::Templates include Splash::Config include Splash::Helpers + include Splash::Backends def initialize(name) @config = get_config @name = name unless @config.commands.keys.include? @name.to_sym then $stderr.puts "Splash : command #{@name} is not defined in configuration" exit 40 end + @registry = Prometheus::Client.registry + @url = "http://#{@config.prometheus_pushgateway_host}:#{@config.prometheus_pushgateway_port}" + @metric_exitcode = Prometheus::Client::Gauge.new(:errorcode, docstring: 'SPLASH metric batch errorcode') + @metric_time = Prometheus::Client::Gauge.new(:exectime, docstring: 'SPLASH metric batch execution time') + @registry.register(@metric_exitcode) + @registry.register(@metric_time) end def ack puts "Sending ack for command : '#{@name}'" notify(0) exit 0 end - def notify(value) + def notify(value,time) unless verify_service host: @config.prometheus_pushgateway_host ,port: @config.prometheus_pushgateway_port then $stderr.puts "Prometheus PushGateway Service IS NOT running" $stderr.puts "Exit without notification." exit 30 end - registry = Prometheus::Client.registry - url = "http://#{@config.prometheus_pushgateway_host}:#{@config.prometheus_pushgateway_port}" - metric = Prometheus::Client::Gauge.new(:errorcode, docstring: 'SPLASH metric batch errorcode') - registry.register(metric) - metric.set(value) - Prometheus::Client::Push.new(@name, nil, url).add(registry) - puts "Prometheus Gateway notified." + @metric_exitcode.set(value) + @metric_time.set(time) + hostname = Socket.gethostname + Prometheus::Client::Push.new(@name, hostname, @url).add(@registry) + puts " * Prometheus Gateway notified." end def call_and_notify(options) puts "Executing command : '#{@name}' " + start = Time.now unless options[:trace] then - puts "Traceless execution" + puts " * Traceless execution" if @config.commands[@name.to_sym][:user] then + puts " * Execute with user : #{@config.commands[@name.to_sym][:user]}." system("sudo -u #{@config.commands[@name.to_sym][:user]} #{@config.commands[@name.to_sym][:command]} > /dev/null 2>&1") else system("#{@config.commands[@name.to_sym][:command]} > /dev/null 2>&1") end + time = Time.now - start exit_code = $?.exitstatus else - puts "Tracefull execution" + puts " * Tracefull execution" if @config.commands[@name.to_sym][:user] then + puts " * Execute with user : #{@config.commands[@name.to_sym][:user]}." stdout, stderr, status = Open3.capture3("sudo -u #{@config.commands[@name.to_sym][:user]} #{@config.commands[@name.to_sym][:command]}") else stdout, stderr, status = Open3.capture3(@config.commands[@name.to_sym][:command]) end + time = Time.now - start tp = Template::new( list_token: @config.execution_template_tokens, template_file: @config.execution_template_path) tp.date = DateTime.now.to_s @@ -65,15 +75,46 @@ tp.cmd_line = @config.commands[@name.to_sym][:command] tp.desc = @config.commands[@name.to_sym][:desc] tp.status = status.to_s tp.stdout = stdout tp.stderr = stderr - filename = "#{@config[:trace_path]}/#{@name}_trace.last" - File.open(filename, 'w') { |file| file.write(tp.output) } + tp.exec_time = time.to_s + backend = get_backend :execution_trace + key = "#{@name}_trace.last" + backend.put key: key, value: tp.output exit_code = status.exitstatus + end - notify(exit_code) + puts " => exitcode #{exit_code}" + if options[:notify] then + notify(exit_code,time.to_i) + else + puts " * Without Prometheus notification" + end + on_failure = (@config.commands[@name.to_sym][:on_failure])? @config.commands[@name.to_sym][:on_failure] : false + on_success = (@config.commands[@name.to_sym][:on_success])? @config.commands[@name.to_sym][:on_success] : false + + if on_failure and exit_code > 0 then + puts " * On failure callback : #{on_failure}" + if @config.commands.keys.include? on_failure then + @name = on_failure.to_s + call_and_notify options + else + $stderr.puts "on_failure call error : configuration mistake : #{on_failure} command inexistant." + end + end + if on_success and exit_code == 0 then + puts " * On success callback : #{on_success}" + if @config.commands.keys.include? on_success then + @name = on_success.to_s + call_and_notify options + else + $stderr.puts "on_success call error : configuration mistake : #{on_success} command inexistant." + end + end + + exit exit_code end end end