# File lib/smart_proxy_monitoring_icinga2/icinga2_result_uploader.rb, line 21
    def upload
      while change = @queue.pop
        with_event_counter('Icinga2 Result Uploader') do
          symbolize_keys_deep!(change)

          change[:timestamp] = change[:check_result][:schedule_end] if change.key?(:check_result)
          if change.key?(:downtime) && change[:downtime].is_a?(Hash)
            change[:host] = change[:downtime][:host_name] if change[:host].nil? || change[:host].empty?
            change[:service] = change[:downtime][:service_name] if change[:service].nil? || change[:service].empty?
          end

          if change[:service].nil? || change[:service].empty?
            change[:service] = 'Host Check'
          end

          case change[:type]
          when 'StateChange'
            transformed = { result: change[:check_result][:state] }
          when 'AcknowledgementSet'
            transformed = { acknowledged: true }
          when 'AchnowledgementCleared'
            transformed = { acknowledged: false }
          when 'DowntimeTriggered'
            transformed = { downtime: true }
          when 'DowntimeRemoved'
            transformed = { downtime: false }
          when '_parsed'
            transformed = change.dup.reject! { |k, _v| k == :type }
          else
            next
          end
          transformed.merge!(
            host: change[:host],
            service: change[:service],
            timestamp: change[:timestamp]
          )
          begin
            MonitoringResult.new.push_result(transformed.to_json)
          rescue Errno::ECONNREFUSED => e
            logger.error "Foreman refused connection when tried to upload monitoring result: #{e.message}"
            sleep 10
          rescue => e
            logger.error "Error while uploading monitoring results to Foreman: #{e.message}"
            sleep 1
            retry
          end
        end
      end
    end