class SousVide::Outputs::JsonHTTP

Makes a POST request to a configured endpoint. Logstash & Elasticsearch friendly format.

It uses Net::HTTP to perform requests, it can be customized via :http_client accessor.

@example

JsonHTTP.new(url: "http://localhost:9200/endpoint", max_retries: 10)

Attributes

http_client[RW]

Provides access to Net::HTTP client object. Use it to enable SSL or pass your own client. @return [Net::HTTP]

Public Class Methods

new(url:, max_retries: 2, logger: nil) click to toggle source

@param max_retries [Fixnum] number retries across all requests made.

# File lib/sous_vide/outputs/json_http.rb, line 20
def initialize(url:, max_retries: 2, logger: nil)
  @endpoint = URI(url)
  @logger = logger
  @retry = 0
  @max_retries = max_retries
  @http_client = Net::HTTP.new(@endpoint.host, @endpoint.port)
end

Public Instance Methods

call(run_data:, node_data:, resources_data:) click to toggle source

Sends a POST request with a JSON payload using @http_client object per resource. @return (void)

# File lib/sous_vide/outputs/json_http.rb, line 30
def call(run_data:, node_data:, resources_data:)
  log "=============== #{self.class.name} ==============="
  log ""
  log "Processing #{resources_data.size} resources."
  log "Target: #{@endpoint.to_s}"

  resources_data.each do |tracked|
    _path = @endpoint.path == "" ? "/" : @endpoint.path
    post_request = Net::HTTP::Post.new(_path, "Content-Type" => "application/json")

    payload = tracked.to_h.merge(node_data).merge(run_data)
    payload["@timestamp"] = Time.parse(payload[:chef_resource_started_at]).iso8601(3)

    post_request.body = payload.to_json

    call_with_retries(post_request)
  end

  log "All resources processed."
  log ""
end

Private Instance Methods

call_with_retries(nethttp_request) click to toggle source
# File lib/sous_vide/outputs/json_http.rb, line 54
def call_with_retries(nethttp_request)
  begin
    @http_client.request(nethttp_request)
  rescue
    if @retry < @max_retries
      logger.warn("Request failed, retry #{@retry} of #{@max_retries}.")
      @retry += 1
      sleep 2
      retry
    else
      logger.error("Request failed, retry #{@retry} of #{@max_retries}. Abort.")
      raise
    end
  end
end
log(*args) click to toggle source
# File lib/sous_vide/outputs/json_http.rb, line 70
def log(*args)
  logger.info(args.compact.join(" "))
end
logger() click to toggle source
# File lib/sous_vide/outputs/json_http.rb, line 74
def logger
  @logger ||= ::Chef::Log
end