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 CHANGED
@@ -4,6 +4,5 @@ appraise "rails2" do
4
4
  end
5
5
 
6
6
  appraise "rails3" do
7
- gem "rack", ">= 1.5.2"
8
- gem "activerecord", "~>3.2.7"
7
+ # see Gemfile
9
8
  end
data/Gemfile CHANGED
@@ -5,7 +5,8 @@ gem "appraisal"
5
5
  gem "bump"
6
6
  gem "rake"
7
7
  gem "rspec", "~>2"
8
- gem "activerecord"
8
+ gem "activerecord", ">= 3"
9
+ gem "rack", ">= 1.5.2"
9
10
  gem "sqlite3"
10
11
  gem "fakeredis"
11
12
  gem "json"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- request_recorder (0.2.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
  =====
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/mgrosser/code/tools/request_recorder
3
3
  specs:
4
- request_recorder (0.2.0)
4
+ request_recorder (0.2.2)
5
5
  activerecord
6
6
  multi_json
7
7
  rack
@@ -6,10 +6,10 @@ gem "appraisal"
6
6
  gem "bump"
7
7
  gem "rake"
8
8
  gem "rspec", "~>2"
9
+ gem "activerecord", ">= 3"
10
+ gem "rack", ">= 1.5.2"
9
11
  gem "sqlite3"
10
12
  gem "fakeredis"
11
13
  gem "json"
12
- gem "rack", ">= 1.5.2"
13
- gem "activerecord", "~>3.2.7"
14
14
 
15
15
  gemspec :path=>"../"
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: /Users/mgrosser/code/tools/request_recorder
3
3
  specs:
4
- request_recorder (0.2.0)
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 (~> 3.2.7)
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.split("\n").map{|line| [remove_console_colors(line).split(" "), "xxx.rb:1", ""] }
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
@@ -15,7 +15,7 @@ module RequestRecorder
15
15
  if t.respond_to?(:add)
16
16
  t.add(*args)
17
17
  else
18
- t.write(args[1])
18
+ t.write("#{args[1]}\n")
19
19
  end
20
20
  end
21
21
  end
@@ -1,3 +1,3 @@
1
1
  module RequestRecorder
2
- VERSION = "0.2.2"
2
+ VERSION = "0.2.3"
3
3
  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 = MultiJson.load(Base64.decode64(headers["X-ChromeLogger-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.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-16 00:00:00.000000000 Z
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: 1774609380025706584
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: 1774609380025706584
116
+ hash: 542393427719907215
116
117
  requirements: []
117
118
  rubyforge_project:
118
119
  rubygems_version: 1.8.25