Sha256: 493ae6803241c5f6d7ab100451f83338f395fcb092959c0ddec79082b4c81754

Contents?: true

Size: 1.56 KB

Versions: 8

Compression:

Stored size: 1.56 KB

Contents

require 'net/http'
require 'net/https'
require 'uri'
require 'rack/utils'
require 'json'

module Appsignal
  class Transmitter
    CONTENT_TYPE = 'application/json; charset=UTF-8'.freeze
    CONTENT_ENCODING = 'gzip'.freeze
    CA_FILE_PATH = File.expand_path(File.join(__FILE__, '../../../resources/cacert.pem'))

    attr_reader :config, :action

    def initialize(action, config=Appsignal.config)
      @action = action
      @config = config
    end

    def uri
      @uri ||= URI("#{config[:endpoint]}/#{action}").tap do |uri|
        uri.query = ::Rack::Utils.build_query({
          :api_key => config[:push_api_key],
          :name => config[:name],
          :environment => config.env,
          :hostname => Socket.gethostname,
          :gem_version => Appsignal::VERSION
        })
      end
    end

    def transmit(payload)
      Appsignal.logger.debug "Transmitting payload to #{uri}"
      http_client.request(http_post(payload)).code
    end

    protected

    def http_post(payload)
      Net::HTTP::Post.new(uri.request_uri).tap do |request|
        request['Content-Type'] = CONTENT_TYPE
        request['Content-Encoding'] = CONTENT_ENCODING
        request.body = Zlib::Deflate.deflate(
          JSON.generate(payload, :quirks_mode => true),
          Zlib::BEST_SPEED
        )
      end
    end

    def http_client
      Net::HTTP.new(uri.host, uri.port).tap do |http|
        if uri.scheme == 'https'
          http.use_ssl = true
          http.verify_mode = OpenSSL::SSL::VERIFY_PEER
          http.ca_file = CA_FILE_PATH
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
appsignal-0.10.6 lib/appsignal/transmitter.rb
appsignal-0.10.5 lib/appsignal/transmitter.rb
appsignal-0.10.4 lib/appsignal/transmitter.rb
appsignal-0.10.3 lib/appsignal/transmitter.rb
appsignal-0.10.2 lib/appsignal/transmitter.rb
appsignal-0.10.1 lib/appsignal/transmitter.rb
appsignal-0.10.0 lib/appsignal/transmitter.rb
appsignal-0.10.0.beta.0 lib/appsignal/transmitter.rb