request_recorder 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Appraisals +1 -2
- data/Gemfile +2 -1
- data/Gemfile.lock +3 -2
- data/Readme.md +2 -0
- data/gemfiles/rails2.gemfile.lock +1 -1
- data/gemfiles/rails3.gemfile +2 -2
- data/gemfiles/rails3.gemfile.lock +2 -2
- data/lib/request_recorder/middleware.rb +33 -1
- data/lib/request_recorder/repeater.rb +1 -1
- data/lib/request_recorder/version.rb +1 -1
- data/spec/request_recorder/middleware_spec.rb +21 -0
- data/spec/request_recorder_spec.rb +21 -3
- metadata +5 -4
data/Appraisals
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
request_recorder (0.2.
|
4
|
+
request_recorder (0.2.3)
|
5
5
|
activerecord
|
6
6
|
multi_json
|
7
7
|
rack
|
@@ -50,11 +50,12 @@ PLATFORMS
|
|
50
50
|
ruby
|
51
51
|
|
52
52
|
DEPENDENCIES
|
53
|
-
activerecord
|
53
|
+
activerecord (>= 3)
|
54
54
|
appraisal
|
55
55
|
bump
|
56
56
|
fakeredis
|
57
57
|
json
|
58
|
+
rack (>= 1.5.2)
|
58
59
|
rake
|
59
60
|
request_recorder!
|
60
61
|
rspec (~> 2)
|
data/Readme.md
CHANGED
@@ -13,6 +13,8 @@ Add to your middleware stack:
|
|
13
13
|
use RequestRecorder::Middleware,
|
14
14
|
:store => RequestRecorder::CacheLogger.new(Rails.cache),
|
15
15
|
:frontend_auth => lambda { |env| Rails.env.development? } # TODO use something like `env.warden.user.is_admin?` in production
|
16
|
+
# if you get 502's because of too large headers, you can reduce them: everything in :remove will be removed when above :max
|
17
|
+
# :header => {:max => 10_000, :remove => [/SELECT count(\*)/, /SELECT \* FROM/, /Cache local read/, /Cache read/, /Identity Map/] }
|
16
18
|
|
17
19
|
Usage
|
18
20
|
=====
|
data/gemfiles/rails3.gemfile
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/mgrosser/code/tools/request_recorder
|
3
3
|
specs:
|
4
|
-
request_recorder (0.2.
|
4
|
+
request_recorder (0.2.2)
|
5
5
|
activerecord
|
6
6
|
multi_json
|
7
7
|
rack
|
@@ -50,7 +50,7 @@ PLATFORMS
|
|
50
50
|
ruby
|
51
51
|
|
52
52
|
DEPENDENCIES
|
53
|
-
activerecord (
|
53
|
+
activerecord (>= 3)
|
54
54
|
appraisal
|
55
55
|
bump
|
56
56
|
fakeredis
|
@@ -21,6 +21,7 @@ module RequestRecorder
|
|
21
21
|
@app = app
|
22
22
|
@store = options.fetch(:store)
|
23
23
|
@auth = options[AUTH]
|
24
|
+
@headers = options[:headers] || {}
|
24
25
|
end
|
25
26
|
|
26
27
|
def call(env)
|
@@ -95,10 +96,14 @@ module RequestRecorder
|
|
95
96
|
end
|
96
97
|
|
97
98
|
def chrome_logger_headers(log)
|
99
|
+
log = log.split("\n").map { |line| remove_console_colors(line) }
|
100
|
+
log = reduce_header_size(log) if @headers
|
101
|
+
|
102
|
+
|
98
103
|
# fake chrome-logger format
|
99
104
|
rows = []
|
100
105
|
rows << [["Rails log"],"xxx.rb:1","group"]
|
101
|
-
rows.concat log.
|
106
|
+
rows.concat log.map{|line| [line.split(" "), "xxx.rb:1", ""] }
|
102
107
|
rows << [[], "xxx.rb:1", "groupEnd"]
|
103
108
|
|
104
109
|
data = {
|
@@ -115,6 +120,33 @@ module RequestRecorder
|
|
115
120
|
{"X-ChromeLogger-Data" => data}
|
116
121
|
end
|
117
122
|
|
123
|
+
def reduce_header_size(array)
|
124
|
+
size = @headers.fetch(:max)
|
125
|
+
return array if array.sum(&:size) <= size
|
126
|
+
|
127
|
+
size -= 20 # make room for removed message
|
128
|
+
removed_count = 0
|
129
|
+
removed_match = []
|
130
|
+
|
131
|
+
while array.sum(&:size) > size
|
132
|
+
if remove = (@headers[:remove] || []).pop
|
133
|
+
removed_match << remove
|
134
|
+
array.reject! { |line| line =~ remove }
|
135
|
+
else
|
136
|
+
removed_count += 1
|
137
|
+
array.shift
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
# tell user what was removed
|
142
|
+
message = []
|
143
|
+
message << "all #{removed_match.map(&:inspect).join(", ")}" if removed_match.any?
|
144
|
+
message << "#{removed_count} lines" if removed_count > 0
|
145
|
+
array << "Removed: #{message.join(", ")}"
|
146
|
+
|
147
|
+
array
|
148
|
+
end
|
149
|
+
|
118
150
|
def remove_console_colors(string)
|
119
151
|
string.gsub(/\e\[[\d;]+m/, "")
|
120
152
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe RequestRecorder::Middleware do
|
4
|
+
describe "#reduce_header_size" do
|
5
|
+
let(:middleware) { RequestRecorder::Middleware.new(nil, :store => {}, :headers => {:max => 100, :remove => [/b/]}) }
|
6
|
+
|
7
|
+
it "does not touch small" do
|
8
|
+
middleware.send(:reduce_header_size, ["a"*40, "b"*40]).should == ["a"*40, "b"*40]
|
9
|
+
end
|
10
|
+
|
11
|
+
it "removes from the front and notifies of removal" do
|
12
|
+
middleware.send(:reduce_header_size, ["a"*60, "c"*60]).should == ["c"*60, "Removed: all /b/, 1 lines"]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "removes :header :remove when above max before other things" do
|
16
|
+
middleware.send(:reduce_header_size, ["a" * 40,"b"*40,"c" * 40]).should == [
|
17
|
+
"a" * 40, "c" * 40, "Removed: all /b/"
|
18
|
+
]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -7,6 +7,9 @@ describe RequestRecorder do
|
|
7
7
|
let(:activate_logger){ {"QUERY_STRING" => "request_recorder=10"} }
|
8
8
|
let(:inner_app){ lambda{|env|
|
9
9
|
Car.first
|
10
|
+
|
11
|
+
(env["log"] || []).each { |line| ActiveRecord::Base.logger.info(line) }
|
12
|
+
|
10
13
|
if env["raise"]
|
11
14
|
# rails also logs errors
|
12
15
|
ActiveRecord::Base.logger.error(env["raise"])
|
@@ -136,7 +139,8 @@ describe RequestRecorder do
|
|
136
139
|
RequestRecorder::Middleware.new(
|
137
140
|
inner_app,
|
138
141
|
:store => store,
|
139
|
-
:frontend_auth => lambda{|env| env["success"] }
|
142
|
+
:frontend_auth => lambda{|env| env["success"] },
|
143
|
+
:headers => {:max => 1000}
|
140
144
|
)
|
141
145
|
}
|
142
146
|
|
@@ -163,17 +167,21 @@ describe RequestRecorder do
|
|
163
167
|
end
|
164
168
|
|
165
169
|
it "warns about unconfigured :frontend_auth" do
|
166
|
-
middleware = RequestRecorder::Middleware.new(inner_app, :store => store)
|
170
|
+
middleware = RequestRecorder::Middleware.new(inner_app, :store => store, :max_header_size => 1000)
|
167
171
|
status, headers, body = middleware.call("PATH_INFO" => "/request_recorder/xxx")
|
168
172
|
status.should == 500
|
169
173
|
body.should include(":frontend_auth")
|
170
174
|
end
|
171
175
|
|
172
176
|
context "chrome logger" do
|
177
|
+
def decode(headers)
|
178
|
+
MultiJson.load(Base64.decode64(headers["X-ChromeLogger-Data"]))
|
179
|
+
end
|
180
|
+
|
173
181
|
it "logs into chrome logger" do
|
174
182
|
status, headers, body = middleware.call("QUERY_STRING" => "request_recorder=10-xxx", "success" => true)
|
175
183
|
headers["X-ChromeLogger-Data"].should_not == nil
|
176
|
-
data =
|
184
|
+
data = decode(headers)
|
177
185
|
data["rows"][1][0][2..-1] = "---" # remove timing information + activerecord 2/3 diff
|
178
186
|
data.should == {
|
179
187
|
"version"=>"0.1.1",
|
@@ -186,6 +194,16 @@ describe RequestRecorder do
|
|
186
194
|
}
|
187
195
|
end
|
188
196
|
|
197
|
+
it "removes header length above max" do
|
198
|
+
status, headers, body = middleware.call(
|
199
|
+
"QUERY_STRING" => "request_recorder=10-xxx",
|
200
|
+
"success" => true,
|
201
|
+
"log" => Array.new(20).fill(("a" * 100))
|
202
|
+
)
|
203
|
+
headers["X-ChromeLogger-Data"].size.should be_within(200).of(1700)
|
204
|
+
decode(headers)["rows"].inspect.should include '"Removed:", "12", "lines"' # tells users that something was removed
|
205
|
+
end
|
206
|
+
|
189
207
|
it "does not log without frontend_auth" do
|
190
208
|
status, headers, body = middleware.call("QUERY_STRING" => "request_recorder=10-xxx")
|
191
209
|
headers["X-ChromeLogger-Data"].should == nil
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: request_recorder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- request_recorder.gemspec
|
86
86
|
- spec/request_recorder/cache_logger_spec.rb
|
87
87
|
- spec/request_recorder/frontend_spec.rb
|
88
|
+
- spec/request_recorder/middleware_spec.rb
|
88
89
|
- spec/request_recorder/redis_logger_spec.rb
|
89
90
|
- spec/request_recorder_spec.rb
|
90
91
|
- spec/spec_helper.rb
|
@@ -103,7 +104,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
103
104
|
version: '0'
|
104
105
|
segments:
|
105
106
|
- 0
|
106
|
-
hash:
|
107
|
+
hash: 542393427719907215
|
107
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
109
|
none: false
|
109
110
|
requirements:
|
@@ -112,7 +113,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
112
113
|
version: '0'
|
113
114
|
segments:
|
114
115
|
- 0
|
115
|
-
hash:
|
116
|
+
hash: 542393427719907215
|
116
117
|
requirements: []
|
117
118
|
rubyforge_project:
|
118
119
|
rubygems_version: 1.8.25
|