Как профилировать контроллер 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, теперь у меня есть пользовательский интерфейс.

Решение, в котором у меня есть профилирующий интерфейс без смены контроллера, было бы намного лучше.

Другие вопросы по тегам