Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.markdown
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Pending

- Fix compatibility with `http >= 6.0.0` (#613)

# 6.1.1

- Fix Redis 5 prepend interaction (#611)
Expand Down
76 changes: 62 additions & 14 deletions lib/scout_apm/instruments/http.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,30 +24,63 @@ def install(prepend:)

if prepend
::HTTP::Client.send(:include, ScoutApm::Tracer)
::HTTP::Client.send(:prepend, HTTPInstrumentationPrepend)
if http_version_at_least?("6.0.0")
::HTTP::Client.send(:prepend, HTTPInstrumentationPrependV6)
else
::HTTP::Client.send(:prepend, HTTPInstrumentationPrepend)
end
else
::HTTP::Client.class_eval do
include ScoutApm::Tracer
if http_version_at_least?("6.0.0")
::HTTP::Client.class_eval do
include ScoutApm::Tracer

def request_with_scout_instruments(verb, uri, opts = {})
self.class.instrument("HTTP", verb, :ignore_children => true, :desc => request_scout_description(verb, uri)) do
request_without_scout_instruments(verb, uri, opts)
def request_with_scout_instruments(verb, uri, **opts)
self.class.instrument("HTTP", verb, :ignore_children => true, :desc => request_scout_description(verb, uri)) do
request_without_scout_instruments(verb, uri, **opts)
end
end

def request_scout_description(verb, uri)
max_length = ScoutApm::Agent.instance.context.config.value('instrument_http_url_length')
(String(uri).split('?').first)[0..(max_length - 1)]
rescue
""
end
end

def request_scout_description(verb, uri)
max_length = ScoutApm::Agent.instance.context.config.value('instrument_http_url_length')
(String(uri).split('?').first)[0..(max_length - 1)]
rescue
""
alias request_without_scout_instruments request
alias request request_with_scout_instruments
end
else
::HTTP::Client.class_eval do
include ScoutApm::Tracer

def request_with_scout_instruments(verb, uri, opts = {})
self.class.instrument("HTTP", verb, :ignore_children => true, :desc => request_scout_description(verb, uri)) do
request_without_scout_instruments(verb, uri, opts)
end
end

alias request_without_scout_instruments request
alias request request_with_scout_instruments
def request_scout_description(verb, uri)
max_length = ScoutApm::Agent.instance.context.config.value('instrument_http_url_length')
(String(uri).split('?').first)[0..(max_length - 1)]
rescue
""
end

alias request_without_scout_instruments request
alias request request_with_scout_instruments
end
end
end
end
end

private

def http_version_at_least?(version)
defined?(::HTTP::VERSION) &&
Gem::Version.new(::HTTP::VERSION) >= Gem::Version.new(version)
end
end

module HTTPInstrumentationPrepend
Expand All @@ -64,5 +97,20 @@ def request_scout_description(verb, uri)
""
end
end

module HTTPInstrumentationPrependV6
def request(verb, uri, **opts)
self.class.instrument("HTTP", verb, :ignore_children => true, :desc => request_scout_description(verb, uri)) do
super(verb, uri, **opts)
end
end

def request_scout_description(verb, uri)
max_length = ScoutApm::Agent.instance.context.config.value('instrument_http_url_length')
(String(uri).split('?').first)[0..(max_length - 1)]
rescue
""
end
end
end
end
7 changes: 6 additions & 1 deletion test/unit/instruments/http_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,14 @@ def setup

def test_installs_using_proper_method
if @instrument_manager.prepend_for_instrument?(@instance.class) == true
assert ::HTTP::Client.ancestors.include?(ScoutApm::Instruments::HTTPInstrumentationPrepend)
if Gem::Version.new(::HTTP::VERSION) >= Gem::Version.new("6.0.0")
assert ::HTTP::Client.ancestors.include?(ScoutApm::Instruments::HTTPInstrumentationPrependV6)
else
assert ::HTTP::Client.ancestors.include?(ScoutApm::Instruments::HTTPInstrumentationPrepend)
end
else
assert_equal false, ::HTTP::Client.ancestors.include?(ScoutApm::Instruments::HTTPInstrumentationPrepend)
assert_equal false, ::HTTP::Client.ancestors.include?(ScoutApm::Instruments::HTTPInstrumentationPrependV6)
end
end
end
Expand Down
Loading