rack-reqorder 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d32d460562301fbe8a9891e17ec80ca6e77f35f2
4
- data.tar.gz: 052269bec34d67bcf99b03cdb8856fc2c8c40412
3
+ metadata.gz: 980b4a8e4de9b3696b27754a43753a7ee813b0e2
4
+ data.tar.gz: fcbfdaa4bf6ed3fb96923dd41b610642231275a7
5
5
  SHA512:
6
- metadata.gz: 65255514d36099c7935d2043bdb2f518fcac3a0cc2f6d1ec6e08747220d58c152174119c58f7bd8d858e0359d8ccf012ebdc88e911e5499abdbacd1c7fa8898d
7
- data.tar.gz: 2ddbddc83cbda7f5a7c2de83e092c30dff99e2f7cd77d64bce9248a6878e37160c9ffdecde52ef59377c64d5f7cc4431906125a8b13b39320f96e39c04b4f3d9
6
+ metadata.gz: 0ba82134c8dfec0aaf62df4df6e2b3562db24624cf4f1e1a27c0d5c6dac7b7351aa824b5678b57f6f207df2deaeb8b924a754c8f730e88f81c7322a0cc165ad3
7
+ data.tar.gz: 64e885c60ed26a5951bf50102034a4c73701a104f6da0e80525900bd8e38192ee76def5fd0163b2b13213c39d591088d205ec88952542708f8f6e788e239a7b4
data/README.md CHANGED
@@ -1,6 +1,14 @@
1
1
  # Rack::Reqorder
2
2
 
3
- Simple gem that records requests and responses. Uses MongoDB.
3
+ Simple gem for monitoring Rack apps. Uses MongoDB. It can be used in combination
4
+ with [rack-reqorder-monitor](https://github.com/kollegorna/rack-reqorder-monitor).
5
+
6
+ ## Introduction
7
+ Simple gem that sits on top of Rack and records request/response statistics
8
+ as well as monitors for exceptions. It saves everything in MongoDB and exposes
9
+ a simple API for retrieving these data.
10
+
11
+ The API is very robust, built with the help of [mongoid_hash_query](https://github.com/kollegorna/mongoid_hash_query).
4
12
 
5
13
  ## Installation
6
14
 
@@ -30,8 +38,18 @@ end
30
38
 
31
39
  Rack::Reqorder.boot!
32
40
 
33
- Rails.application.config.middleware.insert(0, Rack::Reqorder::Logger)
41
+ Rails.application.config.middleware.insert_after(ActionDispatch::DebugExceptions , Rack::Reqorder::Logger)
42
+
43
+ #rack-cors also needed
44
+ Rails.application.config.middleware.insert_before 0, "Rack::Cors" do
45
+ allow do
46
+ origins '*'
47
+ resource '*', :headers => :any, :methods => [:get, :post, :options]
48
+ end
49
+ end
34
50
  ```
51
+ Please note that you can configure origins and resource depending on how you
52
+ mount the rack-monitor engine and where you deploy your front-end.
35
53
 
36
54
  ## Development
37
55
 
data/Rakefile CHANGED
@@ -1,12 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
  require 'rack/reqorder/api/api'
3
3
 
4
- namespace :grape do
5
- desc 'Print compiled grape routes'
6
- task :routes do
7
- Rack::Reqorder::Api.routes.each do |route|
8
- puts route
9
- end
10
- end
11
- end
4
+ Dir.glob('lib/tasks/*.rake').each {|r| import r}
5
+
12
6
 
@@ -24,6 +24,22 @@ module Rack
24
24
  )
25
25
  end
26
26
 
27
+ def self.paths
28
+ return @paths unless @paths.blank?
29
+ @paths = {}
30
+ Rails.application.routes.routes.routes.each do |route|
31
+ @paths[route.defaults] = route.path.spec.left.to_s
32
+ end
33
+
34
+ return @paths
35
+ end
36
+
37
+ def self.recognise_path(path_uri, options = {})
38
+ res = Rack::Reqorder.paths[Rails.application.routes.recognize_path(path_uri, options)
39
+ .select{|key, value| [:action, :controller].include?(key)}
40
+ ]
41
+ end
42
+
27
43
  class Configuration
28
44
  attr_accessor :mongoid_yml, :environment
29
45
 
@@ -52,9 +68,14 @@ Kaminari.configure do |config|
52
68
  # config.param_name = :page
53
69
  end
54
70
 
71
+ require 'rack/reqorder/models/statistic'
55
72
  require 'rack/reqorder/models/http_request'
73
+ require 'rack/reqorder/models/route_path'
56
74
  require 'rack/reqorder/models/http_response'
75
+ require 'rack/reqorder/models/app_fault'
57
76
  require 'rack/reqorder/models/app_exception'
58
77
  require 'rack/reqorder/services/backtrace_cleaner'
59
78
  require 'rack/reqorder/logger'
60
79
  require 'rack/reqorder/monitor'
80
+
81
+ load 'rack/reqorder/tasks/routes.rake'
@@ -7,16 +7,23 @@ module Rack::Reqorder
7
7
  end
8
8
 
9
9
  def call(environment)
10
- http_request = save_http_request(environment)
10
+ #http_request = save_http_request(environment)
11
11
 
12
+ start = Time.now.to_f
12
13
  begin
13
14
  status, headers, body = @app.call(environment)
14
15
  rescue => exception
15
- log_exception(exception, http_request)
16
+ log_exception(exception, environment)
16
17
  raise exception
17
18
  end
19
+ response_time = Time.now.to_f - start
18
20
 
19
- save_http_response(body, status, headers, http_request)
21
+ #save_http_response(body, status, headers, http_request)
22
+ save_statistics(
23
+ rack_request: Rack::Request.new(environment),
24
+ rack_response: Rack::Response.new(body, status, headers),
25
+ response_time: response_time
26
+ )
20
27
 
21
28
  return [status, headers, body]
22
29
  end
@@ -35,10 +42,48 @@ module Rack::Reqorder
35
42
  ]
36
43
  end
37
44
 
45
+ def save_statistics(rack_request:, rack_response:, response_time:)
46
+ route_path = RoutePath.find_or_create_by({
47
+ route: Rack::Reqorder.recognise_path(rack_request.path),
48
+ http_method: rack_request.request_method
49
+ })
50
+
51
+ [:all.to_s, DateTime.now.hour.to_s].each do |key|
52
+ statistic = route_path.send("statistic_#{key}".to_sym)
53
+
54
+ if statistic.nil?
55
+ statistic = route_path.send("create_statistic_#{key}")
56
+ end
57
+
58
+ statistic.inc({
59
+ statuses_2xx: (rack_response.status < 300 && rack_response.status >= 200)? 1: 0,
60
+ statuses_3xx: (rack_response.status < 400 && rack_response.status >= 300)? 1: 0,
61
+ statuses_4xx: (rack_response.status < 500 && rack_response.status >= 400)? 1: 0,
62
+ statuses_401: (rack_response.status == 401) ? 1 : 0,
63
+ statuses_404: (rack_response.status == 404) ? 1 : 0,
64
+ statuses_422: (rack_response.status == 422) ? 1 : 0,
65
+ statuses_5xx: (rack_response.status < 600 && rack_response.status >= 500)? 1: 0,
66
+ http_requests_count: 1,
67
+ xhr_count: rack_request.xhr? ? 1 : 0,
68
+ ssl_count: rack_request.ssl? ? 1 : 0,
69
+ })
70
+
71
+ statistic.recalculate_average!(response_time)
72
+
73
+ route_path.save!
74
+ route_path.send("statistic_#{key}".to_sym).save!
75
+ end
76
+ end
77
+
38
78
  def save_http_request(environment)
39
79
  request = Rack::Request.new(environment)
40
80
 
41
- return HttpRequest.create(
81
+ route_path = RoutePath.find_or_create_by({
82
+ route: Rack::Reqorder.recognise_path(request.path),
83
+ http_method: request.request_method
84
+ })
85
+
86
+ HttpRequest.create({
42
87
  ip: request.ip,
43
88
  url: request.url,
44
89
  scheme: request.scheme,
@@ -50,8 +95,9 @@ module Rack::Reqorder
50
95
  headers: extract_all_headers(request),
51
96
  params: request.params,
52
97
  ssl: request.ssl?,
53
- xhr: request.xhr?
54
- )
98
+ xhr: request.xhr?,
99
+ route_path: route_path
100
+ })
55
101
  end
56
102
 
57
103
  def save_http_response(body, status, headers, http_request)
@@ -65,22 +111,44 @@ module Rack::Reqorder
65
111
  )
66
112
  end
67
113
 
68
- def log_exception(exception, http_request)
114
+ def log_exception(exception, environment)
115
+ http_request = save_http_request(environment)
116
+
69
117
  bc = BacktraceCleaner.new
70
118
  bc.add_filter { |line| line.gsub(Rails.root.to_s, '') }
71
119
  bc.add_silencer { |line| line =~ /gems/ }
72
120
 
73
121
  application_trace = bc.clean(exception.backtrace)
74
122
 
75
- path, line, _ = application_trace.first.split(':')
123
+ path = line = nil
124
+
125
+ if not application_trace.blank?
126
+ path, line, _ = application_trace.first.split(':')
127
+ else
128
+ path, line, _ = exception.backtrace.first.split(':')
129
+ end
130
+
131
+
132
+ app_fault = AppFault.find_or_create_by(
133
+ e_class: exception.class,
134
+ line: line.to_i,
135
+ filepath: path[1..-1]
136
+ )
76
137
 
77
138
  AppException.create(
139
+ e_class: exception.class,
78
140
  message: exception.message,
79
141
  application_trace: application_trace,
80
142
  full_trace: exception.backtrace,
81
143
  line: line.to_i,
82
- path: path[1..-1],
144
+ filepath: path[1..-1],
83
145
  source_extract: source_fragment(path[1..-1], line.to_i),
146
+ app_fault: app_fault,
147
+ http_request: http_request
148
+ )
149
+
150
+ HttpResponse.create(
151
+ status: 500,
84
152
  http_request: http_request
85
153
  )
86
154
  end
@@ -4,16 +4,25 @@ module Rack::Reqorder::Models
4
4
  class AppException
5
5
  include ::Mongoid::Document
6
6
  include ::Kaminari::MongoidExtension::Document
7
+ include ::Mongoid::Timestamps
7
8
 
9
+ field :e_class, type: String
8
10
  field :message, type: String
9
11
  field :application_trace, type: Array
10
12
  #field :framework_trace, type: Array
11
13
  field :full_trace, type: Array
12
14
  field :line, type: Integer
13
- field :path, type: String
15
+ field :filepath, type: String
14
16
  field :source_extract, type: Hash
15
- field :created_at, type: Time, default: ->{ Time.now }
16
17
 
17
- belongs_to :http_request
18
+ belongs_to :http_request, dependent: :nullify
19
+ belongs_to :app_fault, dependent: :nullify
20
+
21
+ after_save :update_count
22
+
23
+ private
24
+ def update_count
25
+ self.app_fault.update_count!
26
+ end
18
27
  end
19
28
  end
@@ -0,0 +1,20 @@
1
+ module Rack::Reqorder::Models
2
+ class AppFault
3
+ include ::Mongoid::Document
4
+ include ::Kaminari::MongoidExtension::Document
5
+ include ::Mongoid::Timestamps
6
+
7
+ field :e_class, type: String
8
+ field :line, type: Integer
9
+ field :filepath, type: String
10
+
11
+ field :app_exceptions_count, type: Integer, default: 0
12
+
13
+ has_many :app_exceptions, dependent: :destroy
14
+
15
+ def update_count!
16
+ self.app_exceptions_count = self.app_exceptions.count
17
+ self.save!
18
+ end
19
+ end
20
+ end
@@ -2,6 +2,7 @@ module Rack::Reqorder::Models
2
2
  class HttpRequest
3
3
  include ::Mongoid::Document
4
4
  include ::Kaminari::MongoidExtension::Document
5
+ include ::Mongoid::Timestamps
5
6
 
6
7
  field :ip, type: String
7
8
  field :url, type: String
@@ -13,12 +14,20 @@ module Rack::Reqorder::Models
13
14
  field :http_method, type: String
14
15
  field :headers, type: Hash
15
16
  field :params, type: Hash
17
+ field :param_keys, type: Array
16
18
  field :ssl, type: Boolean
17
19
  field :xhr, type: Boolean
18
- field :created_at, type: Time, default: ->{ Time.now }
20
+ field :response_time, type: Float
19
21
 
20
- has_one :http_response
21
- has_one :app_exception
22
+ has_one :http_response, dependent: :destroy
23
+ has_one :app_exception, dependent: :destroy
22
24
 
25
+ belongs_to :route_path, dependent: :nullify
26
+
27
+ before_create :add_param_keys
28
+ private
29
+ def add_param_keys
30
+ self.param_keys = self.params.keys
31
+ end
23
32
  end
24
33
  end
@@ -2,20 +2,26 @@ module Rack::Reqorder::Models
2
2
  class HttpResponse
3
3
  include ::Mongoid::Document
4
4
  include ::Kaminari::MongoidExtension::Document
5
+ include ::Mongoid::Timestamps
5
6
 
6
7
  field :headers, type: Hash
7
8
  field :status, type: Integer
8
9
  #field :body, type: String
9
- field :created_at, type: Time, default: ->{ Time.now }, pre_processed: true
10
10
  field :response_time, type: Float
11
11
 
12
- belongs_to :http_request
12
+ belongs_to :http_request, dependent: :nullify
13
13
 
14
14
  before_create :set_response_time
15
+ after_create :set_response_time_to_request
15
16
 
16
17
  private
17
18
  def set_response_time
18
19
  self.response_time = self.created_at - self.http_request.created_at
19
20
  end
21
+
22
+ def set_response_time_to_request
23
+ self.http_request.response_time = self.response_time
24
+ self.http_request.save!
25
+ end
20
26
  end
21
27
  end
@@ -0,0 +1,40 @@
1
+ module Rack::Reqorder::Models
2
+ class RoutePath
3
+ include ::Mongoid::Document
4
+ include ::Kaminari::MongoidExtension::Document
5
+ include ::Mongoid::Timestamps
6
+
7
+ field :route, type: String
8
+ field :http_method, type: String
9
+
10
+ has_many :http_requests, dependent: :destroy
11
+
12
+ embeds_one :statistic_0, class_name: 'Rack::Reqorder::Models::Statistic'
13
+ embeds_one :statistic_1, class_name: 'Rack::Reqorder::Models::Statistic'
14
+ embeds_one :statistic_2, class_name: 'Rack::Reqorder::Models::Statistic'
15
+ embeds_one :statistic_3, class_name: 'Rack::Reqorder::Models::Statistic'
16
+ embeds_one :statistic_4, class_name: 'Rack::Reqorder::Models::Statistic'
17
+ embeds_one :statistic_5, class_name: 'Rack::Reqorder::Models::Statistic'
18
+ embeds_one :statistic_6, class_name: 'Rack::Reqorder::Models::Statistic'
19
+ embeds_one :statistic_7, class_name: 'Rack::Reqorder::Models::Statistic'
20
+ embeds_one :statistic_8, class_name: 'Rack::Reqorder::Models::Statistic'
21
+ embeds_one :statistic_9, class_name: 'Rack::Reqorder::Models::Statistic'
22
+ embeds_one :statistic_10, class_name: 'Rack::Reqorder::Models::Statistic'
23
+ embeds_one :statistic_11, class_name: 'Rack::Reqorder::Models::Statistic'
24
+ embeds_one :statistic_12, class_name: 'Rack::Reqorder::Models::Statistic'
25
+ embeds_one :statistic_13, class_name: 'Rack::Reqorder::Models::Statistic'
26
+ embeds_one :statistic_14, class_name: 'Rack::Reqorder::Models::Statistic'
27
+ embeds_one :statistic_15, class_name: 'Rack::Reqorder::Models::Statistic'
28
+ embeds_one :statistic_16, class_name: 'Rack::Reqorder::Models::Statistic'
29
+ embeds_one :statistic_17, class_name: 'Rack::Reqorder::Models::Statistic'
30
+ embeds_one :statistic_18, class_name: 'Rack::Reqorder::Models::Statistic'
31
+ embeds_one :statistic_19, class_name: 'Rack::Reqorder::Models::Statistic'
32
+ embeds_one :statistic_20, class_name: 'Rack::Reqorder::Models::Statistic'
33
+ embeds_one :statistic_21, class_name: 'Rack::Reqorder::Models::Statistic'
34
+ embeds_one :statistic_22, class_name: 'Rack::Reqorder::Models::Statistic'
35
+ embeds_one :statistic_23, class_name: 'Rack::Reqorder::Models::Statistic'
36
+ embeds_one :statistic_24, class_name: 'Rack::Reqorder::Models::Statistic'
37
+
38
+ embeds_one :statistic_all, class_name: 'Rack::Reqorder::Models::Statistic'
39
+ end
40
+ end
@@ -0,0 +1,31 @@
1
+ module Rack::Reqorder::Models
2
+ class Statistic
3
+ include ::Mongoid::Document
4
+ include ::Kaminari::MongoidExtension::Document
5
+ include ::Mongoid::Timestamps
6
+
7
+ field :http_requests_count, type: Integer, default: 0
8
+ #field :sum
9
+ #field :square_sum
10
+ #field :sd_response_time
11
+ field :avg_response_time, type: Float, default: 0
12
+ field :statuses_2xx, type: Integer, default: 0
13
+ field :statuses_3xx, type: Integer, default: 0
14
+ field :statuses_4xx, type: Integer, default: 0
15
+ field :statuses_401, type: Integer, default: 0
16
+ field :statuses_404, type: Integer, default: 0
17
+ field :statuses_422, type: Integer, default: 0
18
+ field :statuses_5xx, type: Integer, default: 0
19
+
20
+ field :xhr_count, type: Integer, default: 0
21
+ field :ssl_count, type: Integer, default: 0
22
+
23
+ embedded_in :route_path
24
+
25
+ def recalculate_average!(response_time)
26
+ self.avg_response_time = (
27
+ response_time + (self.http_requests_count-1)*self.avg_response_time
28
+ )/self.http_requests_count
29
+ end
30
+ end
31
+ end
@@ -22,6 +22,30 @@ module Rack::Reqorder::Monitor
22
22
  format :json
23
23
  prefix :api
24
24
 
25
+ #collection routes
26
+ resource :route_paths do
27
+ get do
28
+ route_paths = apply_filters(RoutePath.all, params)
29
+
30
+ meta_aggregations = aggregations(route_paths, params)
31
+
32
+ route_paths = paginate(route_paths, params)
33
+
34
+ present_with_meta(
35
+ route_paths,
36
+ present(route_paths, with: RoutePathEntity),
37
+ meta_aggregations
38
+ )
39
+ end
40
+
41
+ #element routes
42
+ route_param :id do
43
+ get do
44
+ present(RoutePath.find(params[:id]), with: RoutePathEntity)
45
+ end
46
+ end
47
+ end
48
+
25
49
  #collection routes
26
50
  resource :requests do
27
51
  get do
@@ -53,7 +77,7 @@ module Rack::Reqorder::Monitor
53
77
 
54
78
  responses = apply_filters(responses, params)
55
79
 
56
- meta_aggregations = aggregations(exceptions, params)
80
+ meta_aggregations = aggregations(responses, params)
57
81
 
58
82
  responses = paginate(responses, params)
59
83
 
@@ -72,6 +96,32 @@ module Rack::Reqorder::Monitor
72
96
  end
73
97
  end
74
98
 
99
+ #collection routes
100
+ resource :faults do
101
+ get do
102
+ faults = AppFault.all
103
+
104
+ faults = apply_filters(faults, params)
105
+
106
+ meta_aggregations = aggregations(faults, params)
107
+
108
+ faults = paginate(faults, params)
109
+
110
+ present_with_meta(
111
+ faults,
112
+ present(faults, with: FaultEntity),
113
+ meta_aggregations
114
+ )
115
+ end
116
+
117
+ #element routes
118
+ route_param :id do
119
+ get do
120
+ present(AppFault.find(params[:id]), with: FaultEntity)
121
+ end
122
+ end
123
+ end
124
+
75
125
  #collection routes
76
126
  resource :exceptions do
77
127
  get do
@@ -101,18 +151,21 @@ module Rack::Reqorder::Monitor
101
151
  helpers do
102
152
  def present_with_meta(object, hash, extra_meta)
103
153
  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
154
+ currentPage: object.current_page,
155
+ nextPage: object.next_page,
156
+ prevPage: object.prev_page,
157
+ totalPages: object.total_pages,
158
+ totalCount: object.total_count
109
159
  }.merge(extra_meta)
110
160
 
111
161
  return hash
112
162
  end
113
163
 
114
164
  def paginate(object, params)
115
- return object.page(params[:page] || 1).per(params[:per_page] || 30)
165
+ return object.
166
+ page(params[:page] || 1).
167
+ per(params[:per_page] || 30).
168
+ skip(params[:skip] || 0)
116
169
  end
117
170
  end
118
171
 
@@ -5,7 +5,47 @@ module Rack::Reqorder::Monitor
5
5
  format_with(:to_string) { |foo| foo.to_s }
6
6
  format_with(:iso_timestamp) { |dt| dt.utc.iso8601 if dt }
7
7
 
8
- format_with(:association_id) {|a| a.id.to_s if a}
8
+ format_with(:association_id) {|a| a.id.to_s if a }
9
+ format_with(:association_ids) {|a| a.map{|i| i.to_s if i} if a }
10
+ end
11
+
12
+ class StatisticEntity < BaseEntity
13
+ root :statistics, :statistic
14
+
15
+ expose :http_requests_count
16
+ expose :avg_response_time
17
+ expose :statuses_2xx
18
+ expose :statuses_3xx
19
+ expose :statuses_4xx
20
+ expose :statuses_401
21
+ expose :statuses_404
22
+ expose :statuses_422
23
+ expose :statuses_5xx
24
+
25
+ expose :xhr_count
26
+ expose :ssl_count
27
+
28
+ with_options(format_with: :iso_timestamp) do
29
+ expose :created_at
30
+ expose :updated_at
31
+ end
32
+ end
33
+
34
+ class RoutePathEntity < BaseEntity
35
+ root :route_paths, :route_path
36
+
37
+ expose :route
38
+ expose :http_method
39
+ expose :statistic_all, using: StatisticEntity
40
+
41
+ 1.upto(24) do |num|
42
+ expose "statistic_#{num}", using: StatisticEntity
43
+ end
44
+
45
+ with_options(format_with: :iso_timestamp) do
46
+ expose :created_at
47
+ expose :updated_at
48
+ end
9
49
  end
10
50
 
11
51
  class RequestEntity < BaseEntity
@@ -21,11 +61,14 @@ module Rack::Reqorder::Monitor
21
61
  expose :http_method
22
62
  expose :headers
23
63
  expose :params
64
+ expose :param_keys
24
65
  expose :ssl
25
66
  expose :xhr
67
+ expose :response_time
26
68
 
27
69
  with_options(format_with: :iso_timestamp) do
28
70
  expose :created_at
71
+ expose :updated_at
29
72
  end
30
73
 
31
74
  with_options(format_with: :association_id) do
@@ -43,6 +86,7 @@ module Rack::Reqorder::Monitor
43
86
 
44
87
  with_options(format_with: :iso_timestamp) do
45
88
  expose :created_at
89
+ expose :updated_at
46
90
  end
47
91
 
48
92
  with_options(format_with: :association_id) do
@@ -50,6 +94,26 @@ module Rack::Reqorder::Monitor
50
94
  end
51
95
  end
52
96
 
97
+ class FaultEntity < BaseEntity
98
+ root :faults, :fault
99
+
100
+ expose :e_class
101
+ expose :line
102
+ expose :filepath
103
+ expose :app_exceptions_count, as: :exceptions_count
104
+ expose :message do |fault, options|
105
+ fault.app_exceptions.try(:first).try(:message)
106
+ end
107
+
108
+ expose :app_exception_ids, as: :exception_ids do |fault, options|
109
+ fault.app_exception_ids.map(&:to_s).first(100)
110
+ end
111
+
112
+ with_options(format_with: :iso_timestamp) do
113
+ expose :created_at
114
+ expose :updated_at
115
+ end
116
+ end
53
117
 
54
118
  class ExceptionEntity < BaseEntity
55
119
  root :exceptions, :exception
@@ -58,15 +122,17 @@ module Rack::Reqorder::Monitor
58
122
  expose :application_trace
59
123
  expose :full_trace
60
124
  expose :line
61
- expose :path
125
+ expose :filepath
62
126
  expose :source_extract
63
127
 
64
128
  with_options(format_with: :iso_timestamp) do
65
129
  expose :created_at
130
+ expose :updated_at
66
131
  end
67
132
 
68
133
  with_options(format_with: :association_id) do
69
134
  expose :http_request, as: :request_id
135
+ expose :app_fault, as: :fault_id
70
136
  end
71
137
 
72
138
  end
@@ -0,0 +1,10 @@
1
+ if respond_to?(:namespace, true)
2
+ namespace 'rack-monitor' do
3
+ desc 'rack-monitor API routes'
4
+ task :routes => :environment do
5
+ Rack::Reqorder::Monitor::Api.routes.each do |route|
6
+ puts route
7
+ end
8
+ end
9
+ end
10
+ end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module Reqorder
3
- VERSION = "0.2.0"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -25,4 +25,6 @@ Gem::Specification.new do |spec|
25
25
  spec.add_dependency "grape"
26
26
  spec.add_dependency "grape-entity"
27
27
  spec.add_dependency "kaminari"
28
+ spec.add_dependency "rack-cors"
29
+ spec.add_dependency "mongoid_hash_query", "~> 0.2.4"
28
30
  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.2.0
4
+ version: 0.3.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-06-19 00:00:00.000000000 Z
11
+ date: 2015-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -108,6 +108,34 @@ dependencies:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rack-cors
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: mongoid_hash_query
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.2.4
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.2.4
111
139
  description: Request recorder and analyzer for rack apps
112
140
  email:
113
141
  - vasilakisfil@gmail.com
@@ -129,11 +157,15 @@ files:
129
157
  - lib/rack/reqorder/config.ru
130
158
  - lib/rack/reqorder/logger.rb
131
159
  - lib/rack/reqorder/models/app_exception.rb
160
+ - lib/rack/reqorder/models/app_fault.rb
132
161
  - lib/rack/reqorder/models/http_request.rb
133
162
  - lib/rack/reqorder/models/http_response.rb
163
+ - lib/rack/reqorder/models/route_path.rb
164
+ - lib/rack/reqorder/models/statistic.rb
134
165
  - lib/rack/reqorder/monitor.rb
135
166
  - lib/rack/reqorder/monitor/entities.rb
136
167
  - lib/rack/reqorder/services/backtrace_cleaner.rb
168
+ - lib/rack/reqorder/tasks/routes.rake
137
169
  - lib/rack/reqorder/version.rb
138
170
  - rack-reqorder.gemspec
139
171
  homepage: ''
@@ -156,7 +188,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
188
  version: '0'
157
189
  requirements: []
158
190
  rubyforge_project:
159
- rubygems_version: 2.4.8
191
+ rubygems_version: 2.4.5
160
192
  signing_key:
161
193
  specification_version: 4
162
194
  summary: Request recorder and analyzer for rack apps