Уменьшить бревна 5 - PullRequest
       3

Уменьшить бревна 5

1 голос
/ 23 января 2020

У меня есть приложение Rails 5, которое прослушивает события от стороннего сервиса. Этот сторонний сервис постоянно передает события, которые отправляют несколько запросов моему приложению, и в результате появляется множество журналов запросов, которые в большинстве случаев не имеют значения. Я хочу иметь возможность полностью исключить журналы запросов и вести журнал только для тех релевантных событий, которые можно обработать, но для нерелевантных событий нет записи в журнал точек.

Поэтому у меня есть EventController с действием create. Это действие

class EventsController
  before_action :ensure_valid_event, only: :create

  def create
    ...
    process_event
    ...
  end

  private

  def ensure_valid_event
    unless Event.exists?(event_name: params[:event])
      head :ok
    end
  end

end

Как лучше всего go обойтись без драгоценного камня?

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Вы можете создать промежуточное программное обеспечение, которое будет фильтровать запросы:

class FilterEventsMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['PATH_INFO'] =~ %r{\A/your/events/endpoint_path}
      # event name extraction may be different depending on how they are passed
      request = ActionDispatch::Request.new env
      event_name = request.params[:event]

      return [200, {"Content-Type" => "text/plain"}, ['']] unless Event.exists?(name: event_name)
    end
    @call.call(env)
  end
end

config.middleware.insert_before Rails::Rack::Logger, FilterEventsMiddleware

таким образом, нет причин отключать ведение журнала всего приложения, нерелевантные события не будут попадать на контроллер вообще

0 голосов
/ 23 января 2020

Самый простой способ go об этом, и я думаю, что мы поможем вашему делу, это:

  1. Полностью отключить ведение журнала из файла конфигурации / сред
  2. Повторно включить ведение журнала для действия создания только для допустимых событий

Чтобы отключить ведение журнала, отредактируйте нужный файл конфигурации среды. Например: config/environments/production.rb и замените строку config.logger следующим:

config.logger = Logger.new("/dev/null")

Теперь в вашем events_controller сделайте:

class EventsController

  before_action :enable_logging, only: :create
  after_action :disable_logging, only: :create

  private

  def enable_logging
    if valid_event?
      Rails.logger = ActiveSupport::Logger.new(STDOUT)
    end
  end

  def disable_logging
    Rails.logger = Logger.new("/dev/null")
  end

  def valid_event?
    Event.exists?(name: params[:event])
  end
end
...