Skip to content

Commit

Permalink
don't use Timeout.timeout()
Browse files Browse the repository at this point in the history
(outside of `test/`) don't use `Timeout.timeout()` when the underlying
library has timeout functionality itself.

resolves #975
  • Loading branch information
fallwith committed Aug 1, 2023
1 parent 5821eae commit 193ea5a
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 25 deletions.
41 changes: 24 additions & 17 deletions lib/new_relic/agent/new_relic_service.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
# frozen_string_literal: true

require 'zlib'
require 'timeout'
require 'new_relic/agent/audit_logger'
require 'new_relic/agent/new_relic_service/encoders'
require 'new_relic/agent/new_relic_service/marshaller'
Expand All @@ -19,7 +18,10 @@ class NewRelicService

# These include Errno connection errors, and all indicate that the
# underlying TCP connection may be in a bad state.
CONNECTION_ERRORS = [Timeout::Error, EOFError, SystemCallError, SocketError].freeze
CONNECTION_ERRORS = [Net::OpenTimeout, Net::ReadTimeout, EOFError, SystemCallError, SocketError]
# Net::WriteTimeout is Ruby 2.6+
CONNECTION_ERRORS << Net::WriteTimeout if defined?(Net::WriteTimeout)
CONNECTION_ERRORS.freeze

# The maximum number of times to attempt an HTTP request
MAX_ATTEMPTS = 2
Expand Down Expand Up @@ -319,13 +321,15 @@ def set_cert_store(conn)

def start_connection(conn)
NewRelic::Agent.logger.debug("Opening TCP connection to #{conn.address}:#{conn.port}")
Timeout.timeout(@request_timeout) { conn.start }
conn
conn.start
end

def setup_connection_timeouts(conn)
# We use Timeout explicitly instead of this
conn.read_timeout = nil
conn.open_timeout = @request_timeout
conn.read_timeout = @request_timeout
conn.ssl_timeout = @request_timeout
# #write_timeout= requires Ruby 2.6+
conn.write_timeout = @request_timeout if conn.respond_to?(:write_timeout=)

if conn.respond_to?(:keep_alive_timeout) && NewRelic::Agent.config[:aggressive_keepalive]
conn.keep_alive_timeout = NewRelic::Agent.config[:keep_alive_timeout]
Expand Down Expand Up @@ -362,8 +366,8 @@ def create_and_start_http_connection
conn = create_http_connection
start_connection(conn)
conn
rescue Timeout::Error
::NewRelic::Agent.logger.info('Timeout while attempting to connect. You may need to install system-level CA Certificates, as the ruby agent no longer includes these.')
rescue Net::OpenTimeout
::NewRelic::Agent.logger.info('Timed out while attempting to connect. For SSL issues, you may need to install system-level CA Certificates to be used by Net::HTTP.')
raise
end

Expand Down Expand Up @@ -436,21 +440,19 @@ def relay_request(request, opts)
end

def attempt_request(request, opts)
response = nil
conn = http_connection
::NewRelic::Agent.logger.debug("Sending request to #{opts[:collector]}#{opts[:uri]} with #{request.method}")
Timeout.timeout(@request_timeout) do
response = conn.request(request)
end
response
conn.request(request)
end

def handle_error_response(response, endpoint)
case response
when Net::HTTPRequestTimeOut,
Net::HTTPTooManyRequests,
Net::HTTPInternalServerError,
Net::HTTPServiceUnavailable
Net::HTTPServiceUnavailable,
Net::OpenTimeout,
Net::ReadTimeout
handle_server_connection_exception(response, endpoint)
when Net::HTTPBadRequest,
Net::HTTPForbidden,
Expand All @@ -471,9 +473,14 @@ def handle_error_response(response, endpoint)
when Net::HTTPGone
handle_gone_response(response, endpoint)
else
record_endpoint_attempts_supportability_metrics(endpoint)
record_error_response_supportability_metrics(response.code)
raise UnrecoverableServerException, "#{response.code}: #{response.message}"
# Net::WriteTimeout requires Ruby 2.6+
if response.respond_to?(:name) && response.name == 'Net::WriteTimeout'
handle_server_connection_exception(response, endpoint)
else
record_endpoint_attempts_supportability_metrics(endpoint)
record_error_response_supportability_metrics(response.code)
raise UnrecoverableServerException, "#{response.code}: #{response.message}"
end
end
response
end
Expand Down
12 changes: 5 additions & 7 deletions lib/new_relic/agent/utilization/vendor.rb
Original file line number Diff line number Diff line change
Expand Up @@ -75,14 +75,12 @@ def request_metadata
processed_headers = headers
raise if processed_headers.value?(:error)

Timeout.timeout(1) do
response = nil
Net::HTTP.start(endpoint.host, endpoint.port) do |http|
req = Net::HTTP::Get.new(endpoint, processed_headers)
response = http.request(req)
end
response
response = nil
Net::HTTP.start(endpoint.host, endpoint.port, open_timeout: 1, read_timeout: 1) do |http|
req = Net::HTTP::Get.new(endpoint, processed_headers)
response = http.request(req)
end
response
rescue
NewRelic::Agent.logger.debug("#{vendor_name} environment not detected")
end
Expand Down
2 changes: 1 addition & 1 deletion test/new_relic/agent/new_relic_service_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def create_http_handle(name = 'connection')
end

def test_session_handles_timeouts_opening_connection_gracefully
@http_handle.stubs(:start).raises(Timeout::Error)
@http_handle.stubs(:start).raises(Net::OpenTimeout)

block_ran = false

Expand Down

0 comments on commit 193ea5a

Please sign in to comment.