Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Merge pull request #228 from lostisland/instrumentation

add instrumentation middleware.
  • Loading branch information...
commit f978e771b5c7c4a795f5b3ba9a3c6bf8c0c03535 2 parents 5d6faf7 + 4b30bf8
@technoweenie authored
View
3  lib/faraday/request.rb
@@ -18,7 +18,8 @@ class Request < Struct.new(:method, :path, :params, :headers, :body, :options)
:retry => [:Retry, 'retry'],
:authorization => [:Authorization, 'authorization'],
:basic_auth => [:BasicAuthentication, 'basic_authentication'],
- :token_auth => [:TokenAuthentication, 'token_authentication']
+ :token_auth => [:TokenAuthentication, 'token_authentication'],
+ :instrumentation => [:Instrumentation, 'instrumentation']
def self.create(request_method)
new(request_method).tap do |request|
View
38 lib/faraday/request/instrumentation.rb
@@ -0,0 +1,38 @@
+module Faraday
+ class Request::Instrumentation < Faraday::Middleware
+ class Options < Faraday::Options.new(:name, :instrumenter)
+ def name
+ self[:name] ||= 'request.faraday'
+ end
+
+ def instrumenter
+ self[:instrumenter] ||= ActiveSupport::Notifications
+ end
+ end
+
+ # Public: Instruments requests using Active Support.
+ #
+ # Measures time spent only for synchronous requests.
+ #
+ # Examples
+ #
+ # ActiveSupport::Notifications.subscribe('request.faraday') do |name, starts, ends, _, env|
+ # url = env[:url]
+ # http_method = env[:method].to_s.upcase
+ # duration = ends - starts
+ # $stderr.puts '[%s] %s %s (%.3f s)' % [url.host, http_method, url.request_uri, duration]
+ # end
+ def initialize(app, options = nil)
+ super(app)
+ @name, @instrumenter = Options.from(options).values
+ end
+
+ def call(env)
+ @instrumenter.instrument(@name, env) do
+ @app.call(env)
+ end
+ end
+ end
+end
+
+
View
75 test/middleware/instrumentation_test.rb
@@ -0,0 +1,75 @@
+require File.expand_path("../../helper", __FILE__)
+
+module Middleware
+ class InstrumentationTest < Faraday::TestCase
+ def setup
+ @instrumenter = FakeInstrumenter.new
+ end
+
+ def test_default_name
+ assert_equal 'request.faraday', options.name
+ end
+
+ def test_default_instrumenter
+ begin
+ instrumenter = options.instrumenter
+ rescue NameError => err
+ assert_equal :ActiveSupport, err.name
+ else
+ assert_equal ActiveSupport::Notifications, instrumenter
+ end
+ end
+
+ def test_name
+ assert_equal 'booya', options(:name => 'booya').name
+ end
+
+ def test_instrumenter
+ assert_equal :boom, options(:instrumenter => :boom).instrumenter
+ end
+
+ def test_instrumentation
+ assert_equal 0, @instrumenter.instrumentations.size
+
+ faraday = conn :name => 'booya'
+ res = faraday.get '/'
+ assert_equal 'ok', res.body
+
+ assert_equal 1, @instrumenter.instrumentations.size
+ name, env = @instrumenter.instrumentations.first
+ assert_equal 'booya', name
+ assert_equal '/', env[:url].path
+ end
+
+ class FakeInstrumenter
+ attr_reader :instrumentations
+
+ def initialize
+ @instrumentations = []
+ end
+
+ def instrument(name, env)
+ @instrumentations << [name, env]
+ yield
+ end
+ end
+
+ def options(hash = nil)
+ Faraday::Request::Instrumentation::Options.from hash
+ end
+
+ def conn(hash = nil)
+ hash ||= {}
+ hash[:instrumenter] = @instrumenter
+
+ Faraday.new do |f|
+ f.request :instrumentation, hash
+ f.adapter :test do |stub|
+ stub.get '/' do
+ [200, {}, 'ok']
+ end
+ end
+ end
+ end
+ end
+end
Please sign in to comment.
Something went wrong with that request. Please try again.