Simple::Metrics

A simple JRuby wrapper around Coda's Metrics package

Installation

Add this line to your application's Gemfile:

gem 'simple-metrics'

And then execute:

$ bundle

Or install it yourself as:

$ gem install simple-metrics

Healthchecks

Register a new healthcheck

class NurseRatched
  extend Simple::Metrics::Healthchecks

  attr_accessor :temp

  new_healthcheck("temperature") do
    if @temp = 98
      Simple::Metrics::HEALTHY
    elsif @temp > 101
      Simple::Metrics::UNHEALTHY.new("Fever!")
    else
      Simple::Metrics::WARNING
    end
  end
end

Run all healthchecks:

NurseRatched.run_all_healthchecks

In a Sinatra/Padrino app, register healthchecks as an extension like so:

register Simple::Metrics::Healthchecks

Timers

class Samovar
  include Simple::Metrics

  def buh
    timer("tea time") do
      "Brewing..."
    end
  end
end

Meters

class Rdio
  extend Simple::Metrics::Meter

  define_meter :bump

  def bump_dat
    bump_meter.mark
  end
end

Send metrics directly to graphite

In a Sinatra app:

register Simple::Metrics::Graphite

enable_graphite_reporter("graphite.example.com", 2003, "services.#{RACK_ENV}")

Exposing metrics from within your app

In order to view the metrics from your application, you'll need to add the servlet endpoints. For this example, I'm using Warbler to package the application as a .war

In config/web.xml, add the following servlet mappings:

  <servlet>
    <servlet-name>metrics.MetricsServlet</servlet-name>
    <servlet-class>com.yammer.metrics.reporting.MetricsServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>metrics.MetricsServlet</servlet-name>
    <url-pattern>/metrics</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>metrics.HealthCheckServlet</servlet-name>
    <servlet-class>com.yammer.metrics.reporting.HealthCheckServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>metrics.HealthCheckServlet</servlet-name>
    <url-pattern>/healthcheck</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>metrics.ThreadDumpServlet</servlet-name>
    <servlet-class>com.yammer.metrics.reporting.ThreadDumpServlet</servlet-class>
    <url-pattern>/threads</url-pattern>
  </servlet>

  <servlet>
    <servlet-name>metrics.PingServlet</servlet-name>
    <servlet-class>com.yammer.metrics.reporting.PingServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>metrics.PingServlet</servlet-name>
    <url-pattern>/ping</url-pattern>
  </servlet-mapping>

Now you can visit your application and get a thread dump:

> curl localhost:9292/threads
  main id=1 state=WAITING
  - waiting on <0x073772c5> (a java.lang.Object)
  - locked <0x073772c5> (a java.lang.Object)
  at java.lang.Object.wait(Native Method)