Skip to content

Commit

Permalink
fix: Share Faraday Attrs with Adapter Spans (#1266)
Browse files Browse the repository at this point in the history
The Faraday gem has additional http attributes that are sometimes missing or difficult to derive in Adapter instrumentations.
  • Loading branch information
arielvalentin authored Dec 12, 2024
1 parent 38e26a9 commit 8def74b
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 24 deletions.
14 changes: 6 additions & 8 deletions instrumentation/faraday/Appraisals
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,12 @@
#
# SPDX-License-Identifier: Apache-2.0

appraise 'faraday-0.17' do
gem 'faraday', '~> 0.17.6'
%w[0.17.6 1.0 2.0].each do |version|
appraise "faraday-#{version}" do
gem 'faraday', "~> #{version}"
end
end

appraise 'faraday-1.x' do
gem 'faraday', '~> 1.0'
end

appraise 'faraday-2.x' do
gem 'faraday', '~> 2.0'
appraise 'faraday-latest' do
gem 'faraday'
end
Original file line number Diff line number Diff line change
Expand Up @@ -33,31 +33,34 @@ def call(env)
attributes = span_creation_attributes(
http_method: http_method, url: env.url, config: config
)
tracer.in_span(
"HTTP #{http_method}", attributes: attributes, kind: config.fetch(:span_kind)
) do |span|
OpenTelemetry.propagation.inject(env.request_headers)

app.call(env).on_complete { |resp| trace_response(span, resp.status) }
rescue ::Faraday::Error => e
trace_response(span, e.response[:status]) if e.response
OpenTelemetry::Common::HTTP::ClientContext.with_attributes(attributes) do |attrs, _|
tracer.in_span(
"HTTP #{http_method}", attributes: attrs, kind: config.fetch(:span_kind)
) do |span|
OpenTelemetry.propagation.inject(env.request_headers)

raise
app.call(env).on_complete { |resp| trace_response(span, resp.status) }
rescue ::Faraday::Error => e
trace_response(span, e.response[:status]) if e.response

raise
end
end
end

private

def span_creation_attributes(http_method:, url:, config:)
instrumentation_attrs = {
attrs = {
'http.method' => http_method,
'http.url' => OpenTelemetry::Common::Utilities.cleanse_url(url.to_s),
'faraday.adapter.name' => app.class.name
}
instrumentation_attrs['net.peer.name'] = url.host if url.host
instrumentation_attrs['peer.service'] = config[:peer_service] if config[:peer_service]
attrs['net.peer.name'] = url.host if url.host
attrs['peer.service'] = config[:peer_service] if config[:peer_service]

instrumentation_attrs.merge!(
attrs.merge!(
OpenTelemetry::Common::HTTP::ClientContext.attributes
)
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
stub.get('/success') { |_| [200, {}, 'OK'] }
stub.get('/failure') { |_| [500, {}, 'OK'] }
stub.get('/not_found') { |_| [404, {}, 'OK'] }
stub.get('/show-shared-attributes') { |_| [200, {}, OpenTelemetry::Common::HTTP::ClientContext.attributes.to_json] }
end
end
end
Expand All @@ -31,17 +32,15 @@
@orig_propagation = OpenTelemetry.propagation
propagator = OpenTelemetry::Trace::Propagation::TraceContext.text_map_propagator
OpenTelemetry.propagation = propagator
instrumentation.instance_variable_set(:@installed, false)
instrumentation.install
end

after do
OpenTelemetry.propagation = @orig_propagation
end

describe 'first span' do
before do
instrumentation.install
end

describe 'given a client with a base url' do
it 'has http 200 attributes' do
response = client.get('/success')
Expand Down Expand Up @@ -101,6 +100,18 @@
)
end

it 'ammends attributes to client context' do
response = client.get('/show-shared-attributes')
shared_attributes = JSON.parse(response.body)
expected_attributes = {
'http.method' => 'GET', 'http.url' => 'http://example.com/show-shared-attributes',
'faraday.adapter.name' => 'Faraday::Adapter::Test',
'net.peer.name' => 'example.com'
}

_(shared_attributes).must_equal expected_attributes
end

it 'accepts peer service name from config' do
instrumentation.instance_variable_set(:@installed, false)
instrumentation.install(peer_service: 'example:faraday')
Expand Down

0 comments on commit 8def74b

Please sign in to comment.