Skip to content

Commit 557e903

Browse files
committed
opentelemetry-instrumentation-requests: move from httpretty to mocket
1 parent a185728 commit 557e903

3 files changed

Lines changed: 65 additions & 48 deletions

File tree

instrumentation/opentelemetry-instrumentation-requests/test-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ asgiref==3.8.1
22
certifi==2024.7.4
33
charset-normalizer==3.3.2
44
Deprecated==1.2.14
5-
httpretty==1.1.4
5+
mocket==3.14.1
66
idna==3.7
77
iniconfig==2.0.0
88
packaging==24.0

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

Lines changed: 58 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
import abc
77
from unittest import mock
88

9-
import httpretty
109
import requests
10+
from mocket import Mocket, Mocketizer
11+
from mocket.mocks.mockhttp import Entry
1112
from requests.adapters import BaseAdapter
1213
from requests.models import Response
1314

@@ -131,16 +132,17 @@ def setUp(self):
131132
self.exclude_patch.start()
132133

133134
RequestsInstrumentor().instrument()
134-
httpretty.enable()
135-
httpretty.register_uri(httpretty.GET, self.URL, body="Hello!")
135+
self.mocketizer = Mocketizer(strict_mode=True)
136+
self.mocketizer.enter()
137+
Entry.single_register(Entry.GET, self.URL, body="Hello!")
136138

137139
# pylint: disable=invalid-name
138140
def tearDown(self):
139141
super().tearDown()
140142
self.env_patch.stop()
141143
_OpenTelemetrySemanticConventionStability._initialized = False
142144
RequestsInstrumentor().uninstrument()
143-
httpretty.disable()
145+
self.mocketizer.exit()
144146

145147
def assert_span(self, exporter=None, num_spans=1):
146148
if exporter is None:
@@ -189,8 +191,8 @@ def test_basic(self):
189191

190192
def test_basic_new_semconv(self):
191193
url_with_port = "http://mock:80/status/200"
192-
httpretty.register_uri(
193-
httpretty.GET, url_with_port, status=200, body="Hello!"
194+
Entry.single_register(
195+
Entry.GET, url_with_port, status=200, body="Hello!"
194196
)
195197
result = self.perform_request(url_with_port)
196198
self.assertEqual(result.text, "Hello!")
@@ -226,8 +228,8 @@ def test_basic_new_semconv(self):
226228

227229
def test_basic_both_semconv(self):
228230
url_with_port = "http://mock:80/status/200"
229-
httpretty.register_uri(
230-
httpretty.GET, url_with_port, status=200, body="Hello!"
231+
Entry.single_register(
232+
Entry.GET, url_with_port, status=200, body="Hello!"
231233
)
232234
result = self.perform_request(url_with_port)
233235
self.assertEqual(result.text, "Hello!")
@@ -267,9 +269,12 @@ def test_basic_both_semconv(self):
267269
span, opentelemetry.instrumentation.requests
268270
)
269271

270-
@mock.patch("httpretty.http.HttpBaseClass.METHODS", ("NONSTANDARD",))
272+
@mock.patch(
273+
"mocket.mocks.mockhttp.Entry.METHODS",
274+
Entry.METHODS + ("NONSTANDARD",),
275+
)
271276
def test_nonstandard_http_method(self):
272-
httpretty.register_uri("NONSTANDARD", self.URL, status=405)
277+
Entry.single_register("NONSTANDARD", self.URL, status=405)
273278
session = requests.Session()
274279
session.request("NONSTANDARD", self.URL)
275280
span = self.assert_span()
@@ -287,9 +292,12 @@ def test_nonstandard_http_method(self):
287292

288293
self.assertIs(span.status.status_code, trace.StatusCode.ERROR)
289294

290-
@mock.patch("httpretty.http.HttpBaseClass.METHODS", ("NONSTANDARD",))
295+
@mock.patch(
296+
"mocket.mocks.mockhttp.Entry.METHODS",
297+
Entry.METHODS + ("NONSTANDARD",),
298+
)
291299
def test_nonstandard_http_method_new_semconv(self):
292-
httpretty.register_uri("NONSTANDARD", self.URL, status=405)
300+
Entry.single_register("NONSTANDARD", self.URL, status=405)
293301
session = requests.Session()
294302
session.request("NONSTANDARD", self.URL)
295303
span = self.assert_span()
@@ -331,8 +339,8 @@ def response_hook(span, request_obj, response):
331339

332340
def test_excluded_urls_explicit(self):
333341
url_404 = "http://mock/status/404"
334-
httpretty.register_uri(
335-
httpretty.GET,
342+
Entry.single_register(
343+
Entry.GET,
336344
url_404,
337345
status=404,
338346
)
@@ -346,8 +354,8 @@ def test_excluded_urls_explicit(self):
346354

347355
def test_excluded_urls_from_env(self):
348356
url = "http://localhost/env_excluded_arg/123"
349-
httpretty.register_uri(
350-
httpretty.GET,
357+
Entry.single_register(
358+
Entry.GET,
351359
url,
352360
status=200,
353361
)
@@ -373,8 +381,8 @@ def name_callback(method, url):
373381

374382
def test_not_foundbasic(self):
375383
url_404 = "http://mock/status/404"
376-
httpretty.register_uri(
377-
httpretty.GET,
384+
Entry.single_register(
385+
Entry.GET,
378386
url_404,
379387
status=404,
380388
)
@@ -392,8 +400,8 @@ def test_not_foundbasic(self):
392400

393401
def test_not_foundbasic_new_semconv(self):
394402
url_404 = "http://mock/status/404"
395-
httpretty.register_uri(
396-
httpretty.GET,
403+
Entry.single_register(
404+
Entry.GET,
397405
url_404,
398406
status=404,
399407
)
@@ -412,8 +420,8 @@ def test_not_foundbasic_new_semconv(self):
412420

413421
def test_not_foundbasic_both_semconv(self):
414422
url_404 = "http://mock/status/404"
415-
httpretty.register_uri(
416-
httpretty.GET,
423+
Entry.single_register(
424+
Entry.GET,
417425
url_404,
418426
status=404,
419427
)
@@ -498,7 +506,7 @@ def test_distributed_context(self):
498506

499507
span = self.assert_span()
500508

501-
headers = dict(httpretty.last_request().headers)
509+
headers = dict(Mocket.last_request().headers)
502510
self.assertIn(MockTextMapPropagator.TRACE_ID_KEY, headers)
503511
self.assertEqual(
504512
str(span.get_span_context().trace_id),
@@ -583,8 +591,8 @@ def test_requests_exception_without_response(self, *_, **__):
583591
)
584592
def test_requests_exception_new_semconv(self, *_, **__):
585593
url_with_port = "http://mock:80/status/200"
586-
httpretty.register_uri(
587-
httpretty.GET, url_with_port, status=200, body="Hello!"
594+
Entry.single_register(
595+
Entry.GET, url_with_port, status=200, body="Hello!"
588596
)
589597
with self.assertRaises(requests.RequestException):
590598
self.perform_request(url_with_port)
@@ -703,6 +711,7 @@ def test_remove_sensitive_params(self):
703711
new_url = (
704712
"http://username:password@mock/status/200?AWSAccessKeyId=secret"
705713
)
714+
Entry.single_register(Entry.GET, new_url, body="Hello!")
706715
self.perform_request(new_url)
707716
span = self.assert_span()
708717

@@ -732,7 +741,7 @@ def test_custom_request_headers_captured(self):
732741
"X-Another-Header": "another-value",
733742
"X-Excluded-Header": "excluded-value",
734743
}
735-
httpretty.register_uri(httpretty.GET, self.URL, body="Hello!")
744+
Entry.single_register(Entry.GET, self.URL, body="Hello!")
736745
result = requests.get(self.URL, headers=headers, timeout=5)
737746
self.assertEqual(result.text, "Hello!")
738747

@@ -763,8 +772,9 @@ def test_custom_response_headers_captured(self):
763772
"X-Another-Header": "another-value",
764773
"X-Excluded-Header": "excluded-value",
765774
}
766-
httpretty.register_uri(
767-
httpretty.GET, self.URL, body="Hello!", adding_headers=headers
775+
Mocket.reset()
776+
Entry.single_register(
777+
Entry.GET, self.URL, body="Hello!", headers=headers
768778
)
769779
result = requests.get(self.URL, timeout=5)
770780
self.assertEqual(result.text, "Hello!")
@@ -786,11 +796,12 @@ def test_custom_headers_not_captured_when_not_configured(self):
786796
RequestsInstrumentor().uninstrument()
787797
RequestsInstrumentor().instrument()
788798
headers = {"X-Request-Header": "request-value"}
789-
httpretty.register_uri(
790-
httpretty.GET,
799+
Mocket.reset()
800+
Entry.single_register(
801+
Entry.GET,
791802
self.URL,
792803
body="Hello!",
793-
adding_headers={"X-Response-Header": "response-value"},
804+
headers={"X-Response-Header": "response-value"},
794805
)
795806
result = requests.get(self.URL, headers=headers, timeout=5)
796807
self.assertEqual(result.text, "Hello!")
@@ -824,11 +835,12 @@ def test_sensitive_headers_sanitized(self):
824835
"Set-Cookie": "session=abc123",
825836
"X-Secret": "secret",
826837
}
827-
httpretty.register_uri(
828-
httpretty.GET,
838+
Mocket.reset()
839+
Entry.single_register(
840+
Entry.GET,
829841
self.URL,
830842
body="Hello!",
831-
adding_headers=response_headers,
843+
headers=response_headers,
832844
)
833845
result = requests.get(self.URL, headers=request_headers, timeout=5)
834846
self.assertEqual(result.text, "Hello!")
@@ -872,11 +884,12 @@ def test_custom_headers_with_regex(self):
872884
"X-Custom-Response-B": "value-B",
873885
"X-Other-Response-Header": "other-value",
874886
}
875-
httpretty.register_uri(
876-
httpretty.GET,
887+
Mocket.reset()
888+
Entry.single_register(
889+
Entry.GET,
877890
self.URL,
878891
body="Hello!",
879-
adding_headers=response_headers,
892+
headers=response_headers,
880893
)
881894
result = requests.get(self.URL, headers=request_headers, timeout=5)
882895
self.assertEqual(result.text, "Hello!")
@@ -918,11 +931,12 @@ def test_custom_headers_case_insensitive(self):
918931
RequestsInstrumentor().instrument()
919932
request_headers = {"X-ReQuESt-HeaDER": "custom-value"}
920933
response_headers = {"X-ReSPoNse-HeaDER": "custom-value"}
921-
httpretty.register_uri(
922-
httpretty.GET,
934+
Mocket.reset()
935+
Entry.single_register(
936+
Entry.GET,
923937
self.URL,
924938
body="Hello!",
925-
adding_headers=response_headers,
939+
headers=response_headers,
926940
)
927941
result = requests.get(self.URL, headers=request_headers, timeout=5)
928942
self.assertEqual(result.text, "Hello!")
@@ -973,15 +987,16 @@ def setUp(self):
973987
_OpenTelemetrySemanticConventionStability._initialized = False
974988
RequestsInstrumentor().instrument(meter_provider=self.meter_provider)
975989

976-
httpretty.enable()
977-
httpretty.register_uri(httpretty.GET, self.URL, body="Hello!")
990+
self.mocketizer = Mocketizer(strict_mode=True)
991+
self.mocketizer.enter()
992+
Entry.single_register(Entry.GET, self.URL, body="Hello!")
978993

979994
def tearDown(self):
980995
super().tearDown()
981996
self.env_patch.stop()
982997
_OpenTelemetrySemanticConventionStability._initialized = False
983998
RequestsInstrumentor().uninstrument()
984-
httpretty.disable()
999+
self.mocketizer.exit()
9851000

9861001
@staticmethod
9871002
def perform_request(url: str) -> requests.Response:

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@
33

44
from unittest import mock
55

6-
import httpretty
76
import requests
7+
from mocket import Mocketizer
8+
from mocket.mocks.mockhttp import Entry
89

910
from opentelemetry.instrumentation.requests import RequestsInstrumentor
1011
from opentelemetry.semconv._incubating.attributes.user_agent_attributes import (
@@ -21,13 +22,14 @@ class TestUserAgentSynthetic(TestBase):
2122
def setUp(self):
2223
super().setUp()
2324
RequestsInstrumentor().instrument()
24-
httpretty.enable()
25-
httpretty.register_uri(httpretty.GET, self.URL, body="Hello!")
25+
self.mocketizer = Mocketizer(strict_mode=True)
26+
self.mocketizer.enter()
27+
Entry.single_register(Entry.GET, self.URL, body="Hello!")
2628

2729
def tearDown(self):
2830
super().tearDown()
2931
RequestsInstrumentor().uninstrument()
30-
httpretty.disable()
32+
self.mocketizer.exit()
3133

3234
def assert_span(self, num_spans=1):
3335
span_list = self.memory_exporter.get_finished_spans()

0 commit comments

Comments
 (0)