class LogjamAgent::Middleware

Public Class Methods

new(app, framework = :rails) click to toggle source
# File lib/logjam_agent/middleware.rb, line 3
def initialize(app, framework = :rails)
  @app = app
  @framework = framework
  unless %i{rails sinatra}.include?(framework)
    raise ArgumentError.new("Invalid logjam_agent framework: #{framework}. Only :rails and :sinatra are valid!")
  end
  @reraise = defined?(Rails::Railtie) && Rails.env.test?
end

Public Instance Methods

call(env) click to toggle source
# File lib/logjam_agent/middleware.rb, line 12
def call(env)
  env["logjam_agent.framework"] = @framework
  strip_encoding_from_etag(env)
  request = start_request(env)
  result = @app.call(env)
  result[1] ||= {}
  result
rescue Exception
  result = [500, {'Content-Type' => 'text/html'}, ["<html><body><h1>500 Internal Server Error</h1></body></html>"]]
  raise if @reraise
ensure
  headers = result[1]
  headers["X-Logjam-Request-Id"] = request.id
  if env["sinatra.static_file"]
    request.fields[:action] = "Sinatra#static_file"
  end
  unless (request_action = request.fields[:action]).blank?
    headers["X-Logjam-Request-Action"] = request_action
  end
  unless (caller_id = request.fields[:caller_id]).blank?
    headers["X-Logjam-Caller-Id"] = caller_id
  end
  finish_request(env)
end

Private Instance Methods

finish_request(env) click to toggle source
# File lib/logjam_agent/middleware.rb, line 61
def finish_request(env)
  LogjamAgent.finish_request(env["time_bandits.metrics"])
end
start_request(env) click to toggle source
# File lib/logjam_agent/middleware.rb, line 48
def start_request(env)
  app_name      = env["logjam_agent.application_name"] || LogjamAgent.application_name
  env_name      = env["logjam_agent.environment_name"] || LogjamAgent.environment_name
  caller_id     = env["HTTP_X_LOGJAM_CALLER_ID"] || ""
  caller_action = env["HTTP_X_LOGJAM_ACTION"] || ""
  trace_id      = env["HTTP_X_LOGJAM_TRACE_ID"] || ""
  extra_fields = {}
  extra_fields[:caller_id] = caller_id if caller_id.present?
  extra_fields[:caller_action] = caller_action if caller_action.present?
  extra_fields[:trace_id] = trace_id if trace_id.present?
  LogjamAgent.start_request(app_name, env_name, extra_fields)
end
strip_encoding_from_etag(env) click to toggle source
# File lib/logjam_agent/middleware.rb, line 39
def strip_encoding_from_etag(env)
  # In some versions, Apache is appending the content encoding,
  # like gzip to the ETag-Response-Header, which will cause the
  # Rack::ConditionalGet middleware to never match.
  if env["HTTP_IF_NONE_MATCH"] =~ /\A(.*)-\w+(\")\z/
    env["HTTP_IF_NONE_MATCH"] = $1 + $2
  end
end