request_recorder 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|