This is a Ruby version of performance metrics inspired by metrics developed by Coda Hale at Yammer. Currently this is under heavy development -- it needs Gem packaging, more features, validation of metrics, more functional testing, and a little better test coverage. Pull requests happily accepted, please include docs and tests where possible!
Among other important things, this needs to be made more thread-safe. I'm currently looking at Mr. Nutter's ruby-atomic gem for making this less tedious but any suggestions are welcome!
Right now, I have:
- Counters
- Meters
- Gauges
- Histograms w/ uniform sampling
- Histograms w/ exponentially decaying sampling
- Timers
The goal of ruby-metrics is to get up and running quickly. You start an agent, register some instruments, and they're exported over HTTP via JSON. For example, getting started with a counter would look like this:
@metrics = Metrics::Agent.new
counter = @metrics.counter :my_counter
counter.incr
counter.incr
puts @metrics.to_json
#=> {"my_counter":"2"}
Integrating ruby-metrics into existing applications is entirely up to your needs. Provided options include:
-
Embedded WEBrick listener:
This runs a background thread and enables HTTP access to a local port (8001 by default) for a JSON representation of the current metrics.
require 'ruby-metrics/integration/webrick'
@agent = Metrics::Agent.new
@agent.start(:port => 8081)
-
Rack Middleware:
This will add metrics such as
requests
(a timer) as well as counters for each class of HTTP status code (1xx, 2xx, etc). Also counts uncaught exceptions before reraising. Provides a configurable path option (:show
) to trigger the return of the metrics (as JSON) when the request path matches exactly (a string), as a regular expression, or as any object that responds tocall
for custom logic (passed the wholeenv
).
require 'ruby-metrics'
@agent = Metrics::Agent.new
use Metrics::Integration::Rack::Middleware, :agent => @agent, :show => '/stats'
run app
-
Rack Endpoint:
Use this to expose an endpoint for external consumption for your metrics. Works best when used with a URLMap or mounted in addition to other routes, like Rails'
mount
route matcher.
require 'ruby-metrics'
@agent = Metrics::Agent.new
run Metrics::Integration::Rack::Endpoint.new(:agent => @agent)
or
# in config/router.rb
mount Metrics::Integration::Rack::Endpoint.new(:agent => @agent)
Copyright 2011-2014 John Ewart [email protected]. Released under the MIT license. See the file LICENSE for further details.