Skip to content

Commit f9d1e3f

Browse files
committed
feat: Save render return value to a thread-local
1 parent a5abcdf commit f9d1e3f

File tree

3 files changed

+39
-11
lines changed

3 files changed

+39
-11
lines changed

lib/appmap/gem_hooks/actionpack.yml

+6
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,9 @@
4343
- ActionController::Instrumentation#redirect_to
4444
label: mvc.controller
4545
require_name: action_controller
46+
- methods:
47+
- AbstractController::Rendering#render_to_body
48+
- ActionController::Renderers#render_to_body
49+
label: mvc.render
50+
handler_class: AppMap::Handler::Rails::RenderHandler
51+
require_name: action_controller
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'appmap/handler/function'
2+
3+
module AppMap
4+
module Handler
5+
module Rails
6+
class RenderHandler < AppMap::Handler::Function
7+
def handle_call(receiver, args)
8+
options, _ = args
9+
if options[:json]
10+
Thread.current[TEMPLATE_RENDER_VALUE] = options[:json]
11+
end
12+
13+
super
14+
end
15+
end
16+
end
17+
end
18+
end

lib/appmap/handler/rails/request_handler.rb

+15-11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
module AppMap
88
module Handler
99
module Rails
10+
11+
TEMPLATE_RENDER_VALUE = 'appmap.handler.rails.template.return_value'
12+
1013
module RequestHandler
1114
class HTTPServerRequest < AppMap::Event::MethodEvent
1215
attr_accessor :normalized_path_info, :request_method, :path_info, :params, :headers
@@ -46,8 +49,7 @@ def to_h
4649
value: self.class.display_string(val),
4750
object_id: val.__id__,
4851
}.tap do |message|
49-
properties = object_properties(val)
50-
message[:properties] = properties if properties
52+
AppMap::Event::MethodEvent.add_schema message, val, always: true
5153
end
5254
end
5355
end
@@ -67,16 +69,16 @@ def normalized_path(request, router = ::Rails.application.routes.router)
6769
end
6870
end
6971

70-
class HTTPServerResponse < AppMap::Event::MethodReturnIgnoreValue
72+
class HTTPServerResponse < AppMap::Event::MethodReturn
7173
attr_accessor :status, :headers
7274

73-
def initialize(response, parent_id, elapsed)
74-
super AppMap::Event.next_id_counter, :return, Thread.current.object_id
75-
76-
self.status = response.status
77-
self.parent_id = parent_id
78-
self.elapsed = elapsed
79-
self.headers = response.headers.dup
75+
class << self
76+
def build_from_invocation(parent_id, return_value, elapsed, response, event: HTTPServerResponse.new)
77+
event ||= HTTPServerResponse.new
78+
event.status = response.status
79+
event.headers = response.headers.dup
80+
AppMap::Event::MethodReturn.build_from_invocation parent_id, return_value, nil, elapsed: elapsed, event: event
81+
end
8082
end
8183

8284
def to_h
@@ -108,7 +110,9 @@ def before_hook(receiver, *)
108110
end
109111

110112
def after_hook(receiver, call_event, elapsed, *)
111-
return_event = HTTPServerResponse.new receiver.response, call_event.id, elapsed
113+
return_value = Thread.current[TEMPLATE_RENDER_VALUE]
114+
Thread.current[TEMPLATE_RENDER_VALUE] = nil
115+
return_event = HTTPServerResponse.build_from_invocation call_event.id, return_value, elapsed, receiver.response
112116
AppMap.tracing.record_event return_event
113117
end
114118
end

0 commit comments

Comments
 (0)