21

I am using rack-mini-profiler in my rails 3.2 project.

In gemfile:

gem 'rack-mini-profiler'

Everything works great. But my application is mostly a set of json endpoints. So while it is very useful to be to able to inspect the performance of html pages, I would like to also be able to see the performance of controllers that return json.

Example of my controller:

class UsersController < BaseController
  def json_method
    # you don't see the mini profiler ui for this controller
    render json: { users: [:foo, :bar]}
  end
end

If I go to localhost:3000/users/json_method, I see my json response but not the profiler ui.

Benjamin Crouzier
  • 40,265
  • 44
  • 171
  • 236

5 Answers5

23

In development, by default, the rack-mini-profiler gem collects the previous JSON call and presents it in the menu accessible from the HTML page. No code change required.

So, make your JSON request, then hit any other HTML page and it will be available in the list. We use this to great effect. If your Rails app is a JSON API service only, make sure you have a 404.html in your public folder at least, then hit something like:

http://localhost/404.html
hlascelles
  • 1,061
  • 11
  • 15
  • 2
    Have two tabs open: one for the JSON, the other for any page that *isn't* JSON. Make the JSON call, then refresh the page that isn't JSON and voilà, the JSON call will be near the top. It's not the most efficient thing, but it definitely works! – Chris Cirefice May 17 '16 at 01:49
9

In the second tab, you can visit this URL /rack-mini-profiler/requests Where you can see the last request log

Sanjay Prajapati
  • 789
  • 1
  • 8
  • 17
6

if rack mini profiler can’t display the results, it will collect them until it can on the next HTML page. So, the solution that I am using is to:

make the JSON request and then hit an HTML page of my choice. The results will appear, along with the most recent HTML profile.

http://tech.eshaiju.in/blog/2016/02/25/profile-api-endpoints-using-rack-mini-profiler/

eshaiju
  • 753
  • 5
  • 16
1

As a first solution, you can just set the format to html, and render inside the html page:

The controller:

class UsersController < BaseController
  def json_method
    @users_json { users: [:foo, :bar]}
    render 'index', formats: ['html']
  end
end

And in app/views/users/index.html.erb:

Users:<br/>
<%= @json.inspect %>

I don't care so much about my json result, now I have the profiling ui.

A solution where I have the profiling ui without changing my controller would be much better.

Benjamin Crouzier
  • 40,265
  • 44
  • 171
  • 236
1

Note that in a new Rails API project initialized using rails new api_name --api, the ApplicationController inherits from ActionController::API, instead of ActionAcontroller::Base. In this case, mini-profiler might not load when your HTML page is shown.

I had to change the base class to ActionController::Base to make it work. If in your app you see no requests to load resources from mini-profiler on your HTML page, you may want to try this change. Took me a long while to figure out.

Also note that you do need to have at least the <body> tag in your template to be rendered, otherwise the mini-profiler divs will not be properly injected.

xji
  • 7,341
  • 4
  • 40
  • 61