class PhusionPassenger::ActiveSupport3Extensions::AnalyticsLogging::ExceptionLogger

def call(env)

def call(env)
	@app.call(env)
rescue Exception => e
	log_analytics_exception(env, e) if env[PASSENGER_TXN_ID]
	raise e
end

def initialize(app, analytics_logger, app_group_name)

def initialize(app, analytics_logger, app_group_name)
	@app = app
	@analytics_logger = analytics_logger
	@app_group_name = app_group_name
end

def log_analytics_exception(env, exception)

def log_analytics_exception(env, exception)
	log = @analytics_logger.new_transaction(
		@app_group_name,
		:exceptions,
		env[PASSENGER_UNION_STATION_KEY])
	begin
		request = ActionDispatch::Request.new(env)
		if request.parameters['controller']
			controller = request.parameters['controller'].humanize + "Controller"
			action = request.parameters['action']
		end
		
		request_txn_id = env[PASSENGER_TXN_ID]
		message = exception.message
		message = exception.to_s if message.empty?
		message = [message].pack('m')
		message.gsub!("\n", "")
		backtrace_string = [exception.backtrace.join("\n")].pack('m')
		backtrace_string.gsub!("\n", "")
		if action && controller
			controller_action = "#{controller}##{action}"
		else
			controller_action = controller
		end
		
		log.message("Request transaction ID: #{request_txn_id}")
		log.message("Message: #{message}")
		log.message("Class: #{exception.class.name}")
		log.message("Backtrace: #{backtrace_string}")
		log.message("Controller action: #{controller_action}") if controller_action
	ensure
		log.close
	end
end