Skip to content

Commit a5f8d37

Browse files
authored
Django caching span fixes (#2086)
* More specific span op * Fixing cache key given in kwargs instead of args
1 parent 1c35d48 commit a5f8d37

File tree

3 files changed

+57
-11
lines changed

3 files changed

+57
-11
lines changed

sentry_sdk/consts.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class SPANDATA:
9696

9797

9898
class OP:
99-
CACHE = "cache"
99+
CACHE_GET_ITEM = "cache.get_item"
100100
DB = "db"
101101
DB_REDIS = "db.redis"
102102
EVENT_DJANGO = "event.django"

sentry_sdk/integrations/django/caching.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@
2020
]
2121

2222

23+
def _get_span_description(method_name, args, kwargs):
24+
# type: (str, Any, Any) -> str
25+
description = "{} ".format(method_name)
26+
27+
if args is not None and len(args) >= 1:
28+
description += text_type(args[0])
29+
elif kwargs is not None and "key" in kwargs:
30+
description += text_type(kwargs["key"])
31+
32+
return description
33+
34+
2335
def _patch_cache_method(cache, method_name):
2436
# type: (CacheHandler, str) -> None
2537
from sentry_sdk.integrations.django import DjangoIntegration
@@ -31,9 +43,9 @@ def _instrument_call(cache, method_name, original_method, args, kwargs):
3143
if integration is None or not integration.cache_spans:
3244
return original_method(*args, **kwargs)
3345

34-
description = "{} {}".format(method_name, args[0])
46+
description = _get_span_description(method_name, args, kwargs)
3547

36-
with hub.start_span(op=OP.CACHE, description=description) as span:
48+
with hub.start_span(op=OP.CACHE_GET_ITEM, description=description) as span:
3749
value = original_method(*args, **kwargs)
3850

3951
if value:

tests/integrations/django/test_basic.py

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from sentry_sdk.consts import SPANDATA
2323
from sentry_sdk.integrations.django import DjangoIntegration
2424
from sentry_sdk.integrations.django.signals_handlers import _get_receiver_name
25+
from sentry_sdk.integrations.django.caching import _get_span_description
2526
from sentry_sdk.integrations.executing import ExecutingIntegration
2627
from tests.integrations.django.myapp.wsgi import application
2728
from tests.integrations.django.utils import pytest_mark_django_db_decorator
@@ -1035,20 +1036,20 @@ def test_cache_spans_middleware(
10351036

10361037
(first_event, second_event) = events
10371038
assert len(first_event["spans"]) == 1
1038-
assert first_event["spans"][0]["op"] == "cache"
1039+
assert first_event["spans"][0]["op"] == "cache.get_item"
10391040
assert first_event["spans"][0]["description"].startswith(
10401041
"get views.decorators.cache.cache_header."
10411042
)
10421043
assert first_event["spans"][0]["data"] == {"cache.hit": False}
10431044

10441045
assert len(second_event["spans"]) == 2
1045-
assert second_event["spans"][0]["op"] == "cache"
1046+
assert second_event["spans"][0]["op"] == "cache.get_item"
10461047
assert second_event["spans"][0]["description"].startswith(
10471048
"get views.decorators.cache.cache_header."
10481049
)
10491050
assert second_event["spans"][0]["data"] == {"cache.hit": False}
10501051

1051-
assert second_event["spans"][1]["op"] == "cache"
1052+
assert second_event["spans"][1]["op"] == "cache.get_item"
10521053
assert second_event["spans"][1]["description"].startswith(
10531054
"get views.decorators.cache.cache_page."
10541055
)
@@ -1077,20 +1078,20 @@ def test_cache_spans_decorator(sentry_init, client, capture_events, use_django_c
10771078

10781079
(first_event, second_event) = events
10791080
assert len(first_event["spans"]) == 1
1080-
assert first_event["spans"][0]["op"] == "cache"
1081+
assert first_event["spans"][0]["op"] == "cache.get_item"
10811082
assert first_event["spans"][0]["description"].startswith(
10821083
"get views.decorators.cache.cache_header."
10831084
)
10841085
assert first_event["spans"][0]["data"] == {"cache.hit": False}
10851086

10861087
assert len(second_event["spans"]) == 2
1087-
assert second_event["spans"][0]["op"] == "cache"
1088+
assert second_event["spans"][0]["op"] == "cache.get_item"
10881089
assert second_event["spans"][0]["description"].startswith(
10891090
"get views.decorators.cache.cache_header."
10901091
)
10911092
assert second_event["spans"][0]["data"] == {"cache.hit": False}
10921093

1093-
assert second_event["spans"][1]["op"] == "cache"
1094+
assert second_event["spans"][1]["op"] == "cache.get_item"
10941095
assert second_event["spans"][1]["description"].startswith(
10951096
"get views.decorators.cache.cache_page."
10961097
)
@@ -1121,16 +1122,49 @@ def test_cache_spans_templatetag(
11211122

11221123
(first_event, second_event) = events
11231124
assert len(first_event["spans"]) == 1
1124-
assert first_event["spans"][0]["op"] == "cache"
1125+
assert first_event["spans"][0]["op"] == "cache.get_item"
11251126
assert first_event["spans"][0]["description"].startswith(
11261127
"get template.cache.some_identifier."
11271128
)
11281129
assert first_event["spans"][0]["data"] == {"cache.hit": False}
11291130

11301131
assert len(second_event["spans"]) == 1
1131-
assert second_event["spans"][0]["op"] == "cache"
1132+
assert second_event["spans"][0]["op"] == "cache.get_item"
11321133
assert second_event["spans"][0]["description"].startswith(
11331134
"get template.cache.some_identifier."
11341135
)
11351136
assert second_event["spans"][0]["data"]["cache.hit"]
11361137
assert "cache.item_size" in second_event["spans"][0]["data"]
1138+
1139+
1140+
@pytest.mark.parametrize(
1141+
"method_name, args, kwargs, expected_description",
1142+
[
1143+
("get", None, None, "get "),
1144+
("get", [], {}, "get "),
1145+
("get", ["bla", "blub", "foo"], {}, "get bla"),
1146+
(
1147+
"get_many",
1148+
[["bla 1", "bla 2", "bla 3"], "blub", "foo"],
1149+
{},
1150+
"get_many ['bla 1', 'bla 2', 'bla 3']",
1151+
),
1152+
(
1153+
"get_many",
1154+
[["bla 1", "bla 2", "bla 3"], "blub", "foo"],
1155+
{"key": "bar"},
1156+
"get_many ['bla 1', 'bla 2', 'bla 3']",
1157+
),
1158+
("get", [], {"key": "bar"}, "get bar"),
1159+
(
1160+
"get",
1161+
"something",
1162+
{},
1163+
"get s",
1164+
), # this should never happen, just making sure that we are not raising an exception in that case.
1165+
],
1166+
)
1167+
def test_cache_spans_get_span_description(
1168+
method_name, args, kwargs, expected_description
1169+
):
1170+
assert _get_span_description(method_name, args, kwargs) == expected_description

0 commit comments

Comments
 (0)