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: 1 addition & 1 deletion app/controllers/api/google_auth_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def exchange_code
private

def faraday
Faraday.new do |f|
HttpClient.new do |f|
f.request :url_encoded
f.options.timeout = 10
f.options.open_timeout = 5
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def call(form_payload:)
attr_reader :endpoint_url

def faraday
@faraday ||= Faraday.new do |f|
@faraday ||= HttpClient.new do |f|
f.request :url_encoded
f.options.timeout = REQUEST_TIMEOUT_SECONDS
f.options.open_timeout = OPEN_TIMEOUT_SECONDS
Expand Down
2 changes: 1 addition & 1 deletion app/services/subscriptions/turnstile_verifier.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def passed?
attr_reader :secret_key, :remote_ip, :token

def faraday
@faraday ||= Faraday.new do |f|
@faraday ||= HttpClient.new do |f|
f.request :url_encoded
f.options.timeout = 5
f.options.open_timeout = 2
Expand Down
8 changes: 8 additions & 0 deletions config/initializers/sentry.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,12 @@

config.rails.structured_logging.enabled = false
config.traces_sample_rate = 0.1

config.before_send = lambda do |event, hint|
exception = hint[:exception]
next event unless exception.is_a?(Faraday::Error)

event.fingerprint = [exception.class.name, exception.try(:request_host) || 'unknown-host']
event
end
end
12 changes: 12 additions & 0 deletions lib/http_client.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true

require 'faraday'

module HttpClient
def self.new(url = nil, options = {})
Faraday.new(url, options) do |f|
f.use RecordRequestHostInErrors
Comment thread
zetter-rpf marked this conversation as resolved.
yield f
end
end
end
2 changes: 1 addition & 1 deletion lib/hydra_public_api_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def stubbed_user
end

def conn
@conn ||= Faraday.new(API_URL) do |f|
@conn ||= HttpClient.new(API_URL) do |f|
f.request :url_encoded
f.response :raise_error
f.response :json
Expand Down
2 changes: 1 addition & 1 deletion lib/profile_api_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ def update_school_email_domains(token:, school_id:, school_email_domains: [])
private

def connection(token)
Faraday.new(ENV.fetch('IDENTITY_URL')) do |faraday|
HttpClient.new(ENV.fetch('IDENTITY_URL')) do |faraday|
faraday.request :json
faraday.response :json
faraday.response :raise_error, allowed_statuses: [401]
Expand Down
17 changes: 17 additions & 0 deletions lib/record_request_host_in_errors.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# frozen_string_literal: true

require 'faraday'

class RecordRequestHostInErrors < Faraday::Middleware
module RequestHost
attr_accessor :request_host
end

def call(env)
super
rescue Faraday::Error => e
e.extend(RequestHost)
e.request_host = env.url.host
raise
end
end
2 changes: 1 addition & 1 deletion lib/scratch_asset_importer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ def s3_client
end

def connection
@connection ||= Faraday.new(url: asset_base_url) do |faraday|
@connection ||= HttpClient.new(url: asset_base_url) do |faraday|
faraday.response :raise_error
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/scratch_config_importer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def import
end

def connection
Faraday.new(url: asset_config_url) do |faraday|
HttpClient.new(url: asset_config_url) do |faraday|
faraday.response :raise_error
end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/tasks/integration_tests.rake
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace :integration_tests do
end

def connection
Faraday.new do |faraday|
HttpClient.new do |faraday|
faraday.request :json
faraday.headers = {
'Accept' => 'application/vnd.github+json',
Expand Down
2 changes: 1 addition & 1 deletion lib/user_info_api_client.rb
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ def transform_result(result)
end

def conn
Faraday.new(
HttpClient.new(
headers: { authorization: "Bearer #{API_KEY}" },
url: API_URL
) do |f|
Expand Down
29 changes: 29 additions & 0 deletions spec/configuration/sentry_config_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe Sentry do
describe 'before_send' do
let(:event) { Sentry::ErrorEvent.new(configuration: described_class.configuration, integration_meta: nil) }

def fingerprint_for(exception)
described_class.configuration.before_send.call(event, { exception: }).fingerprint
end

it 'groups Faraday errors by class and request host' do
exception = Faraday::ServerError.new('boom')
exception.extend(RecordRequestHostInErrors::RequestHost)
exception.request_host = 'api.example.com'

expect(fingerprint_for(exception)).to eq(['Faraday::ServerError', 'api.example.com'])
end

it 'groups Faraday errors raised outside a request under an unknown host' do
expect(fingerprint_for(Faraday::TimeoutError.new)).to eq(['Faraday::TimeoutError', 'unknown-host'])
end

it 'leaves other exceptions on the default grouping' do
expect(fingerprint_for(StandardError.new)).to be_blank
end
end
end
32 changes: 32 additions & 0 deletions spec/lib/record_request_host_in_errors_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# frozen_string_literal: true

require 'rails_helper'

RSpec.describe RecordRequestHostInErrors do
let(:connection) do
HttpClient.new('https://api.example.com') do |f|
f.response :raise_error
end
end

def request_host_from_error
connection.get('/things')
nil
rescue Faraday::Error => e
e.request_host
end

describe '#call' do
it 'records the host on errors raised by response middleware' do
stub_request(:get, 'https://api.example.com/things').to_return(status: 500)

expect(request_host_from_error).to eq('api.example.com')
end

it 'records the host on errors raised by the adapter' do
stub_request(:get, 'https://api.example.com/things').to_timeout

expect(request_host_from_error).to eq('api.example.com')
end
end
end
Loading