class LaunchDarkly::Impl::EventSender

Constants

CURRENT_SCHEMA_VERSION
DEFAULT_RETRY_INTERVAL

Public Class Methods

new(sdk_key, config, http_client = nil, retry_interval = DEFAULT_RETRY_INTERVAL) click to toggle source
# File lib/ldclient-rb/impl/event_sender.rb, line 14
def initialize(sdk_key, config, http_client = nil, retry_interval = DEFAULT_RETRY_INTERVAL)
  @sdk_key = sdk_key
  @config = config
  @events_uri = config.events_uri + "/bulk"
  @diagnostic_uri = config.events_uri + "/diagnostic"
  @logger = config.logger
  @retry_interval = retry_interval
  @http_client_pool = UnboundedPool.new(
    lambda { LaunchDarkly::Util.new_http_client(@config.events_uri, @config) },
    lambda { |client| client.close })
end

Public Instance Methods

send_event_data(event_data, description, is_diagnostic) click to toggle source
# File lib/ldclient-rb/impl/event_sender.rb, line 30
def send_event_data(event_data, description, is_diagnostic)
  uri = is_diagnostic ? @diagnostic_uri : @events_uri
  payload_id = is_diagnostic ? nil : SecureRandom.uuid
  begin
    http_client = @http_client_pool.acquire()
    response = nil
    (0..1).each do |attempt|
      if attempt > 0
        @logger.warn { "[LDClient] Will retry posting events after #{@retry_interval} second" }
        sleep(@retry_interval)
      end
      begin
        @logger.debug { "[LDClient] sending #{description}: #{event_data}" }
        headers = {}
        headers["content-type"] = "application/json"
        Impl::Util.default_http_headers(@sdk_key, @config).each { |k, v| headers[k] = v }
        if !is_diagnostic
          headers["X-LaunchDarkly-Event-Schema"] = CURRENT_SCHEMA_VERSION.to_s
          headers["X-LaunchDarkly-Payload-ID"] = payload_id
        end
        response = http_client.request("POST", uri, {
          headers: headers,
          body: event_data
        })
      rescue StandardError => exn
        @logger.warn { "[LDClient] Error sending events: #{exn.inspect}." }
        next
      end
      status = response.status.code
      # must fully read body for persistent connections
      body = response.to_s
      if status >= 200 && status < 300
        res_time = nil
        if !response.headers["date"].nil?
          begin
            res_time = Time.httpdate(response.headers["date"])
          rescue ArgumentError
          end
        end
        return EventSenderResult.new(true, false, res_time)
      end
      must_shutdown = !LaunchDarkly::Util.http_error_recoverable?(status)
      can_retry = !must_shutdown && attempt == 0
      message = LaunchDarkly::Util.http_error_message(status, "event delivery", can_retry ? "will retry" : "some events were dropped")
      @logger.error { "[LDClient] #{message}" }
      if must_shutdown
        return EventSenderResult.new(false, true, nil)
      end
    end
    # used up our retries
    return EventSenderResult.new(false, false, nil)
  ensure
    @http_client_pool.release(http_client)
  end
end
stop() click to toggle source
# File lib/ldclient-rb/impl/event_sender.rb, line 26
def stop
  @http_client_pool.dispose_all()
end