Как профилировать контроллер рельсов, который возвращает ответ json с помощью стойки-мини-профилировщика?
Я использую rack-mini-profiler в моем проекте rails 3.2.
В gemfile:
gem 'rack-mini-profiler'
Все отлично работает. Но мое приложение в основном представляет собой набор конечных точек json. Поэтому, хотя очень полезно быть в состоянии проверить производительность html-страниц, я также хотел бы видеть производительность контроллеров, которые возвращают json.
Пример моего контроллера:
class UsersController < BaseController
def json_method
# you don't see the mini profiler ui for this controller
render json: { users: [:foo, :bar]}
end
end
Если я перейду к localhost:3000/users/json_method
, я увижу свой ответ json, но не профайлер ui.
Ответы
Ответ 1
В разработке, по умолчанию, сборщик-мини-профайлер собирает предыдущий вызов JSON и представляет его в меню, доступном с HTML-страницы. Не требуется изменение кода.
Итак, сделайте свой запрос JSON, затем нажмите любую другую HTML-страницу, и она будет доступна в списке. Мы используем это для большого эффекта. Если ваше приложение Rails является только службой API JSON, убедитесь, что у вас есть 404.html в вашей общей папке, а затем нажмите что-то вроде:
http://localhost/404.html
Ответ 2
Если стойка mini profiler не может отображать результаты, она будет собирать их до тех пор, пока она не появится на следующей странице HTML. Итак, решение, которое я использую, это:
сделать запрос JSON и
затем нажмите страницу HTML по моему выбору.
Появятся результаты вместе с последним профилем HTML.
http://tech.eshaiju.in/blog/2016/02/25/profile-api-endpoints-using-rack-mini-profiler/
Ответ 3
В качестве первого решения вы можете просто установить формат html и отобразить внутри html-страницы:
Контроллер:
class UsersController < BaseController
def json_method
@users_json { users: [:foo, :bar]}
render 'index', formats: ['html']
end
end
И в приложении /views/users/index.html.erb:
Users:<br/>
<%= @json.inspect %>
Мне все равно, о моем json-результате, теперь у меня профилирование ui.
Решение, в котором у меня есть профилирование ui без изменения моего контроллера, будет намного лучше.
Ответ 4
Обратите внимание, что в новом проекте Rails API, инициализированном с использованием rails new api_name --api
, ApplicationController
наследуется от ActionController::API
вместо ActionAcontroller::Base
. В этом случае мини-профилировщик может не загружаться, когда отображается ваша HTML-страница.
Мне пришлось изменить базовый класс на ActionController::Base
чтобы он работал. Если в вашем приложении вы не видите запросов на загрузку ресурсов из мини-профилировщика на вашей HTML-странице, вы можете попробовать это изменение. Мне понадобилось много времени, чтобы понять.
Также обратите внимание, что для визуализации в вашем шаблоне должен быть хотя бы <body>
, в противном случае элементы div для мини-профилирования будут вставлены неправильно.