From 45a8353c50fb5d03ce7759997dfe05f631d7a47d Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Thu, 6 Sep 2018 10:58:31 +0200 Subject: [PATCH 1/3] fix: Removed a stray print --- sentry_sdk/integrations/requests.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sentry_sdk/integrations/requests.py b/sentry_sdk/integrations/requests.py index 1763d1edf7..cb8752409c 100644 --- a/sentry_sdk/integrations/requests.py +++ b/sentry_sdk/integrations/requests.py @@ -38,7 +38,6 @@ def _record_request(response): _record_request(None) raise else: - print("here", resp) _record_request(resp) return resp From 24a3cecf470de41493cbeaa5145d57948c549df5 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Thu, 6 Sep 2018 11:09:16 +0200 Subject: [PATCH 2/3] feat: Added breadcrumbs for httplib --- sentry_sdk/integrations/__init__.py | 2 + sentry_sdk/integrations/stdlib.py | 50 +++++++++++++++++++++++ tests/integrations/stdlib/test_httplib.py | 30 ++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 sentry_sdk/integrations/stdlib.py create mode 100644 tests/integrations/stdlib/test_httplib.py diff --git a/sentry_sdk/integrations/__init__.py b/sentry_sdk/integrations/__init__.py index b895688468..7ea1a61379 100644 --- a/sentry_sdk/integrations/__init__.py +++ b/sentry_sdk/integrations/__init__.py @@ -9,11 +9,13 @@ def _get_default_integrations(): from .logging import LoggingIntegration + from .stdlib import StdlibIntegration from .excepthook import ExcepthookIntegration from .dedupe import DedupeIntegration from .atexit import AtexitIntegration yield LoggingIntegration + yield StdlibIntegration yield ExcepthookIntegration yield DedupeIntegration yield AtexitIntegration diff --git a/sentry_sdk/integrations/stdlib.py b/sentry_sdk/integrations/stdlib.py new file mode 100644 index 0000000000..7292433bee --- /dev/null +++ b/sentry_sdk/integrations/stdlib.py @@ -0,0 +1,50 @@ +from sentry_sdk import add_breadcrumb +from . import Integration + + +class StdlibIntegration(Integration): + identifier = "stdlib" + + def __init__(self): + try: + from httplib import HTTPConnection + except ImportError: + from http.client import HTTPConnection + self.httplib_connection_cls = HTTPConnection + + def install_httplib(self): + real_putrequest = self.httplib_connection_cls.putrequest + real_getresponse = self.httplib_connection_cls.getresponse + + def putrequest(self, method, url, *args, **kwargs): + self._sentrysdk_data_dict = data = {} + host = self.host + port = self.port + default_port = self.default_port + + real_url = url + if not real_url.startswith(("http://", "https://")): + real_url = "%s://%s%s%s" % ( + default_port == 443 and "https" or "http", + host, + port != default_port and ":%s" % port or "", + url, + ) + data["url"] = real_url + data["method"] = method + return real_putrequest(self, method, url, *args, **kwargs) + + def getresponse(self, *args, **kwargs): + rv = real_getresponse(self, *args, **kwargs) + data = getattr(self, "_sentrysdk_data_dict", None) or {} + if "status_code" not in data: + data["status_code"] = rv.status + data["reason"] = rv.reason + add_breadcrumb(type="http", category="httplib", data=data) + return rv + + self.httplib_connection_cls.putrequest = putrequest + self.httplib_connection_cls.getresponse = getresponse + + def install(self): + self.install_httplib() diff --git a/tests/integrations/stdlib/test_httplib.py b/tests/integrations/stdlib/test_httplib.py new file mode 100644 index 0000000000..08fdcf5a80 --- /dev/null +++ b/tests/integrations/stdlib/test_httplib.py @@ -0,0 +1,30 @@ +import pytest + +try: + from urllib.request import urlopen +except ImportError: + from urllib import urlopen + +from sentry_sdk import capture_message +from sentry_sdk.integrations.stdlib import StdlibIntegration + + +def test_crumb_capture(sentry_init, capture_events): + sentry_init(integrations=[StdlibIntegration()]) + events = capture_events() + + url = "https://httpbin.org/status/200" + response = urlopen(url) + assert response.getcode() == 200 + capture_message("Testing!") + + event, = events + crumb, = event["breadcrumbs"] + assert crumb["type"] == "http" + assert crumb["category"] == "httplib" + assert crumb["data"] == { + "url": url, + "method": "GET", + "status_code": 200, + "reason": 'OK', + } From b8a9743067ff990fc4d5f9a79c056dd59aea2f9f Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Fri, 7 Sep 2018 11:03:34 +0200 Subject: [PATCH 3/3] fix: Remove requests integration in favor of httplib --- sentry_sdk/integrations/requests.py | 45 -------------------- tests/integrations/requests/test_requests.py | 6 +-- tests/integrations/stdlib/test_httplib.py | 4 +- 3 files changed, 4 insertions(+), 51 deletions(-) delete mode 100644 sentry_sdk/integrations/requests.py diff --git a/sentry_sdk/integrations/requests.py b/sentry_sdk/integrations/requests.py deleted file mode 100644 index cb8752409c..0000000000 --- a/sentry_sdk/integrations/requests.py +++ /dev/null @@ -1,45 +0,0 @@ -from __future__ import absolute_import - -from sentry_sdk import add_breadcrumb -from . import Integration - -from .logging import ignore_logger - - -class RequestsIntegration(Integration): - identifier = "requests" - - def __init__(self): - from requests.sessions import Session - - self.session_cls = Session - - def install(self): - real_send = self.session_cls.send - - def send(self, request, *args, **kwargs): - def _record_request(response): - add_breadcrumb( - type="http", - category="requests", - data={ - "url": request.url, - "method": request.method, - "status_code": response is not None - and response.status_code - or None, - "reason": response is not None and response.reason or None, - }, - ) - - try: - resp = real_send(self, request, *args, **kwargs) - except Exception: - _record_request(None) - raise - else: - _record_request(resp) - return resp - - self.session_cls.send = send - ignore_logger("requests.packages.urllib3.connectionpool") diff --git a/tests/integrations/requests/test_requests.py b/tests/integrations/requests/test_requests.py index 6d5f6921f0..deaa8e3421 100644 --- a/tests/integrations/requests/test_requests.py +++ b/tests/integrations/requests/test_requests.py @@ -3,11 +3,11 @@ requests = pytest.importorskip("requests") from sentry_sdk import capture_message -from sentry_sdk.integrations.requests import RequestsIntegration +from sentry_sdk.integrations.stdlib import StdlibIntegration def test_crumb_capture(sentry_init, capture_events): - sentry_init(integrations=[RequestsIntegration()]) + sentry_init(integrations=[StdlibIntegration()]) events = capture_events() response = requests.get("https://httpbin.org/status/418") @@ -17,7 +17,7 @@ def test_crumb_capture(sentry_init, capture_events): event, = events crumb, = event["breadcrumbs"] assert crumb["type"] == "http" - assert crumb["category"] == "requests" + assert crumb["category"] == "httplib" assert crumb["data"] == { "url": "https://httpbin.org/status/418", "method": "GET", diff --git a/tests/integrations/stdlib/test_httplib.py b/tests/integrations/stdlib/test_httplib.py index 08fdcf5a80..c460d625c8 100644 --- a/tests/integrations/stdlib/test_httplib.py +++ b/tests/integrations/stdlib/test_httplib.py @@ -1,5 +1,3 @@ -import pytest - try: from urllib.request import urlopen except ImportError: @@ -26,5 +24,5 @@ def test_crumb_capture(sentry_init, capture_events): "url": url, "method": "GET", "status_code": 200, - "reason": 'OK', + "reason": "OK", }