Sha256: ddc57a66382aa591c7a5c624991c127429e44ee3eef5f47c172b3889e4292d1b

Contents?: true

Size: 1.98 KB

Versions: 7

Compression:

Stored size: 1.98 KB

Contents

require 'appsignal'

module Appsignal::Integrations
  module PadrinoPlugin
    def self.init
      Appsignal.logger.info("Loading Padrino (#{Padrino::VERSION}) integration")

      root             = Padrino.mounted_root
      Appsignal.config = Appsignal::Config.new(
        root,
        Padrino.env,
        :log_path => File.join(root, 'log')
      )

      Appsignal.start_logger
      Appsignal.start
    end
  end
end

module Padrino::Routing::InstanceMethods
  alias route_without_appsignal route!

  def route!(base=settings, pass_block=nil)
    if !Appsignal.active? || env['sinatra.static_file']
      route_without_appsignal(base, pass_block)
      return
    end

    transaction = Appsignal::Transaction.create(
      SecureRandom.uuid,
      Appsignal::Transaction::HTTP_REQUEST,
      request
    )
    begin
      Appsignal.instrument('process_action.padrino') do
        route_without_appsignal(base, pass_block)
      end
    rescue => error
      transaction.set_error(error)
      raise error
    ensure
      transaction.set_action(get_payload_action(request))
      transaction.set_metadata('path', request.path)
      transaction.set_metadata('method', request.request_method)
      transaction.set_http_or_background_queue_start
      Appsignal::Transaction.complete_current!
    end
  end

  def get_payload_action(request)
    # Short-circut is there's no request object to obtain information from
    return "#{settings.name}" if request.nil?

    # Older versions of Padrino work with a route object
    route_obj = defined?(request.route_obj) && request.route_obj
    if route_obj && route_obj.respond_to?(:original_path)
      return "#{settings.name}:#{request.route_obj.original_path}"
    end

    # Newer versions expose the action / controller on the request class
    request_data = request.respond_to?(:action) ? request.action : request.fullpath
    "#{settings.name}:#{request.controller}##{request_data}"
  end
end

Padrino.after_load do
  Appsignal::Integrations::PadrinoPlugin.init
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
appsignal-2.0.6 lib/appsignal/integrations/padrino.rb
appsignal-2.0.5 lib/appsignal/integrations/padrino.rb
appsignal-2.0.5.beta.1 lib/appsignal/integrations/padrino.rb
appsignal-2.1.0.alpha.3 lib/appsignal/integrations/padrino.rb
appsignal-2.1.0.alpha.2 lib/appsignal/integrations/padrino.rb
appsignal-2.1.0.alpha.1 lib/appsignal/integrations/padrino.rb
appsignal-2.0.4 lib/appsignal/integrations/padrino.rb