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 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