Markdown stacktrace: render with all frames

not just in-app ones;

basic principle: more info means the LLM (or whatever) has more to go by
This commit is contained in:
Klaas van Schelven
2025-10-10 09:19:11 +02:00
parent e6e0118583
commit 9cb89ecf46
5 changed files with 6 additions and 7 deletions

View File

@@ -105,5 +105,5 @@ class EventViewSet(AtomicRequestMixin, viewsets.ReadOnlyModelViewSet):
) )
def stacktrace(self, request, pk=None): def stacktrace(self, request, pk=None):
event = self.get_object() event = self.get_object()
text = render_stacktrace_md(event, frames="in_app", include_locals=True) text = render_stacktrace_md(event, in_app_only=False, include_locals=True)
return Response(text) return Response(text)

View File

@@ -133,7 +133,7 @@ def _select_frames(frames, in_app_only):
return filtered if filtered else frames return filtered if filtered else frames
def render_stacktrace_md(event, frames="in_app", include_locals=True): def render_stacktrace_md(event, in_app_only=False, include_locals=True):
parsed = event.get_parsed_data() parsed = event.get_parsed_data()
try: try:
apply_sourcemaps(parsed) apply_sourcemaps(parsed)
@@ -163,7 +163,6 @@ def render_stacktrace_md(event, frames="in_app", include_locals=True):
if stack_of_plates and frames_list: if stack_of_plates and frames_list:
frames_list = list(reversed(frames_list)) frames_list = list(reversed(frames_list))
in_app_only = frames == "in_app"
frames_list = _select_frames(frames_list, in_app_only) frames_list = _select_frames(frames_list, in_app_only)
for frame in frames_list: for frame in frames_list:

View File

@@ -47,4 +47,4 @@ class EventDetailSerializer(UTCModelSerializer):
@extend_schema_field(serializers.CharField) @extend_schema_field(serializers.CharField)
def get_stacktrace_md(self, obj): def get_stacktrace_md(self, obj):
return render_stacktrace_md(obj, frames="in_app", include_locals=True) return render_stacktrace_md(obj, in_app_only=False, include_locals=True)

View File

@@ -32,7 +32,7 @@ def event_plaintext(request, event):
@atomic_for_request_method @atomic_for_request_method
@event_membership_required @event_membership_required
def event_markdown(request, event, as_attachment=False): def event_markdown(request, event, as_attachment=False):
text = render_stacktrace_md(event, frames="in_app", include_locals=True) text = render_stacktrace_md(event, in_app_only=False, include_locals=True)
result = HttpResponse(text, content_type="text/markdown; charset=utf-8") result = HttpResponse(text, content_type="text/markdown; charset=utf-8")
if as_attachment: if as_attachment:
result["Content-Disposition"] = content_disposition_header( result["Content-Disposition"] = content_disposition_header(

View File

@@ -596,7 +596,7 @@ class IntegrationTest(TransactionTestCase):
filename, response.content if response.status_code != 302 else response.url)) filename, response.content if response.status_code != 302 else response.url))
event = Event.objects.get(issue__project=project, event_id=data["event_id"]) event = Event.objects.get(issue__project=project, event_id=data["event_id"])
md = render_stacktrace_md(event, frames="all", include_locals=True) md = render_stacktrace_md(event, in_app_only=False, include_locals=True)
self.assertEqual('''# CapturedStacktraceFo self.assertEqual('''# CapturedStacktraceFo
4 kinds of frames 4 kinds of frames
@@ -788,7 +788,7 @@ class IssueDeletionTestCase(TransactionTestCase):
# see the note in `prune_orphans` about TagKey to understand why it's special. # see the note in `prune_orphans` about TagKey to understand why it's special.
vacuum_models = [apps.get_model(app_label=s.split('.')[0], model_name=s.split('.')[1].lower()) vacuum_models = [apps.get_model(app_label=s.split('.')[0], model_name=s.split('.')[1].lower())
for s in ['tags.TagKey',]] for s in ['tags.TagKey']]
for model in models + vacuum_models: for model in models + vacuum_models:
# test-the-test: make sure some instances of the models actually exist after setup # test-the-test: make sure some instances of the models actually exist after setup