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