Class: Desiru::Persistence::Repositories::ApiRequestRepository

Inherits:
BaseRepository
  • Object
show all
Defined in:
lib/desiru/persistence/repositories/api_request_repository.rb

Overview

Repository for API request records

Instance Attribute Summary

Attributes inherited from BaseRepository

#model_class

Instance Method Summary collapse

Methods inherited from BaseRepository

#all, #count, #create, #delete?, #exists?, #find, #find_by, #paginate, #update, #where

Constructor Details

#initializeApiRequestRepository

Returns a new instance of ApiRequestRepository.



10
11
12
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 10

def initialize
  super(Models::ApiRequest)
end

Instance Method Details

#average_response_time(path = nil) ⇒ Object



37
38
39
40
41
42
43
44
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 37

def average_response_time(path = nil)
  scope = dataset
  scope = scope.where(path: path) if path
  scope = scope.exclude(response_time: nil)

  avg = scope.avg(:response_time)
  avg&.round(3)
end

#by_status_code_range(min, max) ⇒ Object



25
26
27
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 25

def by_status_code_range(min, max)
  dataset.where(status_code: min..max).all
end

#create_from_rack_request(request, response) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 61

def create_from_rack_request(request, response)
  create(
    method: request.request_method,
    path: request.path_info,
    remote_ip: request.ip,
    headers: extract_headers(request),
    params: request.params,
    status_code: response.status,
    response_body: extract_response_body(response),
    response_time: response.headers['X-Runtime']&.to_f
  )
end

#failedObject



33
34
35
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 33

def failed
  dataset.where { status_code >= 400 }.all
end

#find_by_path(path) ⇒ Object



14
15
16
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 14

def find_by_path(path)
  dataset.where(path: path).all
end

#recent(limit = 10) ⇒ Object



18
19
20
21
22
23
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 18

def recent(limit = 10)
  dataset
    .order(Sequel.desc(:created_at))
    .limit(limit)
    .all
end

#requests_per_minute(minutes_ago = 60) ⇒ Object



46
47
48
49
50
51
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 46

def requests_per_minute(minutes_ago = 60)
  since = Time.now - (minutes_ago * 60)
  count = dataset.where { created_at >= since }.count

  (count.to_f / minutes_ago).round(2)
end

#successfulObject



29
30
31
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 29

def successful
  by_status_code_range(200, 299)
end

#top_paths(limit = 10) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/desiru/persistence/repositories/api_request_repository.rb', line 53

def top_paths(limit = 10)
  dataset
    .group_and_count(:path)
    .order(Sequel.desc(:count))
    .limit(limit)
    .map { |row| { path: row[:path], count: row[:count] } }
end