rorvswild 0.3.5 → 0.4.0

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