Class: Appsignal::Rack::StreamingListener Private

Inherits:
Object
  • Object
show all
Defined in:
lib/appsignal/rack/streaming_listener.rb

Overview

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Appsignal module that tracks exceptions in Streaming rack responses.

Instance Method Summary collapse

Constructor Details

#initialize(app, options = {}) ⇒ StreamingListener

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of StreamingListener.



9
10
11
12
13
# File 'lib/appsignal/rack/streaming_listener.rb', line 9

def initialize(app, options = {})
  Appsignal.logger.debug "Initializing Appsignal::Rack::StreamingListener"
  @app = app
  @options = options
end

Instance Method Details

#call(env) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



15
16
17
18
19
20
21
# File 'lib/appsignal/rack/streaming_listener.rb', line 15

def call(env)
  if Appsignal.active?
    call_with_appsignal_monitoring(env)
  else
    @app.call(env)
  end
end

#call_with_appsignal_monitoring(env) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



23
24
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
# File 'lib/appsignal/rack/streaming_listener.rb', line 23

def call_with_appsignal_monitoring(env)
  request = ::Rack::Request.new(env)
  transaction = Appsignal::Transaction.create(
    SecureRandom.uuid,
    Appsignal::Transaction::HTTP_REQUEST,
    request
  )

  # Instrument a `process_action`, to set params/action name
  status, headers, body =
    Appsignal.instrument("process_action.rack") do
      begin
        @app.call(env)
      rescue Exception => e # rubocop:disable Lint/RescueException
        transaction.set_error(e)
        raise e
      ensure
        transaction.set_action_if_nil(env["appsignal.action"])
        transaction.("path", request.path)
        transaction.("method", request.request_method)
        transaction.set_http_or_background_queue_start
      end
    end

  # Wrap the result body with our StreamWrapper
  [status, headers, StreamWrapper.new(body, transaction)]
end