Как профилировать контроллер rails, который возвращает ответ json, с помощью стоечного мини-профилировщика?
Я использую мини-профилирование в моем проекте 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, но не пользовательский интерфейс профилировщика.
5 ответов
В разработке по умолчанию гем стоечного мини-профилировщика собирает предыдущий вызов JSON и представляет его в меню, доступном со страницы HTML. Изменение кода не требуется.
Итак, сделайте запрос JSON, затем нажмите любую другую HTML-страницу, и она будет доступна в списке. Мы используем это с большим эффектом. Если ваше Rails-приложение является только службой JSON API, убедитесь, что у вас есть хотя бы 404.html в общей папке, а затем нажмите что-то вроде:
http://localhost/404.html
На второй вкладке вы можете посетить этот URL
/rack-mini-profiler/requests
Где вы можете увидеть журнал последнего запроса
Если профилировщик мини стойки не может отобразить результаты, он будет собирать их до следующей страницы HTML. Итак, решение, которое я использую, заключается в следующем:
сделайте запрос JSON, а затем нажмите HTML-страницу по моему выбору. Результаты появятся вместе с самым последним профилем HTML.
http://tech.eshaiju.in/blog/2016/02/25/profile-api-endpoints-using-rack-mini-profiler/
Обратите внимание, что в новом проекте Rails API, инициализированном с помощью rails new api_name --api
, ApplicationController
наследует от ActionController::API
, вместо ActionAcontroller::Base
, В этом случае мини-профилировщик может не загружаться, когда отображается ваша HTML-страница.
Я должен был изменить базовый класс на ActionController::Base
чтобы это работало. Если в вашем приложении вы не видите запросов на загрузку ресурсов из мини-профилировщика на вашей HTML-странице, вы можете попробовать это изменение. Мне понадобилось много времени, чтобы понять.
Также обратите внимание, что вам нужно иметь как минимум <body>
тег в вашем шаблоне, который будет отображен, иначе div-профили мини-профайлера не будут введены должным образом.
В качестве первого решения вы можете просто установить формат html и визуализировать внутри html-страницы:
Контроллер:
class UsersController < BaseController
def json_method
@users_json { users: [:foo, :bar]}
render 'index', formats: ['html']
end
end
И в app/views/users/index.html.erb:
Users:<br/>
<%= @json.inspect %>
Меня не волнует результат JSON, теперь у меня есть пользовательский интерфейс.
Решение, в котором у меня есть профилирующий интерфейс без смены контроллера, было бы намного лучше.