Class: Macmillan::Utils::StatsdMiddleware
- Inherits:
-
Object
- Object
- Macmillan::Utils::StatsdMiddleware
- Defined in:
- lib/macmillan/utils/statsd_middleware.rb
Overview
Rack Middleware for sending request timings and other statistics to StatsD.
This code is heavily inspired by github.com/manderson26/statsd/blob/master/lib/statsd/middleware.rb
Usage:
In config.ru:
require 'statsd'
require 'macmillan/utils/statsd_decorator'
require 'macmillan/utils/statsd_middleware'
statsd = Statsd.new('http://statsd.example.com', 8080)
statsd = Macmillan::Utils::StatsdDecorator.new(statsd, ENV['RACK_ENV'])
use Macmillan::Utils::StatsdMiddleware, client: statsd
By default this middleware will record timer and increment stats for all requests under the statsd/graphite namespace ‘rack.’ - i.e.
-
rack.timers.request - timers per request
-
rack.increments.request - increments per request
-
rack.http_status.request.<status code> - increment per request
-
rack.exception - increment upon error
Facilities are provided via StatsdControllerHelper to also log per-route metrics via this middleware.
Constant Summary collapse
- NAMESPACE =
'rack'.freeze
- TIMERS =
'statsd.timers'.freeze
- INCREMENTS =
'statsd.increments'.freeze
Instance Method Summary collapse
- #call(env) ⇒ Object
-
#initialize(app, opts = {}) ⇒ StatsdMiddleware
constructor
A new instance of StatsdMiddleware.
- #process(env) ⇒ Object
Constructor Details
#initialize(app, opts = {}) ⇒ StatsdMiddleware
Returns a new instance of StatsdMiddleware.
39 40 41 42 43 44 |
# File 'lib/macmillan/utils/statsd_middleware.rb', line 39 def initialize(app, opts = {}) raise ArgumentError, 'You must supply a StatsD client' unless opts[:client] @app = app @client = opts[:client] end |
Instance Method Details
#call(env) ⇒ Object
46 47 48 |
# File 'lib/macmillan/utils/statsd_middleware.rb', line 46 def call(env) dup.process(env) end |
#process(env) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/macmillan/utils/statsd_middleware.rb', line 50 def process(env) setup(env) (status, headers, body), response_time = call_with_timing(env) record_metrics(env, status, response_time) [status, headers, body] rescue => error @client.increment("#{NAMESPACE}.exception") raise error end |