Class: SessionVision::Transport
- Inherits:
-
Object
- Object
- SessionVision::Transport
- Defined in:
- lib/sessionvision/transport.rb
Constant Summary collapse
- TIMEOUT_OPEN =
10- TIMEOUT_READ =
15
Instance Method Summary collapse
-
#initialize(ingest_host:, max_retries: 3, retry_delays: [1, 2, 4], gzip_threshold: 1024, on_error: nil, logger: nil) ⇒ Transport
constructor
A new instance of Transport.
- #send_batch(project_token, events) ⇒ Object
Constructor Details
#initialize(ingest_host:, max_retries: 3, retry_delays: [1, 2, 4], gzip_threshold: 1024, on_error: nil, logger: nil) ⇒ Transport
Returns a new instance of Transport.
15 16 17 18 19 20 21 22 23 |
# File 'lib/sessionvision/transport.rb', line 15 def initialize(ingest_host:, max_retries: 3, retry_delays: [1, 2, 4], gzip_threshold: 1024, on_error: nil, logger: nil) @url = URI("#{ingest_host}/api/v1/ingest/events") @max_retries = max_retries @retry_delays = retry_delays @gzip_threshold = gzip_threshold @on_error = on_error @logger = logger end |
Instance Method Details
#send_batch(project_token, events) ⇒ Object
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/sessionvision/transport.rb', line 25 def send_batch(project_token, events) payload = JSON.generate({ "projectToken" => project_token, "events" => events }) body = payload.encode("utf-8") headers = { "Content-Type" => "application/json" } if body.bytesize > @gzip_threshold body = gzip_compress(body) headers["Content-Encoding"] = "gzip" end last_error = nil (1 + @max_retries).times do |attempt| begin response = post(body, headers) status = response.code.to_i if status >= 200 && status < 300 @logger&.debug("Batch sent successfully (#{events.length} events)") return true elsif status >= 400 && status < 500 @logger&.warn("Client error #{status}, not retrying") call_on_error(RuntimeError.new("HTTP #{status}"), project_token, events) return false else last_error = RuntimeError.new("HTTP #{status}") @logger&.debug("Server error #{status} on attempt #{attempt + 1}/#{1 + @max_retries}") end rescue StandardError => e last_error = e @logger&.debug("Network error on attempt #{attempt + 1}/#{1 + @max_retries}: #{e.}") end if attempt < @max_retries delay = attempt < @retry_delays.length ? @retry_delays[attempt] : @retry_delays.last sleep(delay) end end @logger&.warn("Failed to send batch after #{@max_retries} retries") call_on_error(last_error, project_token, events) if last_error false end |