2

I'm running a ruby app with grape (no rails) on heroku and am using the new relic addon. The app is forked with unicorn. As described here, I integrated this option to my configs. Here's my setup:

unicorn.rb:
worker_processes 3
preload_app true
timeout 30

config.ru:
if ENV['RACK_ENV'] == 'production'
  require 'newrelic_rpm'
end

The environment on heroku is set to production, so the file should be included properly. Furthermore, the heroku log files indicate that the new relic agent starts up successfully:

2013-04-08T10:47:47+00:00 heroku[deployhooks]: Notified New Relic about the deploy
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Reading configuration from config/newrelic.yml
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Environment: production
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Dispatcher: unicorn
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Application: mobile-v1-ruby
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Connecting workers after forking.
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Installing Net instrumentation
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Installing Unicorn instrumentation
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Detected Unicorn, please see additional documentation: https://newrelic.com/docs/troubleshooting/im-using-unicorn-and-i-dont-see-any-data
2013-04-08T10:47:49+00:00 app[web.1]: ** [NewRelic][04/08/13 10:47:49 +0000 eea5ecfd-86be-4b88-8b2a-6b7564aa9943 (2)] INFO : Finished instrumentation
2013-04-08T10:47:49+00:00 app[web.1]: Hey there - I started in environment: production
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.798057 #2]  INFO -- : listening on addr=0.0.0.0:58224 fd=9
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.798299 #2]  INFO -- : worker=0 spawning...
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.809140 #2]  INFO -- : worker=1 spawning...
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.812632 #5]  INFO -- : worker=0 spawned pid=5
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.816144 #2]  INFO -- : worker=2 spawning...
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.819594 #5]  INFO -- : worker=0 ready
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.821252 #9]  INFO -- : worker=1 spawned pid=9
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.823869 #2]  INFO -- : master process ready
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.826441 #9]  INFO -- : worker=1 ready
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.831072 #13]  INFO -- : worker=2 spawned pid=13
2013-04-08T10:47:49+00:00 app[web.1]: I, [2013-04-08T10:47:49.836053 #13]  INFO -- : worker=2 ready
2013-04-08T10:47:50+00:00 heroku[web.1]: State changed from starting to up

To me everything seems to work good. But on new relic, I only receive the deployment notifications. Does anybody have an idea?

Thank you very much.

2 Answers2

1

I was able to solve it now. Thanks for all your help, guys! It's working with developer mode, grape requests showing up and database requests to mongodb via mongoid.

Guess what: One of the worst problems was the string comparison in my conditional loadings:

if ENV['RACK_ENV'] == "production"

The quals with == doesn't seem to work. I changed that to the .eql?() method plus some reloading stuff with newrelic instrumentation and now everything works magically :D Awesome!

if ENV['RACK_ENV'].eql?("production")

Here's my working setup:

Gemfile

gem "newrelic-grape"
gem "newrelic_moped"
gem "newrelic_rpm"

config.ru

run MyApp.new

if ENV["NEW_RELIC_ENABLE"].eql?("true")

    if ENV["RACK_ENV"].eql?("development")
      puts "Loading NewRelic in developer mode ..."
      require "new_relic/rack/developer_mode"
      use NewRelic::Rack::DeveloperMode
    end

    if !ENV["RACK_ENV"].eql?("test")
        NewRelic::Agent.manual_start
        DependencyDetection.detect!
    end

end

This loads new relic in developer mode if the RACK_ENV is defined properly. Otherwise, it starts regulary except if in test mode.

The biggest problem here was the missing command NewRelic::Agent.manual_start and the DependencyDetection.detect!

The api.rb class includes now the Rack instrumentation if new relic was enabled.

api.rb

if !ENV['RACK_ENV'].eql?("test") && ENV['NEW_RELIC_ENABLE'].eql?("true")
    include NewRelic::Agent::Instrumentation::Rack
end
0

New Relic doesn't (currently) have auto-detection for Grape, so it's likely you'll have to install the NR rack middleware yourself. It should just be a matter of an include in your Grape::API class:

class My::API < Grape::API
  include NewRelic::Agent::Instrumentation::Rack

  # ...

end

For more in-depth details, the API docs for the Rack instrumentation is a good place to start.

Michael Granger
  • 1,358
  • 9
  • 14
  • I also just found out that there's a [newrelic-grape](http://rubygems.org/gems/newrelic-grape) gem, and the README for it references a [blog post](http://artsy.github.io/blog/2012/11/29/measuring-performance-in-grape-apis-with-new-relic/) that looks like it describes exactly what you want. – Michael Granger Apr 19 '13 at 22:24
  • Thank you very much. I'll give that a try and report back! – Sebastian Julius May 07 '13 at 08:06