class BaselineRedRpm::Reporters::JsonClient

Attributes

sample_memory[RW]

Public Class Methods

new(opts = { :url => nil, :collector => nil, :flush_interval => nil }) click to toggle source
# File lib/baseline_red_rpm/reporters/json_client.rb, line 13
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/baseline_red_rpm/reporters/json_client.rb, line 19
def start
  @thread = Thread.new do
    loop do
      memory_stats = MemoryProfiler.stop

      emit_batch(@collector.retrieve, memory_stats)

      start_memory_profiler
      sleep @flush_interval
    end
  end
end
stop() click to toggle source
# File lib/baseline_red_rpm/reporters/json_client.rb, line 32
def stop
  @thread.terminate if @thread
  emit_batch(@collector.retrieve)
end

Private Instance Methods

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

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

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

  request = Net::HTTP::Post.new(@spans_uri.request_uri, {
    "Accept-Encoding" => "gzip",
    "User-Agent" => "gzip"
  })
  request.body = compress_body(spans, memory_stats)
  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)
  elsif response.code == 200
    json = JSON.parse(response.body)
    BaselineRedRpm.config.sample_memory =
        json['sample_memory'].present? ?  Time.parse(json['sample_memory']) : nil
  end
rescue => e
  STDERR.puts("Error emitting spans batch: #{e.message}\n#{e.backtrace.join("\n")}")
end
start_memory_profiler() click to toggle source
# File lib/baseline_red_rpm/reporters/json_client.rb, line 39
def start_memory_profiler
  return unless BaselineRedRpm.config.sample_memory
  if Time.now.utc - BaselineRedRpm.config.sample_memory < 5.minutes
    MemoryProfiler.start
  end
end