Add session tracking to ASGI integration by antonpirker · Pull Request #1329 · getsentry/sentry-python · GitHub
Skip to content
64 changes: 33 additions & 31 deletions sentry_sdk/integrations/asgi.py
4 changes: 2 additions & 2 deletions test-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
pytest
pytest-forked
pytest<7
pytest-forked<=1.4.0
tox==3.7.0
Werkzeug
pytest-localserver==0.5.0
Expand Down
42 changes: 41 additions & 1 deletion tests/integrations/asgi/test_asgi.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from collections import Counter
import sys

import pytest
from sentry_sdk import Hub, capture_message, last_event_id
import sentry_sdk
from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
from starlette.applications import Starlette
from starlette.responses import PlainTextResponse
Expand Down Expand Up @@ -39,7 +41,7 @@ def test_sync_request_data(sentry_init, app, capture_events):
events = capture_events()

client = TestClient(app)
response = client.get("/sync-message?foo=bar", headers={"Foo": u"ä"})
response = client.get("/sync-message?foo=bar", headers={"Foo": "ä"})

assert response.status_code == 200

Expand Down Expand Up @@ -292,3 +294,41 @@ def test_x_real_ip(sentry_init, app, capture_events):

(event,) = events
assert event["request"]["env"] == {"REMOTE_ADDR": "1.2.3.4"}


def test_auto_session_tracking_with_aggregates(app, sentry_init, capture_envelopes):
"""
Test for correct session aggregates in auto session tracking.
"""

@app.route("/dogs/are/great/")
@app.route("/trigger/an/error/")
def great_dogs_handler(request):
if request["path"] != "/dogs/are/great/":
1 / 0
return PlainTextResponse("dogs are great")

sentry_init(traces_sample_rate=1.0)
envelopes = capture_envelopes()

app = SentryAsgiMiddleware(app)
client = TestClient(app, raise_server_exceptions=False)
client.get("/dogs/are/great/")
client.get("/dogs/are/great/")
client.get("/trigger/an/error/")

sentry_sdk.flush()

count_item_types = Counter()
for envelope in envelopes:
count_item_types[envelope.items[0].type] += 1

assert count_item_types["transaction"] == 3
assert count_item_types["event"] == 1
assert count_item_types["sessions"] == 1
assert len(envelopes) == 5

session_aggregates = envelopes[-1].items[0].payload.json["aggregates"]
assert session_aggregates[0]["exited"] == 2
assert session_aggregates[0]["crashed"] == 1
assert len(session_aggregates) == 1
45 changes: 44 additions & 1 deletion tests/integrations/wsgi/test_wsgi.py