Skip to content

Commit eb808ab

Browse files
committed
Track in-flight session requests
1 parent fe03383 commit eb808ab

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed

bugsnag/sessiontracker.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from bugsnag.notifier import _NOTIFIER_INFORMATION
1717
from bugsnag.utils import FilterDict, SanitizingJSONEncoder
1818
from bugsnag.event import Event
19+
from bugsnag.request_tracker import RequestTracker
1920

2021

2122
__all__ = [] # type: List[str]
@@ -36,6 +37,7 @@ def __init__(self, configuration):
3637
self.mutex = Lock()
3738
self.auto_sessions = False
3839
self.delivery_thread = None
40+
self._request_tracker = RequestTracker()
3941

4042
def start_session(self):
4143
if not self.auto_sessions:
@@ -138,15 +140,25 @@ def __deliver(self, sessions: List[Dict], asynchronous=True):
138140
deliver = self.config.delivery.deliver_sessions
139141

140142
if 'options' in deliver.__code__.co_varnames:
141-
deliver(
142-
self.config,
143-
encoded_payload,
144-
options={'asynchronous': asynchronous}
145-
)
143+
try:
144+
post_delivery_callback = self._request_tracker.new_request()
145+
146+
deliver(
147+
self.config,
148+
encoded_payload,
149+
options={
150+
'asynchronous': asynchronous,
151+
'post_delivery_callback': post_delivery_callback,
152+
}
153+
)
154+
except Exception:
155+
# ensure the request is not still marked as pending
156+
post_delivery_callback()
157+
raise
158+
146159
else:
147160
deliver(self.config, encoded_payload)
148161

149-
150162
except Exception as e:
151163
self.config.logger.exception('Sending sessions failed %s', e)
152164

tests/test_sessiontracker.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from bugsnag.configuration import Configuration
66
from bugsnag.notifier import _NOTIFIER_INFORMATION
77
from bugsnag.sessiontracker import SessionTracker
8-
from tests.utils import IntegrationTest
8+
from tests.utils import BrokenDelivery, IntegrationTest, QueueingDelivery
99
from unittest.mock import Mock
1010

1111

@@ -192,3 +192,37 @@ def test_session_tracker_starts_delivery_when_auto_capture_is_off(self):
192192
self.server.wait_for_session()
193193

194194
assert self.server.sent_session_count == 1
195+
196+
def test_session_tracker_tracks_in_flight_requests(self):
197+
delivery = QueueingDelivery()
198+
client = Client(
199+
api_key='a05afff2bd2ffaf0ab0f52715bbdcffd',
200+
auto_capture_sessions=False,
201+
session_endpoint=self.server.sessions_url,
202+
asynchronous=False,
203+
delivery=delivery,
204+
)
205+
206+
client.session_tracker.start_session()
207+
client.session_tracker.send_sessions()
208+
209+
request_tracker = client.session_tracker._request_tracker
210+
assert request_tracker.has_in_flight_requests()
211+
212+
delivery.flush_request_queue()
213+
assert not request_tracker.has_in_flight_requests()
214+
215+
def test_session_tracker_tracks_in_flight_requests_failure(self):
216+
client = Client(
217+
api_key='a05afff2bd2ffaf0ab0f52715bbdcffd',
218+
auto_capture_sessions=False,
219+
session_endpoint=self.server.sessions_url,
220+
asynchronous=False,
221+
delivery=BrokenDelivery(),
222+
)
223+
224+
client.session_tracker.start_session()
225+
client.session_tracker.send_sessions()
226+
227+
request_tracker = client.session_tracker._request_tracker
228+
assert not request_tracker.has_in_flight_requests()

0 commit comments

Comments
 (0)