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