rack-reqorder 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/Gemfile +3 -0
- data/Rakefile +10 -0
- data/lib/rack/reqorder/config.ru +9 -0
- data/lib/rack/reqorder/logger.rb +93 -40
- data/lib/rack/reqorder/models/app_exception.rb +19 -0
- data/lib/rack/reqorder/models/http_request.rb +12 -8
- data/lib/rack/reqorder/models/http_response.rb +9 -4
- data/lib/rack/reqorder/monitor/entities.rb +74 -0
- data/lib/rack/reqorder/monitor.rb +120 -0
- data/lib/rack/reqorder/services/backtrace_cleaner.rb +76 -0
- data/lib/rack/reqorder/version.rb +1 -1
- data/lib/rack/reqorder.rb +16 -0
- data/rack-reqorder.gemspec +3 -0
- metadata +50 -4
- data/lib/rack/reqorder/services/request_saver.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d32d460562301fbe8a9891e17ec80ca6e77f35f2
|
4
|
+
data.tar.gz: 052269bec34d67bcf99b03cdb8856fc2c8c40412
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65255514d36099c7935d2043bdb2f518fcac3a0cc2f6d1ec6e08747220d58c152174119c58f7bd8d858e0359d8ccf012ebdc88e911e5499abdbacd1c7fa8898d
|
7
|
+
data.tar.gz: 2ddbddc83cbda7f5a7c2de83e092c30dff99e2f7cd77d64bce9248a6878e37160c9ffdecde52ef59377c64d5f7cc4431906125a8b13b39320f96e39c04b4f3d9
|
data/.gitignore
CHANGED
data/Gemfile
CHANGED
data/Rakefile
CHANGED
data/lib/rack/reqorder/logger.rb
CHANGED
@@ -1,47 +1,100 @@
|
|
1
|
-
module Rack
|
2
|
-
|
3
|
-
|
4
|
-
include Rack::Reqorder::Models
|
1
|
+
module Rack::Reqorder
|
2
|
+
class Logger
|
3
|
+
include Rack::Reqorder::Models
|
5
4
|
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(environment)
|
10
|
+
http_request = save_http_request(environment)
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
HttpRequest.create(
|
16
|
-
path: request.path,
|
17
|
-
full_path: request.fullpath,
|
18
|
-
headers: extract_all_headers(request),
|
19
|
-
parameters: request.params,
|
20
|
-
)
|
21
|
-
|
22
|
-
status, headers, body = @app.call(request.env)
|
23
|
-
|
24
|
-
response = Rack::Response.new(body, status, headers)
|
25
|
-
|
26
|
-
HttpResponse.create(
|
27
|
-
headers: response.headers,
|
28
|
-
#body: response.body.first,
|
29
|
-
status: response.status.to_i
|
30
|
-
)
|
31
|
-
=begin
|
32
|
-
response.finish
|
33
|
-
=end
|
34
|
-
return [status, headers, body]
|
12
|
+
begin
|
13
|
+
status, headers, body = @app.call(environment)
|
14
|
+
rescue => exception
|
15
|
+
log_exception(exception, http_request)
|
16
|
+
raise exception
|
35
17
|
end
|
36
18
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
19
|
+
save_http_response(body, status, headers, http_request)
|
20
|
+
|
21
|
+
return [status, headers, body]
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def extract_all_headers(request)
|
27
|
+
Hash[
|
28
|
+
request.env.select{|k,v|
|
29
|
+
k.start_with? 'HTTP_'
|
30
|
+
}.map{|k,v|
|
31
|
+
[k.gsub('HTTP_','').upcase, v]
|
32
|
+
}.select{|k,v|
|
33
|
+
k != 'COOKIE'
|
34
|
+
}
|
35
|
+
]
|
36
|
+
end
|
37
|
+
|
38
|
+
def save_http_request(environment)
|
39
|
+
request = Rack::Request.new(environment)
|
40
|
+
|
41
|
+
return HttpRequest.create(
|
42
|
+
ip: request.ip,
|
43
|
+
url: request.url,
|
44
|
+
scheme: request.scheme,
|
45
|
+
base_url: request.base_url,
|
46
|
+
port: request.port,
|
47
|
+
path: request.path,
|
48
|
+
full_path: request.fullpath,
|
49
|
+
http_method: request.request_method,
|
50
|
+
headers: extract_all_headers(request),
|
51
|
+
params: request.params,
|
52
|
+
ssl: request.ssl?,
|
53
|
+
xhr: request.xhr?
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def save_http_response(body, status, headers, http_request)
|
58
|
+
response = Rack::Response.new(body, status, headers)
|
59
|
+
|
60
|
+
HttpResponse.create(
|
61
|
+
headers: response.headers,
|
62
|
+
#body: response.body.first,
|
63
|
+
status: response.status.to_i,
|
64
|
+
http_request: http_request
|
65
|
+
)
|
66
|
+
end
|
67
|
+
|
68
|
+
def log_exception(exception, http_request)
|
69
|
+
bc = BacktraceCleaner.new
|
70
|
+
bc.add_filter { |line| line.gsub(Rails.root.to_s, '') }
|
71
|
+
bc.add_silencer { |line| line =~ /gems/ }
|
72
|
+
|
73
|
+
application_trace = bc.clean(exception.backtrace)
|
74
|
+
|
75
|
+
path, line, _ = application_trace.first.split(':')
|
76
|
+
|
77
|
+
AppException.create(
|
78
|
+
message: exception.message,
|
79
|
+
application_trace: application_trace,
|
80
|
+
full_trace: exception.backtrace,
|
81
|
+
line: line.to_i,
|
82
|
+
path: path[1..-1],
|
83
|
+
source_extract: source_fragment(path[1..-1], line.to_i),
|
84
|
+
http_request: http_request
|
85
|
+
)
|
86
|
+
end
|
87
|
+
|
88
|
+
def source_fragment(path, line)
|
89
|
+
return unless Rails.respond_to?(:root) && Rails.root
|
90
|
+
|
91
|
+
full_path = Rails.root.join(path)
|
92
|
+
if File.exist?(full_path)
|
93
|
+
File.open(full_path, "r") do |file|
|
94
|
+
start = [line - 3, 0].max
|
95
|
+
lines = file.each_line.drop(start).take(6)
|
96
|
+
Hash[*(start+1..(lines.count+start)).zip(lines).flatten]
|
97
|
+
end
|
45
98
|
end
|
46
99
|
end
|
47
100
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#Heavy influenced by ActionDispatch::DebugExceptions
|
2
|
+
|
3
|
+
module Rack::Reqorder::Models
|
4
|
+
class AppException
|
5
|
+
include ::Mongoid::Document
|
6
|
+
include ::Kaminari::MongoidExtension::Document
|
7
|
+
|
8
|
+
field :message, type: String
|
9
|
+
field :application_trace, type: Array
|
10
|
+
#field :framework_trace, type: Array
|
11
|
+
field :full_trace, type: Array
|
12
|
+
field :line, type: Integer
|
13
|
+
field :path, type: String
|
14
|
+
field :source_extract, type: Hash
|
15
|
+
field :created_at, type: Time, default: ->{ Time.now }
|
16
|
+
|
17
|
+
belongs_to :http_request
|
18
|
+
end
|
19
|
+
end
|
@@ -1,20 +1,24 @@
|
|
1
1
|
module Rack::Reqorder::Models
|
2
2
|
class HttpRequest
|
3
3
|
include ::Mongoid::Document
|
4
|
+
include ::Kaminari::MongoidExtension::Document
|
4
5
|
|
6
|
+
field :ip, type: String
|
7
|
+
field :url, type: String
|
8
|
+
field :scheme, type: String
|
9
|
+
field :base_url, type: String
|
10
|
+
field :port, type: Integer
|
5
11
|
field :path, type: String
|
6
12
|
field :full_path, type: String
|
13
|
+
field :http_method, type: String
|
7
14
|
field :headers, type: Hash
|
8
|
-
field :
|
9
|
-
field :
|
15
|
+
field :params, type: Hash
|
16
|
+
field :ssl, type: Boolean
|
17
|
+
field :xhr, type: Boolean
|
18
|
+
field :created_at, type: Time, default: ->{ Time.now }
|
10
19
|
|
11
20
|
has_one :http_response
|
12
|
-
|
13
|
-
before_create :set_created_at
|
14
|
-
|
15
|
-
def set_created_at
|
16
|
-
self.created_at = DateTime.now.utc
|
17
|
-
end
|
21
|
+
has_one :app_exception
|
18
22
|
|
19
23
|
end
|
20
24
|
end
|
@@ -1,16 +1,21 @@
|
|
1
1
|
module Rack::Reqorder::Models
|
2
2
|
class HttpResponse
|
3
3
|
include ::Mongoid::Document
|
4
|
+
include ::Kaminari::MongoidExtension::Document
|
4
5
|
|
5
6
|
field :headers, type: Hash
|
6
7
|
field :status, type: Integer
|
7
8
|
#field :body, type: String
|
8
|
-
field :created_at, type:
|
9
|
+
field :created_at, type: Time, default: ->{ Time.now }, pre_processed: true
|
10
|
+
field :response_time, type: Float
|
9
11
|
|
10
|
-
|
12
|
+
belongs_to :http_request
|
11
13
|
|
12
|
-
|
13
|
-
|
14
|
+
before_create :set_response_time
|
15
|
+
|
16
|
+
private
|
17
|
+
def set_response_time
|
18
|
+
self.response_time = self.created_at - self.http_request.created_at
|
14
19
|
end
|
15
20
|
end
|
16
21
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Rack::Reqorder::Monitor
|
2
|
+
module Entities
|
3
|
+
class BaseEntity < Grape::Entity
|
4
|
+
expose :_id, documentation: { type: 'String', desc: 'BSON::ObjectId String' }, :format_with => :to_string, as: :id
|
5
|
+
format_with(:to_string) { |foo| foo.to_s }
|
6
|
+
format_with(:iso_timestamp) { |dt| dt.utc.iso8601 if dt }
|
7
|
+
|
8
|
+
format_with(:association_id) {|a| a.id.to_s if a}
|
9
|
+
end
|
10
|
+
|
11
|
+
class RequestEntity < BaseEntity
|
12
|
+
root :requests, :request
|
13
|
+
|
14
|
+
expose :ip
|
15
|
+
expose :url
|
16
|
+
expose :scheme
|
17
|
+
expose :base_url
|
18
|
+
expose :port
|
19
|
+
expose :path
|
20
|
+
expose :full_path
|
21
|
+
expose :http_method
|
22
|
+
expose :headers
|
23
|
+
expose :params
|
24
|
+
expose :ssl
|
25
|
+
expose :xhr
|
26
|
+
|
27
|
+
with_options(format_with: :iso_timestamp) do
|
28
|
+
expose :created_at
|
29
|
+
end
|
30
|
+
|
31
|
+
with_options(format_with: :association_id) do
|
32
|
+
expose :http_response, as: :response_id
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
class ResponseEntity < BaseEntity
|
38
|
+
root :responses, :response
|
39
|
+
|
40
|
+
expose :headers
|
41
|
+
expose :status
|
42
|
+
expose :response_time
|
43
|
+
|
44
|
+
with_options(format_with: :iso_timestamp) do
|
45
|
+
expose :created_at
|
46
|
+
end
|
47
|
+
|
48
|
+
with_options(format_with: :association_id) do
|
49
|
+
expose :http_request, as: :request_id
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
class ExceptionEntity < BaseEntity
|
55
|
+
root :exceptions, :exception
|
56
|
+
|
57
|
+
expose :message
|
58
|
+
expose :application_trace
|
59
|
+
expose :full_trace
|
60
|
+
expose :line
|
61
|
+
expose :path
|
62
|
+
expose :source_extract
|
63
|
+
|
64
|
+
with_options(format_with: :iso_timestamp) do
|
65
|
+
expose :created_at
|
66
|
+
end
|
67
|
+
|
68
|
+
with_options(format_with: :association_id) do
|
69
|
+
expose :http_request, as: :request_id
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
require 'grape'
|
2
|
+
require 'grape-entity'
|
3
|
+
require 'rack/reqorder/monitor/entities'
|
4
|
+
require 'mongoid_hash_query'
|
5
|
+
require 'pry'
|
6
|
+
|
7
|
+
module Rack::Reqorder
|
8
|
+
module Monitor
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Rack::Reqorder::Monitor
|
13
|
+
class Api < Grape::API
|
14
|
+
include Rack::Reqorder::Models
|
15
|
+
include Rack::Reqorder::Monitor::Entities
|
16
|
+
|
17
|
+
helpers do
|
18
|
+
include MongoidHashQuery
|
19
|
+
end
|
20
|
+
|
21
|
+
version 'v1', using: :path, vendor: 'foobar'
|
22
|
+
format :json
|
23
|
+
prefix :api
|
24
|
+
|
25
|
+
#collection routes
|
26
|
+
resource :requests do
|
27
|
+
get do
|
28
|
+
requests = apply_filters(HttpRequest.all, params)
|
29
|
+
|
30
|
+
meta_aggregations = aggregations(requests, params)
|
31
|
+
|
32
|
+
requests = paginate(requests, params)
|
33
|
+
|
34
|
+
present_with_meta(
|
35
|
+
requests,
|
36
|
+
present(requests, with: RequestEntity),
|
37
|
+
meta_aggregations
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
#element routes
|
42
|
+
route_param :id do
|
43
|
+
get do
|
44
|
+
present(HttpRequest.find(params[:id]), with: RequestEntity)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
#collection routes
|
50
|
+
resource :responses do
|
51
|
+
get do
|
52
|
+
responses = HttpResponse.all
|
53
|
+
|
54
|
+
responses = apply_filters(responses, params)
|
55
|
+
|
56
|
+
meta_aggregations = aggregations(exceptions, params)
|
57
|
+
|
58
|
+
responses = paginate(responses, params)
|
59
|
+
|
60
|
+
present_with_meta(
|
61
|
+
responses,
|
62
|
+
present(responses, with: ResponseEntity),
|
63
|
+
meta_aggregations
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
#element routes
|
68
|
+
route_param :id do
|
69
|
+
get do
|
70
|
+
present(HttpResponse.find(params[:id]), with: ResponseEntity)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
#collection routes
|
76
|
+
resource :exceptions do
|
77
|
+
get do
|
78
|
+
exceptions = AppException.all
|
79
|
+
|
80
|
+
exceptions = apply_filters(exceptions, params)
|
81
|
+
|
82
|
+
meta_aggregations = aggregations(exceptions, params)
|
83
|
+
|
84
|
+
exceptions = paginate(exceptions, params)
|
85
|
+
|
86
|
+
present_with_meta(
|
87
|
+
exceptions,
|
88
|
+
present(exceptions, with: ExceptionEntity),
|
89
|
+
meta_aggregations
|
90
|
+
)
|
91
|
+
end
|
92
|
+
|
93
|
+
#element routes
|
94
|
+
route_param :id do
|
95
|
+
get do
|
96
|
+
present(AppException.find(params[:id]), with: ExceptionEntity)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
helpers do
|
102
|
+
def present_with_meta(object, hash, extra_meta)
|
103
|
+
hash[:meta] = {
|
104
|
+
current_page: object.current_page,
|
105
|
+
next_page: object.next_page,
|
106
|
+
prev_page: object.prev_page,
|
107
|
+
total_pages: object.total_pages,
|
108
|
+
total_count: object.total_count
|
109
|
+
}.merge(extra_meta)
|
110
|
+
|
111
|
+
return hash
|
112
|
+
end
|
113
|
+
|
114
|
+
def paginate(object, params)
|
115
|
+
return object.page(params[:page] || 1).per(params[:per_page] || 30)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module Rack::Reqorder
|
2
|
+
class BacktraceCleaner
|
3
|
+
def initialize
|
4
|
+
@filters, @silencers = [], []
|
5
|
+
end
|
6
|
+
|
7
|
+
# Returns the backtrace after all filters and silencers have been run
|
8
|
+
# against it. Filters run first, then silencers.
|
9
|
+
def clean(backtrace, kind = :silent)
|
10
|
+
filtered = filter_backtrace(backtrace)
|
11
|
+
|
12
|
+
case kind
|
13
|
+
when :silent
|
14
|
+
silence(filtered)
|
15
|
+
when :noise
|
16
|
+
noise(filtered)
|
17
|
+
else
|
18
|
+
filtered
|
19
|
+
end
|
20
|
+
end
|
21
|
+
alias :filter :clean
|
22
|
+
|
23
|
+
# Adds a filter from the block provided. Each line in the backtrace will be
|
24
|
+
# mapped against this filter.
|
25
|
+
#
|
26
|
+
# # Will turn "/my/rails/root/app/models/person.rb" into "/app/models/person.rb"
|
27
|
+
# backtrace_cleaner.add_filter { |line| line.gsub(Rails.root, '') }
|
28
|
+
def add_filter(&block)
|
29
|
+
@filters << block
|
30
|
+
end
|
31
|
+
|
32
|
+
# Adds a silencer from the block provided. If the silencer returns +true+
|
33
|
+
# for a given line, it will be excluded from the clean backtrace.
|
34
|
+
#
|
35
|
+
# # Will reject all lines that include the word "mongrel", like "/gems/mongrel/server.rb" or "/app/my_mongrel_server/rb"
|
36
|
+
# backtrace_cleaner.add_silencer { |line| line =~ /mongrel/ }
|
37
|
+
def add_silencer(&block)
|
38
|
+
@silencers << block
|
39
|
+
end
|
40
|
+
|
41
|
+
# Removes all silencers, but leaves in the filters. Useful if your
|
42
|
+
# context of debugging suddenly expands as you suspect a bug in one of
|
43
|
+
# the libraries you use.
|
44
|
+
def remove_silencers!
|
45
|
+
@silencers = []
|
46
|
+
end
|
47
|
+
|
48
|
+
# Removes all filters, but leaves in the silencers. Useful if you suddenly
|
49
|
+
# need to see entire filepaths in the backtrace that you had already
|
50
|
+
# filtered out.
|
51
|
+
def remove_filters!
|
52
|
+
@filters = []
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def filter_backtrace(backtrace)
|
57
|
+
@filters.each do |f|
|
58
|
+
backtrace = backtrace.map { |line| f.call(line) }
|
59
|
+
end
|
60
|
+
|
61
|
+
backtrace
|
62
|
+
end
|
63
|
+
|
64
|
+
def silence(backtrace)
|
65
|
+
@silencers.each do |s|
|
66
|
+
backtrace = backtrace.reject { |line| s.call(line) }
|
67
|
+
end
|
68
|
+
|
69
|
+
backtrace
|
70
|
+
end
|
71
|
+
|
72
|
+
def noise(backtrace)
|
73
|
+
backtrace - silence(backtrace)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/lib/rack/reqorder.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'rack/reqorder/version'
|
2
2
|
require 'active_support/inflector'
|
3
3
|
require 'mongoid'
|
4
|
+
require 'kaminari'
|
5
|
+
require 'kaminari/models/mongoid_extension'
|
4
6
|
|
5
7
|
module Rack
|
6
8
|
module Reqorder
|
@@ -39,6 +41,20 @@ module Rack
|
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
44
|
+
Kaminari.configure do |config|
|
45
|
+
# config.default_per_page = 25
|
46
|
+
# config.max_per_page = nil
|
47
|
+
# config.window = 4
|
48
|
+
# config.outer_window = 0
|
49
|
+
# config.left = 0
|
50
|
+
# config.right = 0
|
51
|
+
# config.page_method_name = :page
|
52
|
+
# config.param_name = :page
|
53
|
+
end
|
54
|
+
|
42
55
|
require 'rack/reqorder/models/http_request'
|
43
56
|
require 'rack/reqorder/models/http_response'
|
57
|
+
require 'rack/reqorder/models/app_exception'
|
58
|
+
require 'rack/reqorder/services/backtrace_cleaner'
|
44
59
|
require 'rack/reqorder/logger'
|
60
|
+
require 'rack/reqorder/monitor'
|
data/rack-reqorder.gemspec
CHANGED
@@ -22,4 +22,7 @@ Gem::Specification.new do |spec|
|
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_dependency "mongoid", "~> 4.0.0"
|
24
24
|
spec.add_dependency "activesupport", "~> 4.1.6"
|
25
|
+
spec.add_dependency "grape"
|
26
|
+
spec.add_dependency "grape-entity"
|
27
|
+
spec.add_dependency "kaminari"
|
25
28
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-reqorder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Filippos Vasilakis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -66,6 +66,48 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 4.1.6
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: grape
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: grape-entity
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: kaminari
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
69
111
|
description: Request recorder and analyzer for rack apps
|
70
112
|
email:
|
71
113
|
- vasilakisfil@gmail.com
|
@@ -84,10 +126,14 @@ files:
|
|
84
126
|
- bin/console
|
85
127
|
- bin/setup
|
86
128
|
- lib/rack/reqorder.rb
|
129
|
+
- lib/rack/reqorder/config.ru
|
87
130
|
- lib/rack/reqorder/logger.rb
|
131
|
+
- lib/rack/reqorder/models/app_exception.rb
|
88
132
|
- lib/rack/reqorder/models/http_request.rb
|
89
133
|
- lib/rack/reqorder/models/http_response.rb
|
90
|
-
- lib/rack/reqorder/
|
134
|
+
- lib/rack/reqorder/monitor.rb
|
135
|
+
- lib/rack/reqorder/monitor/entities.rb
|
136
|
+
- lib/rack/reqorder/services/backtrace_cleaner.rb
|
91
137
|
- lib/rack/reqorder/version.rb
|
92
138
|
- rack-reqorder.gemspec
|
93
139
|
homepage: ''
|
@@ -110,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
110
156
|
version: '0'
|
111
157
|
requirements: []
|
112
158
|
rubyforge_project:
|
113
|
-
rubygems_version: 2.4.
|
159
|
+
rubygems_version: 2.4.8
|
114
160
|
signing_key:
|
115
161
|
specification_version: 4
|
116
162
|
summary: Request recorder and analyzer for rack apps
|