Skip to content
Open
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
17 changes: 17 additions & 0 deletions instrumentation/httpx/test/instrumentation/dup/plugin_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -182,5 +182,22 @@

_(span.attributes['peer.service']).must_equal 'example:custom'
end

it 'sets url.query attribute when query params present' do
stub_request(:get, 'http://example.com/search?q=foo').to_return(status: 200)
HTTPX.get('http://example.com/search?q=foo')

_(exporter.finished_spans.size).must_equal 1
_(span.attributes['url.query']).must_equal 'q=foo'
_(span.attributes['url.path']).must_equal '/search'
end

it 'sets server.port and net.peer.port attributes' do
HTTPX.get('http://example.com/success')

_(exporter.finished_spans.size).must_equal 1
_(span.attributes['server.port']).must_equal 80
_(span.attributes[OpenTelemetry::SemanticConventions::Trace::NET_PEER_PORT]).must_equal 80
end
end
end
148 changes: 148 additions & 0 deletions instrumentation/httpx/test/instrumentation/httpx/http_helper_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
# frozen_string_literal: true

# Copyright The OpenTelemetry Authors
#
# SPDX-License-Identifier: Apache-2.0

require 'test_helper'

require_relative '../../../lib/opentelemetry/instrumentation/httpx'

describe OpenTelemetry::Instrumentation::HTTPX::HttpHelper do
describe '.span_attrs_for_old' do
it 'returns correct attributes for standard HTTP method' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_old('GET')

_(result.span_name).must_equal 'HTTP GET'
_(result.attributes['http.method']).must_equal 'GET'
end

it 'returns _OTHER for non-standard HTTP method' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_old('PURGE')

_(result.span_name).must_equal 'HTTP'
_(result.attributes['http.method']).must_equal '_OTHER'
end

it 'normalizes symbol methods' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_old(:get)

_(result.span_name).must_equal 'HTTP GET'
_(result.attributes['http.method']).must_equal 'GET'
end

it 'merges client context attributes' do
client_context_attrs = { 'test.attribute' => 'test.value' }

OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_old('GET')
_(result.attributes['test.attribute']).must_equal 'test.value'
end
end

it 'does not override client context http.method' do
client_context_attrs = { 'http.method' => 'OVERRIDE' }

OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_old('GET')
_(result.attributes['http.method']).must_equal 'OVERRIDE'
end
end
end

describe '.span_attrs_for_stable' do
it 'returns correct attributes for standard HTTP method' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_stable('GET')

_(result.span_name).must_equal 'GET'
_(result.attributes['http.request.method']).must_equal 'GET'
end

it 'returns _OTHER for non-standard HTTP method' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_stable('PURGE')

_(result.span_name).must_equal 'HTTP'
_(result.attributes['http.request.method']).must_equal '_OTHER'
_(result.attributes['http.request.method_original']).must_equal 'PURGE'
end

it 'normalizes symbol methods' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_stable(:post)

_(result.span_name).must_equal 'POST'
_(result.attributes['http.request.method']).must_equal 'POST'
end

it 'includes url.template in span name when present' do
client_context_attrs = { 'url.template' => '/users/{id}' }

OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_stable('GET')
_(result.span_name).must_equal 'GET /users/{id}'
end
end

it 'includes url.template in span name for non-standard method' do
client_context_attrs = { 'url.template' => '/cache/{key}' }

OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_stable('PURGE')
_(result.span_name).must_equal 'HTTP /cache/{key}'
end
end

it 'does not override client context http.request.method' do
client_context_attrs = { 'http.request.method' => 'OVERRIDE' }

OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_stable('GET')
_(result.attributes['http.request.method']).must_equal 'OVERRIDE'
end
end
end

describe '.span_attrs_for_dup' do
it 'returns both old and stable attributes for standard HTTP method' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_dup('GET')

_(result.span_name).must_equal 'GET'
_(result.attributes['http.method']).must_equal 'GET'
_(result.attributes['http.request.method']).must_equal 'GET'
end

it 'returns _OTHER for non-standard HTTP method' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_dup('PURGE')

_(result.span_name).must_equal 'HTTP'
_(result.attributes['http.method']).must_equal '_OTHER'
_(result.attributes['http.request.method']).must_equal '_OTHER'
_(result.attributes['http.request.method_original']).must_equal 'PURGE'
end

it 'normalizes symbol methods' do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_dup(:put)

_(result.span_name).must_equal 'PUT'
_(result.attributes['http.method']).must_equal 'PUT'
_(result.attributes['http.request.method']).must_equal 'PUT'
end

it 'includes url.template in span name when present' do
client_context_attrs = { 'url.template' => '/users/{id}' }

OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_dup('GET')
_(result.span_name).must_equal 'GET /users/{id}'
end
end

it 'merges client context attributes' do
client_context_attrs = { 'test.attribute' => 'test.value' }

OpenTelemetry::Common::HTTP::ClientContext.with_attributes(client_context_attrs) do
result = OpenTelemetry::Instrumentation::HTTPX::HttpHelper.span_attrs_for_dup('GET')
_(result.attributes['test.attribute']).must_equal 'test.value'
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
require_relative '../../../lib/opentelemetry/instrumentation/httpx'

describe OpenTelemetry::Instrumentation::HTTPX do
before { skip unless ENV['BUNDLE_GEMFILE'].include?('stable') }

let(:instrumentation) { OpenTelemetry::Instrumentation::HTTPX::Instrumentation.instance }

it 'has #name' do
Expand All @@ -25,6 +23,54 @@
describe '#install' do
it 'accepts argument' do
_(instrumentation.install({})).must_equal(true)
instrumentation.instance_variable_set(:@installed, false)
end
end

describe 'compatible' do
it 'returns true when HTTPX version is >= 1.6.0' do
_(instrumentation.compatible?).must_equal true
end
end

describe 'present' do
it 'returns truthy when HTTPX is defined' do
assert instrumentation.present?
end
end

describe '#determine_semconv' do
after do
ENV.delete('OTEL_SEMCONV_STABILITY_OPT_IN')
end

it 'returns stable by default' do
ENV.delete('OTEL_SEMCONV_STABILITY_OPT_IN')
_(instrumentation.determine_semconv).must_equal 'stable'
end

it 'returns old when OTEL_SEMCONV_STABILITY_OPT_IN is old' do
ENV['OTEL_SEMCONV_STABILITY_OPT_IN'] = 'old'
_(instrumentation.determine_semconv).must_equal 'old'
end

it 'returns dup when OTEL_SEMCONV_STABILITY_OPT_IN is http/dup' do
ENV['OTEL_SEMCONV_STABILITY_OPT_IN'] = 'http/dup'
_(instrumentation.determine_semconv).must_equal 'dup'
end

it 'prioritizes http/dup over old' do
ENV['OTEL_SEMCONV_STABILITY_OPT_IN'] = 'http/dup,old'
_(instrumentation.determine_semconv).must_equal 'dup'
end
end

describe '#emit_old_semconv_deprecation_warning' do
it 'emits a deprecation warning' do
OpenTelemetry.stub(:logger, Logger.new(StringIO.new)) do
expect(OpenTelemetry.logger).to receive(:warn).with(/deprecated/)
instrumentation.emit_old_semconv_deprecation_warning('old')
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -156,5 +156,21 @@

_(span.attributes['peer.service']).must_equal 'example:custom'
end

it 'sets url.query attribute when query params present' do
stub_request(:get, 'http://example.com/search?q=foo').to_return(status: 200)
HTTPX.get('http://example.com/search?q=foo')

_(exporter.finished_spans.size).must_equal 1
_(span.attributes['url.query']).must_equal 'q=foo'
_(span.attributes['url.path']).must_equal '/search'
end

it 'sets server.port attribute' do
HTTPX.get('http://example.com/success')

_(exporter.finished_spans.size).must_equal 1
_(span.attributes['server.port']).must_equal 80
end
end
end
Loading