Skip to content

Commit 2ccf120

Browse files
authored
Fix RequestsInstrumentor for custom transport adapters (#562)
* Fix RequestsInstrumentor for custom transport adapters remove dead/leftover code from an early metrics implementation which tried to access the raw.version attribute on the response object. The 'version' attribute might not be present in every case, especially when custom transport adapters are used.
1 parent 9206e5d commit 2ccf120

File tree

3 files changed

+43
-13
lines changed

3 files changed

+43
-13
lines changed

CHANGELOG.md

+3
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3838
([#558](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/558))
3939
- Change `opentelemetry-instrumentation-httpx` to replace `client` classes with instrumented versions.
4040
([#577](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/577))
41+
- `opentelemetry-instrumentation-requests` Fix potential `AttributeError` when `requests`
42+
is used with a custom transport adapter.
43+
([#562](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/562))
4144

4245
### Added
4346
- `opentelemetry-instrumentation-httpx` Add `httpx` instrumentation

instrumentation/opentelemetry-instrumentation-requests/src/opentelemetry/instrumentation/requests/__init__.py

-13
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,6 @@ def _instrumented_requests_call(
131131

132132
url = remove_url_credentials(url)
133133

134-
labels = {}
135-
labels[SpanAttributes.HTTP_METHOD] = method
136-
labels[SpanAttributes.HTTP_URL] = url
137-
138134
with tracer.start_as_current_span(
139135
span_name, kind=SpanKind.CLIENT
140136
) as span:
@@ -165,15 +161,6 @@ def _instrumented_requests_call(
165161
span.set_status(
166162
Status(http_status_to_status_code(result.status_code))
167163
)
168-
labels[SpanAttributes.HTTP_STATUS_CODE] = str(
169-
result.status_code
170-
)
171-
if result.raw and result.raw.version:
172-
labels[SpanAttributes.HTTP_FLAVOR] = (
173-
str(result.raw.version)[:1]
174-
+ "."
175-
+ str(result.raw.version)[:-1]
176-
)
177164
if span_callback is not None:
178165
span_callback(span, result)
179166

instrumentation/opentelemetry-instrumentation-requests/tests/test_requests_integration.py

+40
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
import httpretty
1919
import requests
20+
from requests.adapters import BaseAdapter
21+
from requests.models import Response
2022

2123
import opentelemetry.instrumentation.requests
2224
from opentelemetry import context, trace
@@ -30,6 +32,23 @@
3032
from opentelemetry.trace import StatusCode
3133

3234

35+
class TransportMock:
36+
def read(self, *args, **kwargs):
37+
pass
38+
39+
40+
class MyAdapter(BaseAdapter):
41+
def __init__(self, response):
42+
super().__init__()
43+
self._response = response
44+
45+
def send(self, *args, **kwargs): # pylint:disable=signature-differs
46+
return self._response
47+
48+
def close(self):
49+
pass
50+
51+
3352
class InvalidResponseObjectException(Exception):
3453
def __init__(self):
3554
super().__init__()
@@ -38,6 +57,7 @@ def __init__(self):
3857

3958
class RequestsIntegrationTestBase(abc.ABC):
4059
# pylint: disable=no-member
60+
# pylint: disable=too-many-public-methods
4161

4262
URL = "http://httpbin.org/status/200"
4363

@@ -335,6 +355,26 @@ def test_requests_timeout_exception(self, *_, **__):
335355
span = self.assert_span()
336356
self.assertEqual(span.status.status_code, StatusCode.ERROR)
337357

358+
def test_adapter_with_custom_response(self):
359+
response = Response()
360+
response.status_code = 210
361+
response.reason = "hello adapter"
362+
response.raw = TransportMock()
363+
364+
session = requests.Session()
365+
session.mount(self.URL, MyAdapter(response))
366+
367+
self.perform_request(self.URL, session)
368+
span = self.assert_span()
369+
self.assertEqual(
370+
span.attributes,
371+
{
372+
"http.method": "GET",
373+
"http.url": self.URL,
374+
"http.status_code": 210,
375+
},
376+
)
377+
338378

339379
class TestRequestsIntegration(RequestsIntegrationTestBase, TestBase):
340380
@staticmethod

0 commit comments

Comments
 (0)