lib/zuora_connect/railtie.rb



require 'middleware/metrics_middleware'

module ZuoraConnect
  class Railtie < Rails::Railtie


    config.before_initialize do
      version = Rails.version
      if version >= "5.0.0"
        ::Rails.configuration.public_file_server.enabled = true
      elsif version >= "4.2.0"
        ::Rails.configuration.serve_static_files = true
      else
        ::Rails.configuration.serve_static_assets = true
      end
      ::Rails.configuration.action_dispatch.x_sendfile_header = nil
    end

    if defined? Prometheus
      initializer "prometheus.configure_rails_initialization" do |app|
        app.middleware.use Prometheus::Middleware::Exporter,(options ={:path => '/connect/internal/metrics'})
      end
    end
    initializer "zuora_connect.configure_rails_initialization" do |app|
      app.middleware.insert_after Rack::Sendfile, Middleware::MetricsMiddleware
    end

    # hook to process_action
    ActiveSupport::Notifications.subscribe('process_action.action_controller', Middleware::PageRequest.new)

    initializer(:rails_stdout_logging, before: :initialize_logger) do
      if Rails.env != 'development' && !ENV['DEIS_APP'].blank?
        require 'lograge'
        logger           = ActiveSupport::Logger.new(STDOUT)
        logger.formatter = ::Logger::Formatter.new
        # logger.formatter  = proc do |severity, datetime, progname, msg|
        #   {severity: severity, time: datetime.strftime('%FT%T.%6N'), process_id: Process.pid, message: msg }.to_json
        # end
        Rails.configuration.logger = ActiveSupport::TaggedLogging.new(logger)
        Rails.configuration.log_tags = [:uuid]
        Rails.configuration.lograge.enabled = true
        Rails.configuration.lograge.formatter = Lograge::Formatters::Json.new
        Rails.configuration.lograge.custom_options = lambda do |event|
          exceptions = %w(controller action format id)
          items = {
            #time: event.time.strftime('%FT%T.%6N'),  
            params: event.payload[:params].except(*exceptions),
            exception: event.payload[:exception],
            exception_object: event.payload[:exception_object],
            process_id: Process.pid
          }
          if Thread.current[:appinstance].present? 
            items.merge({appinstance_id: Thread.current[:appinstance].id, connect_user: Thread.current[:appinstance].connect_user, new_session: Thread.current[:appinstance].new_session_message})
          end
        end
      end
    end
  end
end