Class: Railswatch::Gems::GrapeExt

Inherits:
Object
  • Object
show all
Defined in:
lib/railswatch/gems/grape_ext.rb

Class Method Summary collapse

Class Method Details

.handle_grape_notification(name, start, finish, payload) ⇒ Object



13
14
15
16
17
18
19
20
# File 'lib/railswatch/gems/grape_ext.rb', line 13

def handle_grape_notification(name, start, finish, payload)
  req = setup_grape_request
  now = Railswatch::Utils.time
  set_record_fields(req, now)
  set_timing_field(req.record, name, start, finish)
  set_payload_fields(req.record, payload[:env]) if payload[:env]
  save_and_cleanup_if_needed(req, name, payload)
end

.initObject



7
8
9
10
11
# File 'lib/railswatch/gems/grape_ext.rb', line 7

def init
  ActiveSupport::Notifications.subscribe(/grape/) do |name, start, finish, _id, payload|
    handle_grape_notification(name, start, finish, payload)
  end
end

.name_grape_expect_no_content?(req, name, payload) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
45
# File 'lib/railswatch/gems/grape_ext.rb', line 42

def name_grape_expect_no_content?(req, name, payload)
  expects_no_content = Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include?(req.record.status.to_i)
  name == 'endpoint_run.grape' && (payload[:endpoint]&.body.nil? || expects_no_content)
end

.save_and_cleanup_if_needed(req, name, payload) ⇒ Object



35
36
37
38
39
40
# File 'lib/railswatch/gems/grape_ext.rb', line 35

def save_and_cleanup_if_needed(req, name, payload)
  return unless name == 'format_response.grape' || name_grape_expect_no_content?(req, name, payload)

  req.record.save
  CurrentRequest.cleanup
end

.set_payload_fields(record, env) ⇒ Object



53
54
55
56
57
58
59
60
# File 'lib/railswatch/gems/grape_ext.rb', line 53

def set_payload_fields(record, env)
  endpoint = env['api.endpoint']

  record.status = endpoint&.status || env['api.response.status']
  record.format = env['api.format']
  record.method = env['REQUEST_METHOD']
  record.path = env['PATH_INFO']
end

.set_record_fields(req, now) ⇒ Object



30
31
32
33
# File 'lib/railswatch/gems/grape_ext.rb', line 30

def set_record_fields(req, now)
  req.record.datetimei ||= now.to_i
  req.record.datetime ||= now.strftime(Railswatch::FORMAT)
end

.set_timing_field(record, name, start, finish) ⇒ Object



47
48
49
50
51
# File 'lib/railswatch/gems/grape_ext.rb', line 47

def set_timing_field(record, name, start, finish)
  return unless ['endpoint_render.grape', 'endpoint_run.grape', 'format_response.grape'].include?(name)

  record.send("#{name.tr('.', '_')}=", (finish - start) * 1000)
end

.setup_grape_requestObject



22
23
24
25
26
27
28
# File 'lib/railswatch/gems/grape_ext.rb', line 22

def setup_grape_request
  req = CurrentRequest.current
  req.ignore.add(:monitoring)
  req.data ||= {}
  req.record ||= Railswatch::Models::GrapeRecord.new(request_id: req.request_id)
  req
end