Module: Upkeep::Capture::Request

Defined in:
lib/upkeep/capture/request.rb

Defined Under Namespace

Classes: ActionProfiler

Class Method Summary collapse

Class Method Details

.call(controller, profile: false) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/upkeep/capture/request.rb', line 32

def call(controller, profile: false)
  timings = {}
  counters = {}
  action_result, recorder = measure(timings, :action_ms) do
    if profile
      profile_action(timings, counters) do
        Runtime::Observation.capture_request(profile: true) { yield }
      end
    else
      Runtime::Observation.capture_request { yield }
    end
  end
  timings.merge!(recorder.profile_timings)
  counters.merge!(recorder.profile_counts)
  html = measure(timings, :response_body_ms) { response_body_html(controller.response.body) }
  signature = measure(timings, :signature_ms) { signature_for(controller) }
  RequestResult.new(
    action_result,
    html,
    recorder,
    controller.response.status,
    controller.response.content_type,
    controller.response.media_type,
    controller.response.successful?,
    signature,
    timings,
    counters
  )
end

.measure(timings, key) ⇒ Object



94
95
96
97
98
99
# File 'lib/upkeep/capture/request.rb', line 94

def measure(timings, key)
  started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  yield
ensure
  timings[key] = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - started_at) * 1000.0).round(3)
end

.profile_action(timings, counters) ⇒ Object



62
63
64
65
66
67
68
# File 'lib/upkeep/capture/request.rb', line 62

def profile_action(timings, counters)
  collector = ActionProfiler.new
  collector.capture { yield }.tap do
    timings.merge!(collector.timings)
    counters.merge!(collector.counters)
  end
end

.response_body_html(body) ⇒ Object



80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/upkeep/capture/request.rb', line 80

def response_body_html(body)
  case body
  when String
    body
  when Array
    body.join
  else
    return body.body.join if body.respond_to?(:body) && body.body.respond_to?(:join)
    return body.to_a.join if body.respond_to?(:to_a)

    body.to_s
  end
end

.signature_for(controller) ⇒ Object



70
71
72
73
74
75
76
77
78
# File 'lib/upkeep/capture/request.rb', line 70

def signature_for(controller)
  request = controller.request
  RequestSignature.new(
    controller.class.name,
    controller.action_name,
    request.request_method,
    request.fullpath
  )
end