Skip to content
Closed
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
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ def call(env)
def span_creation_attributes(http_method:, url:)
instrumentation_attrs = {
'http.method' => http_method,
'http.url' => url.to_s,
'net.peer.name' => url.host
'http.url' => url.to_s
}
instrumentation_attrs['net.peer.name'] = url.host unless url.host.nil?
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IDK which Rubocop prefers but I believe we can do= url.host if url.host

config = Faraday::Instrumentation.instance.config
instrumentation_attrs['peer.service'] = config[:peer_service] if config[:peer_service]
instrumentation_attrs.merge!(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ Gem::Specification.new do |spec|
spec.add_development_dependency 'minitest', '~> 5.0'
spec.add_development_dependency 'opentelemetry-sdk', '~> 1.0'
spec.add_development_dependency 'opentelemetry-test-helpers'
spec.add_development_dependency 'pry-byebug' unless RUBY_ENGINE == 'jruby'
spec.add_development_dependency 'rubocop', '~> 0.73.0'
spec.add_development_dependency 'simplecov', '~> 0.17.1'
spec.add_development_dependency 'webmock', '~> 3.7.6'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,83 +43,108 @@
instrumentation.install
end

it 'has http 200 attributes' do
response = client.get('/success')

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'GET'
_(span.attributes['http.status_code']).must_equal 200
_(span.attributes['http.url']).must_equal 'http://example.com/success'
_(span.attributes['net.peer.name']).must_equal 'example.com'
_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end
describe 'given a client with a base url' do
it 'has http 200 attributes' do
response = client.get('/success')

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'GET'
_(span.attributes['http.status_code']).must_equal 200
_(span.attributes['http.url']).must_equal 'http://example.com/success'
_(span.attributes['net.peer.name']).must_equal 'example.com'
_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end

it 'has http.status_code 404' do
response = client.get('/not_found')

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'GET'
_(span.attributes['http.status_code']).must_equal 404
_(span.attributes['http.url']).must_equal 'http://example.com/not_found'
_(span.attributes['net.peer.name']).must_equal 'example.com'
_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end
it 'has http.status_code 404' do
response = client.get('/not_found')

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'GET'
_(span.attributes['http.status_code']).must_equal 404
_(span.attributes['http.url']).must_equal 'http://example.com/not_found'
_(span.attributes['net.peer.name']).must_equal 'example.com'
_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end

it 'has http.status_code 500' do
response = client.get('/failure')

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'GET'
_(span.attributes['http.status_code']).must_equal 500
_(span.attributes['http.url']).must_equal 'http://example.com/failure'
_(span.attributes['net.peer.name']).must_equal 'example.com'
_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end
it 'has http.status_code 500' do
response = client.get('/failure')

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'GET'
_(span.attributes['http.status_code']).must_equal 500
_(span.attributes['http.url']).must_equal 'http://example.com/failure'
_(span.attributes['net.peer.name']).must_equal 'example.com'
_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end

it 'merges http client attributes' do
client_context_attrs = {
'test.attribute' => 'test.value', 'http.method' => 'OVERRIDE'
}
response = OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
client.get('/success')
it 'merges http client attributes' do
client_context_attrs = {
'test.attribute' => 'test.value', 'http.method' => 'OVERRIDE'
}
response = OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
client.get('/success')
end

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'OVERRIDE'
_(span.attributes['http.status_code']).must_equal 200
_(span.attributes['http.url']).must_equal 'http://example.com/success'
_(span.attributes['net.peer.name']).must_equal 'example.com'
_(span.attributes['test.attribute']).must_equal 'test.value'
_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'OVERRIDE'
_(span.attributes['http.status_code']).must_equal 200
_(span.attributes['http.url']).must_equal 'http://example.com/success'
_(span.attributes['net.peer.name']).must_equal 'example.com'
_(span.attributes['test.attribute']).must_equal 'test.value'
_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end
it 'accepts peer service name from config' do
instrumentation.instance_variable_set(:@installed, false)
instrumentation.install(peer_service: 'example:faraday')

it 'accepts peer service name from config' do
instrumentation.instance_variable_set(:@installed, false)
instrumentation.install(peer_service: 'example:faraday')
client.get('/success')

client.get('/success')
_(span.attributes['peer.service']).must_equal 'example:faraday'
end

_(span.attributes['peer.service']).must_equal 'example:faraday'
end
it 'prioritizes context attributes over config for peer service name' do
instrumentation.instance_variable_set(:@installed, false)
instrumentation.install(peer_service: 'example:faraday')

it 'prioritizes context attributes over config for peer service name' do
instrumentation.instance_variable_set(:@installed, false)
instrumentation.install(peer_service: 'example:faraday')
client_context_attrs = { 'peer.service' => 'example:custom' }
OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
client.get('/success')
end

client_context_attrs = { 'peer.service' => 'example:custom' }
OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
client.get('/success')
_(span.attributes['peer.service']).must_equal 'example:custom'
end
end

describe 'given a client without a base url' do
let(:client) do
::Faraday.new do |builder|
builder.adapter(:test) do |stub|
stub.get('/success') { |_| [200, {}, 'OK'] }
end
end
end

_(span.attributes['peer.service']).must_equal 'example:custom'
it 'omits missing attributes' do
response = client.get('/success')

_(span.name).must_equal 'HTTP GET'
_(span.attributes['http.method']).must_equal 'GET'
_(span.attributes['http.status_code']).must_equal 200
_(span.attributes['http.url']).must_equal 'http:/success'
_(span.attributes).wont_include('net.peer.name')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

_(response.env.request_headers['Traceparent']).must_equal(
"00-#{span.hex_trace_id}-#{span.hex_span_id}-01"
)
end
end
end
end
7 changes: 3 additions & 4 deletions instrumentation/faraday/test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,8 @@
#
# SPDX-License-Identifier: Apache-2.0

require 'faraday'

require 'opentelemetry/sdk'
require 'opentelemetry-test-helpers'
require 'bundler/setup'
Bundler.require(:default, :development, :test)

require 'minitest/autorun'
require 'webmock/minitest'
Expand All @@ -17,5 +15,6 @@
span_processor = OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(EXPORTER)

OpenTelemetry::SDK.configure do |c|
c.error_handler = ->(exception:, message:) { raise(exception || message) }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🙏

c.add_span_processor span_processor
end