---
title: Metal controller instrumentation
source: https://docs.newrelic.com/docs/apm/agents/ruby-agent/frameworks/metal-controller-instrumentation
---

By default, the New Relic Ruby agent does not instrument `ActionController::Metal` controllers. This is in keeping with the philosophy that the Metal controller provides only the bare minimum interface needed to deliver a valid Rack app. It's generally up to you to embellish the Metal Controllers as needed. This document describes how to have these controller actions appear on the [APM **Transactions** page](https://docs.newrelic.com/docs/apm/applications-menu/monitoring/transactions-page) and overviews alongside those inheriting from `ApplicationController` for Rails 3 apps or higher.

## Rails 4.0 or higher [#rails4]

Starting with Rails 4.0, New Relic's controller instrumentation uses `ActiveSupport::Notifications`. Including the `ActionController::Instrumentation` module ensures that controller events are fired from your Metal controller. This enables New Relic to instrument those actions.

```ruby
class PlatinumController < ActionController::Metal
  include ActionController::Rendering

  def show
    render :text => "Here is some text"
  end

  # Ensure ActiveSupport::Notifications events are fired
  include ActionController::Instrumentation

  # Uncomment the following line to include New Relic helper methods, such as newrelic_ignore or add_method_tracer
  # include NewRelic::Agent::Instrumentation::ControllerInstrumentation
end
```

## Rails 3.0 through 3.2 [#rails3]

### Method 1

The following method auto-instruments all Metal controller actions just as with the Base Controller.

Include `NewRelic::Agent::Instrumentation::ControllerInstrumentation` and `NewRelic::Agent::Instrumentation::Rails3::ActionController` at the bottom of your Metal Controller classes:

```ruby
class SteelController < ActionController::Metal
  include ActionController::Rendering

  def show
    render :text => "Here is some text"
  end

  include NewRelic::Agent::Instrumentation::ControllerInstrumentation
  include NewRelic::Agent::Instrumentation::Rails3::ActionController
end
```

### Method 2

The following example enables you to opt in to tracing only specific action methods of the Metal controller.

Include `NewRelic::Agent::Instrumentation::ControllerInstrumentation` and call `add_transaction_tracer` for each method instrumentation:

```ruby
class SteelController < ActionController::Metal
  include ActionController::Rendering
  include NewRelic::Agent::Instrumentation::ControllerInstrumentation

  def show
    render :text => "Here is some text"
  end
  add_transaction_tracer :show
end
```

### Method 3

The final example is a more general way of adding tracing of the method that will work in any class, not just Metal Controller class.

Include `NewRelic::Agent::MethodTracer` and call `add_method_tracer` for each method instrumentation:

```ruby
class SteelController < ActionController::Metal
  include ActionController::Rendering
  include NewRelic::Agent::MethodTracer

  def show
    render :text => "Here is some text"
  end
  add_method_tracer :show
end
```

## Rails 2.3 [#rails2]

If you use the `Rails::Rack::Metal` class from Rails 2, you can instrument calls to your Metals as follows:

```ruby
require 'newrelic_rpm'

class MyMetal < Rails::Rack::Metal
  def self.call(env)
    # ... your metal code ...
  end

  class << self
    include NewRelic::Agent::Instrumentation::ControllerInstrumentation
    add_transaction_tracer :call
  end
end
```
