rorvswild 0.3.5 → 0.4.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: 8f3058ebf12d59185c06a6e58d0708b768cbbd5e
4
- data.tar.gz: 180c22cf8f25b526509164cd053fad4ddda35376
3
+ metadata.gz: 3543194c8dc3ff5474934185936a3e514d347416
4
+ data.tar.gz: ef3d398dc36f503b8adaacacd24a0396c187eac6
5
5
  SHA512:
6
- metadata.gz: 4c7a6ba4143a8a1c1060a2bbd5b2ebaac29d3f29eb8a44d54aba7e170008903c9ff8b9dae020b2236864ed8fa3a24ce76222aab4c99251929fd1765e001e22d2
7
- data.tar.gz: e4daa2f6ed71388c9a935ea3d6757a426e25e93206c688887f5cb02d90355329e354c47306a62dff887ad3b942fd71cd9b9790bd67bafdbab1a4a3c26448ced1
6
+ metadata.gz: adc6cf77472d1657f151c4287dba352ceaf5675de5cde8d6d7a9c2801ef4d99967955601b43acf32684f07476f9992117a4ac13d7102ddd02595ba015bf8ce15
7
+ data.tar.gz: 5b6c56513e62c187b9871381eba3bde99c9ff71c6c3ab593406c96f434ca33fd85eeb00437af213c6eee4b05dc7fc3c671428cfc7fb14930f99ae6c7d5400823
@@ -1,3 +1,3 @@
1
1
  module RorVsWild
2
- VERSION = "0.3.5".freeze
2
+ VERSION = "0.4.0".freeze
3
3
  end
data/lib/rorvswild.rb CHANGED
@@ -3,6 +3,7 @@ require "json/ext"
3
3
  require "net/http"
4
4
  require "logger"
5
5
  require "uri"
6
+ require "set"
6
7
 
7
8
  module RorVsWild
8
9
  def self.new(*args)
@@ -62,7 +63,9 @@ module RorVsWild
62
63
  }
63
64
  end
64
65
 
65
- attr_reader :api_url, :api_key, :app_id, :explain_sql_threshold, :app_root, :app_root_regex, :ignored_exceptions
66
+ attr_reader :api_url, :api_key, :app_id, :explain_sql_threshold, :app_root, :ignored_exceptions
67
+
68
+ attr_reader :threads, :app_root_regex
66
69
 
67
70
  def initialize(config)
68
71
  config = self.class.default_config.merge(config)
@@ -73,6 +76,7 @@ module RorVsWild
73
76
  @api_key = config[:api_key]
74
77
  @app_id = config[:app_id]
75
78
  @logger = config[:logger]
79
+ @threads = Set.new
76
80
  @data = {}
77
81
 
78
82
  if defined?(Rails)
@@ -101,7 +105,9 @@ module RorVsWild
101
105
  ActionController::Base.rescue_from(StandardError) { |exception| client.after_exception(exception, self) }
102
106
  end
103
107
 
108
+ Kernel.at_exit(&method(:at_exit))
104
109
  Resque::Job.send(:extend, ResquePlugin) if defined?(Resque::Job)
110
+ ActiveJob::Base.around_perform(&method(:around_active_job)) if defined?(ActiveJob::Base)
105
111
  Delayed::Worker.lifecycle.around(:invoke_job, &method(:around_delayed_job)) if defined?(Delayed::Worker)
106
112
  Sidekiq.configure_server { |config| config.server_middleware { |chain| chain.add(SidekiqPlugin) } } if defined?(Sidekiq)
107
113
  end
@@ -120,8 +126,10 @@ module RorVsWild
120
126
  log_error(exception)
121
127
  end
122
128
 
129
+ IGNORED_QUERIES = %w[EXPLAIN SCHEMA].freeze
130
+
123
131
  def after_sql_query(name, start, finish, id, payload)
124
- return if !queries || payload[:name] == "EXPLAIN".freeze || payload[:name] == "SCHEMA".freeze
132
+ return if !queries || IGNORED_QUERIES.include?(payload[:name])
125
133
  file, line, method = extract_most_relevant_location(caller)
126
134
  runtime, sql = compute_duration(start, finish), payload[:sql]
127
135
  plan = runtime >= explain_sql_threshold ? explain(payload[:sql], payload[:binds]) : nil
@@ -152,6 +160,10 @@ module RorVsWild
152
160
  raise exception
153
161
  end
154
162
 
163
+ def around_active_job(job, block)
164
+ measure_block(job.class.name, &block)
165
+ end
166
+
155
167
  def around_delayed_job(job, &block)
156
168
  measure_block(job.name) { block.call(job) }
157
169
  end
@@ -166,18 +178,21 @@ module RorVsWild
166
178
  end
167
179
 
168
180
  def measure_block(name, &block)
181
+ return block.call if job[:name] # Prevent from recursive jobs
169
182
  job[:name] = name
170
183
  job[:queries] = []
171
184
  started_at = Time.now
172
185
  cpu_time_offset = cpu_time
173
- block.call
174
- rescue Exception => exception
175
- job[:error] = exception_to_hash(exception)
176
- raise
177
- ensure
178
- job[:runtime] = (Time.now - started_at) * 1000
179
- job[:cpu_runtime] = (cpu_time - cpu_time_offset) * 1000
180
- post_job
186
+ begin
187
+ block.call
188
+ rescue Exception => exception
189
+ job[:error] = exception_to_hash(exception)
190
+ raise
191
+ ensure
192
+ job[:runtime] = (Time.now - started_at) * 1000
193
+ job[:cpu_runtime] = (cpu_time - cpu_time_offset) * 1000
194
+ post_job
195
+ end
181
196
  end
182
197
 
183
198
  def catch_error(extra_details = nil, &block)
@@ -257,13 +272,14 @@ module RorVsWild
257
272
 
258
273
  def post_request
259
274
  attributes = request.merge(queries: slowest_queries, views: slowest_views)
260
- Thread.new { post("/requests".freeze, request: attributes) }
275
+ post_async("/requests".freeze, request: attributes)
261
276
  ensure
262
277
  cleanup_data
263
278
  end
264
279
 
265
280
  def post_job
266
- post("/jobs".freeze, job: job.merge(queries: slowest_queries))
281
+ attributes = job.merge(queries: slowest_queries)
282
+ post_async("/jobs".freeze, job: attributes)
267
283
  rescue => exception
268
284
  log_error(exception)
269
285
  ensure
@@ -271,7 +287,7 @@ module RorVsWild
271
287
  end
272
288
 
273
289
  def post_error(hash)
274
- post("/errors".freeze, error: hash)
290
+ post_async("/errors".freeze, error: hash)
275
291
  end
276
292
 
277
293
  def gem_home
@@ -346,6 +362,21 @@ module RorVsWild
346
362
  http.request(post)
347
363
  end
348
364
 
365
+ def post_async(path, data)
366
+ Thread.new do
367
+ begin
368
+ threads.add(Thread.current)
369
+ post(path, data)
370
+ ensure
371
+ threads.delete(Thread.current)
372
+ end
373
+ end
374
+ end
375
+
376
+ def at_exit
377
+ threads.each(&:join)
378
+ end
379
+
349
380
  def filter_sensitive_data(hash)
350
381
  @parameter_filter ? @parameter_filter.filter(hash) : hash
351
382
  end
@@ -360,17 +391,15 @@ module RorVsWild
360
391
  end
361
392
  end
362
393
 
363
- DASH_PERFORM = "#perform".freeze
364
-
365
394
  module ResquePlugin
366
395
  def around_perform_rorvswild(*args, &block)
367
- RorVsWild.measure_block(to_s + DASH_PERFORM, &block)
396
+ RorVsWild.measure_block(to_s, &block)
368
397
  end
369
398
  end
370
399
 
371
400
  class SidekiqPlugin
372
401
  def call(worker, item, queue, &block)
373
- RorVsWild.measure_block(item["class".freeze] + DASH_PERFORM, &block)
402
+ RorVsWild.measure_block(item["wrapped".freeze] || item["class".freeze], &block)
374
403
  end
375
404
  end
376
405
  end
data/rorvswild.gemspec CHANGED
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = RorVsWild::VERSION
9
9
  spec.authors = ["Alexis Bernard"]
10
10
  spec.email = ["alexis@bernard.io"]
11
- spec.summary = "All-in-one monitoring for Ruby on Rails applications."
12
- spec.description = "All-in-one monitoring for Ruby on Rails applications."
13
- spec.homepage = "http://www.rorvswild.com"
11
+ spec.summary = "Ruby on Rails app monitoring"
12
+ spec.description = "Performances & quality insights for rails developers."
13
+ spec.homepage = "https://www.rorvswild.com"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0")
@@ -39,6 +39,14 @@ class RorVsWildTest < Minitest::Test
39
39
  assert_equal(2, RorVsWild.measure_block("1+1") { 1+1 })
40
40
  end
41
41
 
42
+ def test_measure_block_recursive
43
+ client.expects(:post_job)
44
+ result = RorVsWild.measure_block("1") do
45
+ RorVsWild.measure_block("2") { 1 } + 1
46
+ end
47
+ assert_equal(2, result)
48
+ end
49
+
42
50
  def test_catch_error
43
51
  client.expects(:post_error)
44
52
  exception = RorVsWild.catch_error { 1 / 0 }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rorvswild
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexis Bernard
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-15 00:00:00.000000000 Z
11
+ date: 2017-01-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -24,7 +24,7 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.6'
27
- description: All-in-one monitoring for Ruby on Rails applications.
27
+ description: Performances & quality insights for rails developers.
28
28
  email:
29
29
  - alexis@bernard.io
30
30
  executables: []
@@ -41,7 +41,7 @@ files:
41
41
  - lib/rorvswild/version.rb
42
42
  - rorvswild.gemspec
43
43
  - test/ror_vs_wild_test.rb
44
- homepage: http://www.rorvswild.com
44
+ homepage: https://www.rorvswild.com
45
45
  licenses:
46
46
  - MIT
47
47
  metadata: {}
@@ -61,9 +61,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
61
61
  version: '0'
62
62
  requirements: []
63
63
  rubyforge_project:
64
- rubygems_version: 2.4.8
64
+ rubygems_version: 2.5.1
65
65
  signing_key:
66
66
  specification_version: 4
67
- summary: All-in-one monitoring for Ruby on Rails applications.
67
+ summary: Ruby on Rails app monitoring
68
68
  test_files:
69
69
  - test/ror_vs_wild_test.rb
70
+ has_rdoc: