Active Support — часть ядра Rails, которая предоставляет расширение языка Ruby, утилиты и другие возможности. Она включает инструментарий API, который может использоваться внутри приложения, для отсле
Active Support — часть ядра Rails, которая предоставляет расширение языка Ruby, утилиты и другие возможности. Она включает инструментарий API, который может использоваться внутри приложения, для отслеживания определенных действий, которые возникают как в коде Ruby, так и внутри приложения Rails и самого фреймворка. Однако, она не ограничена Rails. При необходимости ее можно независимо использовать в других скриптах Ruby если вы желаете.
В этом руководстве вы научитесь использовать API инструментария Active Support для отслеживания событий внутри Rails или другого Ruby-кода.
После прочтения данного руководства вы будете знать:
Какой инструментарий предоставляется.
Как добавить подписчика к хуку.
Как увидеть тайминги от инструментария в браузере.
Какие есть хуки внутри фреймворка Rails для инструментария.
Как создать произвольную реализацию инструментария.
Инструментарий API, предоставленный Active Support, позволяет разработчикам создавать хуки, которыми могут пользоваться другие разработчики. Некоторые из них присутствуют в фреймворке Rails. С этим API, разработчики могут быть оповещены при возникновении определенного события в их приложении или другом коде Ruby.
Например, есть хук внутри Active Record который вызывается каждый раз когда Active Record использует запрос SQL к базе данных. На этот хук можно подписаться и использовать его для отслеживания количества запросов в течении определенного экшна. Есть другой хук, оборачивающий экшны контроллеров. Он может быть использован, например, для отслеживания, как долго выполнялся определенный экшн.
Уникальный ID для инструментария, запустившего это событие
Полезная нагрузка для события
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |name, started, finished, unique_id, data| # ваш собственный код Rails.logger.info "#{name} Received! (started: #{started}, finished: #{finished})" # process_action.action_controller Received (started: 2019-05-05 13:43:57 -0800, finished: 2019-05-05 13:43:58 -0800)end
Если вы беспокоитесь об аккуратности started и finished для вычисления точного прошедшего времени, используйте ActiveSupport::Notifications.monotonic_subscribe. Преданный блок получает те же аргументы, что и предыдущий, но started и finished получит значения более аккуратного монотонного времени вместо секундного дискретного времени.
ActiveSupport::Notifications.monotonic_subscribe "process_action.action_controller" do |name, started, finished, unique_id, data| # ваш собственный код Rails.logger.info "#{name} Received! (started: #{started}, finished: #{finished})" # process_action.action_controller Received (started: 1560978.425334, finished: 1560979.429234)end
Определение всех этих аргументов блока каждый раз может быть утомительно. Можно легко создать ActiveSupport::Notifications::Event из блока аргументов, например:
Вы можете также подписаться на события, соответствующие регулярному выражению. Это позволит вам подписаться на несколько событий за раз. Вот как можно подписаться на все события ActionController:
ActiveSupport::Notifications.subscribe(/action_controller/) do |*args| # Проверка всех событий ActionControllerend
Rails реализует стандарт Server Timing, чтобы сделать информацию о тайминге доступной в веб-браузере. Чтобы включить, отредактируйте конфигурацию среды (обычно development.rb, так как это используется в основном в development), чтобы включить следующее:
config.server_timing = true
Как только настроено (включая перезагрузку вашего сервера), можно пойти в панель Developer Tools вашего браузера, затем выбрать Network и перезагрузить вашу страницу. Затем можно выбрать любой запрос к серверу Rails, и увидеть тайминги сервера во вкладке таймингов. Пример этого можно увидеть в документации Firefox.
Добавить свои события очень просто. Active Support будет делать всю тяжелую работу за вас. Просто вызовите ActiveSupport::Notifications.instrument с name, payload и блоком. Уведомление будет отправлено после возвращения блока. Active Support сгенерирует время старта и окончания и добавит уникальный ID инструментария. Все данные переданные в вызов instrument будут выполнены в полезной нагрузке.
Пример:
ActiveSupport::Notifications.instrument "my.custom.event", this: :data do # Создание ваших пользовательских настроек тутend
Вы должны следовать соглашениям Rails при создании своих событий. Формат: event.library. Если ваше приложение отправляет Tweets, вы должны назвать событие tweet.twitter.