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