class ServerTiming::ResponseManipulator
Adds the 'Server-Timing' response header w/metrics from Scout.
Attributes
env[R]
rack_body[R]
rack_headers[R]
rack_response[R]
rack_status[R]
Public Class Methods
new(env, rack_response)
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 8 def initialize(env, rack_response) @env = env @rack_response = rack_response @rack_status = rack_response[0] @rack_headers = rack_response[1] @rack_body = rack_response[2] end
Public Instance Methods
add_header()
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 33 def add_header rack_headers['Server-Timing'] = payload end
call()
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 17 def call return rack_response unless preconditions_met? store_metrics add_header rebuild_rack_response end
payload()
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 64 def payload headers = server_timing_metrics.map(&:to_header) headers << TimingMetric.new('Total', server_timing_metrics.map(&:duration).reduce(0,:+)).to_header headers.join(",") end
preconditions_met?()
click to toggle source
Checks if we should attempt to gather metrics.
# File lib/server_timing/response_manipulator.rb, line 26 def preconditions_met? # tracked_request.root_layer is nil for Rack apps ... unsure why. return false unless tracked_request.root_layer Auth.permitted? end
rebuild_rack_response()
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 70 def rebuild_rack_response [rack_status, rack_headers, rack_body] end
server_timing_metrics()
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 59 def server_timing_metrics @server_timing_metrics ||= store.metrics.map { |meta, stats| TimingMetric.from_scout(meta,stats)} end
store()
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 41 def store @store ||= ServerTiming::Store.new end
store_metrics()
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 45 def store_metrics layer_finder = ScoutApm::LayerConverters::FindLayerByType.new(tracked_request) converters = [ScoutApm::LayerConverters::MetricConverter] walker = ScoutApm::LayerConverters::DepthFirstWalker.new(tracked_request.root_layer) converters = converters.map do |klass| instance = klass.new(ScoutApm::Agent.instance.context, tracked_request, layer_finder, store) instance.register_hooks(walker) instance end walker.walk converters.each {|i| i.record! } end
tracked_request()
click to toggle source
# File lib/server_timing/response_manipulator.rb, line 37 def tracked_request @tracked_request ||= ScoutApm::RequestManager.lookup end