Skip to content

Commit 1279eec

Browse files
ahmedetefysentry-bot
and
sentry-bot
authored
feat(release-health): Enable session tracking by default (getsentry#994)
* Auto enabled auto session tracking * Moved auto_session_tracking outof expeirmental features and added it by default * fix: Formatting * Fixed type error * Removed auto_session_tracking from from Experiment type * Removed redundant default * Auto detection of session mode when auto_session_tracking is enabled * fix: Formatting * Added test that ensures session mode is flips from applicatoin to request in WSGI handler * New line at end of file * Linting fixes * Added default for session_mode in auto_session_tracking * Added defaults to session_mode to Session class * Fixed failing test due to changes in WSGI handler tracking requests: * Reordered param to the end * fix: Formatting * Modified flask test to match request mode sessions * Removed redundant typing Union Co-authored-by: sentry-bot <markus+ghbot@sentry.io>
1 parent 37105d9 commit 1279eec

File tree

9 files changed

+94
-30
lines changed

9 files changed

+94
-30
lines changed

sentry_sdk/client.py

+2-6
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,8 @@ def _capture_envelope(envelope):
105105
try:
106106
_client_init_debug.set(self.options["debug"])
107107
self.transport = make_transport(self.options)
108-
session_mode = self.options["_experiments"].get(
109-
"session_mode", "application"
110-
)
111-
self.session_flusher = SessionFlusher(
112-
capture_func=_capture_envelope, session_mode=session_mode
113-
)
108+
109+
self.session_flusher = SessionFlusher(capture_func=_capture_envelope)
114110

115111
request_bodies = ("always", "never", "small", "medium")
116112
if self.options["request_bodies"] not in request_bodies:

sentry_sdk/consts.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
{
3232
"max_spans": Optional[int],
3333
"record_sql_params": Optional[bool],
34-
"auto_session_tracking": Optional[bool],
3534
"smart_transaction_trimming": Optional[bool],
3635
},
3736
total=False,
@@ -75,6 +74,7 @@ def __init__(
7574
traces_sample_rate=None, # type: Optional[float]
7675
traces_sampler=None, # type: Optional[TracesSampler]
7776
auto_enabling_integrations=True, # type: bool
77+
auto_session_tracking=True, # type: bool
7878
_experiments={}, # type: Experiments # noqa: B006
7979
):
8080
# type: (...) -> None

sentry_sdk/hub.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,9 @@ def inner():
623623

624624
return inner()
625625

626-
def start_session(self):
626+
def start_session(
627+
self, session_mode="application" # type: str
628+
):
627629
# type: (...) -> None
628630
"""Starts a new session."""
629631
self.end_session()
@@ -632,6 +634,7 @@ def start_session(self):
632634
release=client.options["release"] if client else None,
633635
environment=client.options["environment"] if client else None,
634636
user=scope._user,
637+
session_mode=session_mode,
635638
)
636639

637640
def end_session(self):

sentry_sdk/integrations/wsgi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def __call__(self, environ, start_response):
103103
_wsgi_middleware_applied.set(True)
104104
try:
105105
hub = Hub(Hub.current)
106-
with auto_session_tracking(hub):
106+
with auto_session_tracking(hub, session_mode="request"):
107107
with hub:
108108
with capture_internal_exceptions():
109109
with hub.configure_scope() as scope:

sentry_sdk/session.py

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def __init__(
4242
ip_address=None, # type: Optional[str]
4343
errors=None, # type: Optional[int]
4444
user=None, # type: Optional[Any]
45+
session_mode="application", # type: str
4546
):
4647
# type: (...) -> None
4748
if sid is None:
@@ -58,6 +59,7 @@ def __init__(
5859
self.duration = None # type: Optional[float]
5960
self.user_agent = None # type: Optional[str]
6061
self.ip_address = None # type: Optional[str]
62+
self.session_mode = session_mode # type: str
6163
self.errors = 0
6264

6365
self.update(

sentry_sdk/sessions.py

+6-8
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,20 @@ def is_auto_session_tracking_enabled(hub=None):
2525
hub = sentry_sdk.Hub.current
2626
should_track = hub.scope._force_auto_session_tracking
2727
if should_track is None:
28-
exp = hub.client.options["_experiments"] if hub.client else {}
29-
should_track = exp.get("auto_session_tracking")
28+
client_options = hub.client.options if hub.client else {}
29+
should_track = client_options["auto_session_tracking"]
3030
return should_track
3131

3232

3333
@contextmanager
34-
def auto_session_tracking(hub=None):
35-
# type: (Optional[sentry_sdk.Hub]) -> Generator[None, None, None]
34+
def auto_session_tracking(hub=None, session_mode="application"):
35+
# type: (Optional[sentry_sdk.Hub], str) -> Generator[None, None, None]
3636
"""Starts and stops a session automatically around a block."""
3737
if hub is None:
3838
hub = sentry_sdk.Hub.current
3939
should_track = is_auto_session_tracking_enabled(hub)
4040
if should_track:
41-
hub.start_session()
41+
hub.start_session(session_mode=session_mode)
4242
try:
4343
yield
4444
finally:
@@ -59,12 +59,10 @@ class SessionFlusher(object):
5959
def __init__(
6060
self,
6161
capture_func, # type: Callable[[Envelope], None]
62-
session_mode, # type: str
6362
flush_interval=60, # type: int
6463
):
6564
# type: (...) -> None
6665
self.capture_func = capture_func
67-
self.session_mode = session_mode
6866
self.flush_interval = flush_interval
6967
self.pending_sessions = [] # type: List[Any]
7068
self.pending_aggregates = {} # type: Dict[Any, Any]
@@ -158,7 +156,7 @@ def add_session(
158156
self, session # type: Session
159157
):
160158
# type: (...) -> None
161-
if self.session_mode == "request":
159+
if session.session_mode == "request":
162160
self.add_aggregate_session(session)
163161
else:
164162
self.pending_sessions.append(session.to_json())

tests/integrations/flask/test_flask.py

+5-9
Original file line numberDiff line numberDiff line change
@@ -247,9 +247,6 @@ def test_flask_session_tracking(sentry_init, capture_envelopes, app):
247247
sentry_init(
248248
integrations=[flask_sentry.FlaskIntegration()],
249249
release="demo-release",
250-
_experiments=dict(
251-
auto_session_tracking=True,
252-
),
253250
)
254251

255252
@app.route("/")
@@ -276,16 +273,15 @@ def index():
276273
first_event = first_event.get_event()
277274
error_event = error_event.get_event()
278275
session = session.items[0].payload.json
276+
aggregates = session["aggregates"]
279277

280278
assert first_event["exception"]["values"][0]["type"] == "ValueError"
281279
assert error_event["exception"]["values"][0]["type"] == "ZeroDivisionError"
282-
assert session["status"] == "crashed"
283-
assert session["did"] == "42"
284-
assert session["errors"] == 2
285-
assert session["init"]
280+
281+
assert len(aggregates) == 1
282+
assert aggregates[0]["crashed"] == 1
283+
assert aggregates[0]["started"]
286284
assert session["attrs"]["release"] == "demo-release"
287-
assert session["attrs"]["ip_address"] == "1.2.3.4"
288-
assert session["attrs"]["user_agent"] == "blafasel/1.0"
289285

290286

291287
@pytest.mark.parametrize("data", [{}, []], ids=["empty-dict", "empty-list"])

tests/integrations/wsgi/test_wsgi.py

+35
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from werkzeug.test import Client
22
import pytest
33

4+
import sentry_sdk
45
from sentry_sdk.integrations.wsgi import SentryWsgiMiddleware
56

67
try:
@@ -201,3 +202,37 @@ def app(environ, start_response):
201202
}
202203
)
203204
)
205+
206+
207+
def test_session_mode_defaults_to_request_mode_in_wsgi_handler(
208+
capture_envelopes, sentry_init
209+
):
210+
"""
211+
Test that ensures that even though the default `session_mode` for
212+
auto_session_tracking is `application`, that flips to `request` when we are
213+
in the WSGI handler
214+
"""
215+
216+
def app(environ, start_response):
217+
start_response("200 OK", [])
218+
return ["Go get the ball! Good dog!"]
219+
220+
traces_sampler = mock.Mock(return_value=True)
221+
sentry_init(send_default_pii=True, traces_sampler=traces_sampler)
222+
223+
app = SentryWsgiMiddleware(app)
224+
envelopes = capture_envelopes()
225+
226+
client = Client(app)
227+
228+
client.get("/dogs/are/great/")
229+
230+
sentry_sdk.flush()
231+
232+
sess = envelopes[1]
233+
assert len(sess.items) == 1
234+
sess_event = sess.items[0].payload.json
235+
236+
aggregates = sess_event["aggregates"]
237+
assert len(aggregates) == 1
238+
assert aggregates[0]["exited"] == 1

tests/test_sessions.py

+38-4
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,12 @@ def test_aggregates(sentry_init, capture_envelopes):
4747
sentry_init(
4848
release="fun-release",
4949
environment="not-fun-env",
50-
_experiments={"auto_session_tracking": True, "session_mode": "request"},
5150
)
5251
envelopes = capture_envelopes()
5352

5453
hub = Hub.current
5554

56-
with auto_session_tracking():
55+
with auto_session_tracking(session_mode="request"):
5756
with sentry_sdk.push_scope():
5857
try:
5958
with sentry_sdk.configure_scope() as scope:
@@ -62,10 +61,10 @@ def test_aggregates(sentry_init, capture_envelopes):
6261
except Exception:
6362
sentry_sdk.capture_exception()
6463

65-
with auto_session_tracking():
64+
with auto_session_tracking(session_mode="request"):
6665
pass
6766

68-
hub.start_session()
67+
hub.start_session(session_mode="request")
6968
hub.end_session()
7069

7170
sentry_sdk.flush()
@@ -85,3 +84,38 @@ def test_aggregates(sentry_init, capture_envelopes):
8584
assert len(aggregates) == 1
8685
assert aggregates[0]["exited"] == 2
8786
assert aggregates[0]["errored"] == 1
87+
88+
89+
def test_aggregates_explicitly_disabled_session_tracking_request_mode(
90+
sentry_init, capture_envelopes
91+
):
92+
sentry_init(
93+
release="fun-release", environment="not-fun-env", auto_session_tracking=False
94+
)
95+
envelopes = capture_envelopes()
96+
97+
hub = Hub.current
98+
99+
with auto_session_tracking(session_mode="request"):
100+
with sentry_sdk.push_scope():
101+
try:
102+
raise Exception("all is wrong")
103+
except Exception:
104+
sentry_sdk.capture_exception()
105+
106+
with auto_session_tracking(session_mode="request"):
107+
pass
108+
109+
hub.start_session(session_mode="request")
110+
hub.end_session()
111+
112+
sentry_sdk.flush()
113+
114+
sess = envelopes[1]
115+
assert len(sess.items) == 1
116+
sess_event = sess.items[0].payload.json
117+
118+
aggregates = sorted_aggregates(sess_event)
119+
assert len(aggregates) == 1
120+
assert aggregates[0]["exited"] == 1
121+
assert "errored" not in aggregates[0]

0 commit comments

Comments
 (0)