diff --git a/sentry_sdk/_types.py b/sentry_sdk/_types.py index 74020aea57..7b727422a1 100644 --- a/sentry_sdk/_types.py +++ b/sentry_sdk/_types.py @@ -35,3 +35,4 @@ "default", "error", "crash", "transaction", "security", "attachment", "session" ] SessionStatus = Literal["ok", "exited", "crashed", "abnormal"] + EndpointType = Literal["store", "envelope"] diff --git a/sentry_sdk/transport.py b/sentry_sdk/transport.py index c6f926a353..449a84532f 100644 --- a/sentry_sdk/transport.py +++ b/sentry_sdk/transport.py @@ -27,7 +27,7 @@ from urllib3.poolmanager import PoolManager # type: ignore from urllib3.poolmanager import ProxyManager - from sentry_sdk._types import Event + from sentry_sdk._types import Event, EndpointType DataCategory = Optional[str] @@ -163,6 +163,7 @@ def _send_request( self, body, # type: bytes headers, # type: Dict[str, str] + endpoint_type="store", # type: EndpointType ): # type: (...) -> None headers.update( @@ -172,7 +173,10 @@ def _send_request( } ) response = self._pool.request( - "POST", str(self._auth.store_api_url), body=body, headers=headers + "POST", + str(self._auth.get_api_url(endpoint_type)), + body=body, + headers=headers, ) try: @@ -258,6 +262,7 @@ def _send_envelope( "Content-Type": "application/x-sentry-envelope", "Content-Encoding": "gzip", }, + endpoint_type="envelope", ) return None diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index fef96adcf6..74bbc5576a 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -25,7 +25,7 @@ from typing import Union from typing import Type - from sentry_sdk._types import ExcInfo + from sentry_sdk._types import ExcInfo, EndpointType epoch = datetime(1970, 1, 1) @@ -200,12 +200,23 @@ def __init__( @property def store_api_url(self): # type: () -> str + """Returns the API url for storing events. + + Deprecated: use get_api_url instead. + """ + return self.get_api_url(type="store") + + def get_api_url( + self, type="store" # type: EndpointType + ): + # type: (...) -> str """Returns the API url for storing events.""" - return "%s://%s%sapi/%s/store/" % ( + return "%s://%s%sapi/%s/%s/" % ( self.scheme, self.host, self.path, self.project_id, + type, ) def to_header(self, timestamp=None): diff --git a/tests/utils/test_general.py b/tests/utils/test_general.py index ff6e5f5430..b80e47859a 100644 --- a/tests/utils/test_general.py +++ b/tests/utils/test_general.py @@ -84,20 +84,31 @@ def test_filename(): @pytest.mark.parametrize( - "given,expected", + "given,expected_store,expected_envelope", [ - ("https://foobar@sentry.io/123", "https://sentry.io/api/123/store/"), - ("https://foobar@sentry.io/bam/123", "https://sentry.io/bam/api/123/store/"), + ( + "https://foobar@sentry.io/123", + "https://sentry.io/api/123/store/", + "https://sentry.io/api/123/envelope/", + ), + ( + "https://foobar@sentry.io/bam/123", + "https://sentry.io/bam/api/123/store/", + "https://sentry.io/bam/api/123/envelope/", + ), ( "https://foobar@sentry.io/bam/baz/123", "https://sentry.io/bam/baz/api/123/store/", + "https://sentry.io/bam/baz/api/123/envelope/", ), ], ) -def test_parse_dsn_paths(given, expected): +def test_parse_dsn_paths(given, expected_store, expected_envelope): dsn = Dsn(given) auth = dsn.to_auth() - assert auth.store_api_url == expected + assert auth.store_api_url == expected_store + assert auth.get_api_url("store") == expected_store + assert auth.get_api_url("envelope") == expected_envelope @pytest.mark.parametrize(