class AppPerfRpm::Reporters::JsonClient

Public Class Methods

new(opts = { :url => nil, :collector => nil, :flush_interval => nil }) click to toggle source
# File lib/app_perf_rpm/reporters/json_client.rb, line 10
def initialize(opts = { :url => nil, :collector => nil, :flush_interval => nil })
  @collector = opts[:collector]
  @flush_interval = opts[:flush_interval]
  @spans_uri = URI.parse(opts[:url])
end

Public Instance Methods

start() click to toggle source
# File lib/app_perf_rpm/reporters/json_client.rb, line 16
def start
  @thread = Thread.new do
    loop do
      emit_batch(@collector.retrieve)
      sleep @flush_interval
    end
  end
end
stop() click to toggle source
# File lib/app_perf_rpm/reporters/json_client.rb, line 25
def stop
  @thread.terminate if @thread
  emit_batch(@collector.retrieve)
end

Private Instance Methods

compress_body(data) click to toggle source
# File lib/app_perf_rpm/reporters/json_client.rb, line 32
def compress_body(data)
  body = MessagePack.pack({
    "name" => AppPerfRpm.config.application_name,
    "host" => AppPerfRpm.host,
    "data" => data
  })

  compressed_body = Zlib::Deflate.deflate(body, Zlib::DEFAULT_COMPRESSION)
  Base64.encode64(compressed_body)
end
emit_batch(spans) click to toggle source
# File lib/app_perf_rpm/reporters/json_client.rb, line 43
def emit_batch(spans)
  return if spans.empty?

  sock = Net::HTTP.new(@spans_uri.host, @spans_uri.port)
  sock.use_ssl = ::AppPerfRpm.config.ssl

  request = Net::HTTP::Post.new(@spans_uri.request_uri, {
    "Accept-Encoding" => "gzip",
    "User-Agent" => "gzip"
  })
  request.body = compress_body(spans)
  request.content_type = "application/octet-stream"

  response = sock.start do |http|
    http.read_timeout = 30
    http.request(request)
  end

  if response.code != 202
    STDERR.puts(response.body)
  end
rescue => e
  STDERR.puts("Error emitting spans batch: #{e.message}\n#{e.backtrace.join("\n")}")
end