Class: Macmillan::Utils::StatsdMiddleware

Inherits:
Object
  • Object
show all
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

Constructor Details

#initialize(app, opts = {}) ⇒ StatsdMiddleware

Returns a new instance of StatsdMiddleware.

Raises:

  • (ArgumentError)


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