diff --git a/README.rdoc b/README.rdoc index 1d80c1b..8702874 100644 --- a/README.rdoc +++ b/README.rdoc @@ -64,6 +64,10 @@ For activerecord instantiation counts only: Rails.application.middleware.use( Oink::Middleware, :instruments => :activerecord ) +Environment variables can also be logged by specifying `env_vars`. This is especially handy for displaying request ID or REQUEST_URI from the Rails `env` object. + + Rails.application.middleware.use( Oink::Middleware, :env_vars => ['action_dispatch.request_id', 'REQUEST_ID'] ) + Note that the previous way of configuring oink, as a set of modules to include into rails controllers, is deprecated. == Analyzing logs diff --git a/lib/oink/middleware.rb b/lib/oink/middleware.rb index 2b08b4f..7c7d057 100644 --- a/lib/oink/middleware.rb +++ b/lib/oink/middleware.rb @@ -9,6 +9,7 @@ def initialize(app, options = {}) @app = app @logger = options[:logger] || Hodel3000CompliantLogger.new("log/oink.log") @instruments = options[:instruments] ? Array(options[:instruments]) : [:memory, :activerecord] + @env_vars = options[:env_vars] ? Array(options[:env_vars]) : [] Oink.extend_active_record! if @instruments.include?(:activerecord) end @@ -17,6 +18,7 @@ def call(env) status, headers, body = @app.call(env) log_routing(env) + log_environment(env) log_memory log_activerecord log_completed @@ -36,6 +38,16 @@ def log_routing(env) end end + def log_environment(env) + return if @env_vars.empty? + env_message = @env_vars.map do |key| + value = env[key] + display_value = value.inspect if value && value.respond_to?(:inspect) + "#{key.inspect}: #{display_value}" + end.join(', ') + @logger.info("Environment: {#{env_message}}") + end + def log_memory if @instruments.include?(:memory) memory = Oink::Instrumentation::MemorySnapshot.memory diff --git a/spec/oink/middleware_spec.rb b/spec/oink/middleware_spec.rb index 7f04bd7..026bc15 100644 --- a/spec/oink/middleware_spec.rb +++ b/spec/oink/middleware_spec.rb @@ -58,6 +58,17 @@ def call(env) end end + context "include specified environment variables in the oink log" do + let(:app) do + Oink::Middleware.new(SampleApplication.new, :logger => logger, :env_vars => ['action_dispatch.request_id']) + end + + it "includes specified environment variables" do + get "/no_pigs", {}, {"action_dispatch.request_id" => "4cc822f8-0d85-4d80-bcae-d94a4567e06c"} + log_output.string.should include('Environment: {"action_dispatch.request_id": "4cc822f8-0d85-4d80-bcae-d94a4567e06c"}') + end + end + it "reports 0 totals" do get "/no_pigs" log_output.string.should include("Instantiation Breakdown: Total: 0")