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 +4 -4
- data/lib/rorvswild/version.rb +1 -1
- data/lib/rorvswild.rb +46 -17
- data/rorvswild.gemspec +3 -3
- data/test/ror_vs_wild_test.rb +8 -0
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3543194c8dc3ff5474934185936a3e514d347416
|
4
|
+
data.tar.gz: ef3d398dc36f503b8adaacacd24a0396c187eac6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: adc6cf77472d1657f151c4287dba352ceaf5675de5cde8d6d7a9c2801ef4d99967955601b43acf32684f07476f9992117a4ac13d7102ddd02595ba015bf8ce15
|
7
|
+
data.tar.gz: 5b6c56513e62c187b9871381eba3bde99c9ff71c6c3ab593406c96f434ca33fd85eeb00437af213c6eee4b05dc7fc3c671428cfc7fb14930f99ae6c7d5400823
|
data/lib/rorvswild/version.rb
CHANGED
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, :
|
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 ||
|
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
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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["
|
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 = "
|
12
|
-
spec.description = "
|
13
|
-
spec.homepage = "
|
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")
|
data/test/ror_vs_wild_test.rb
CHANGED
@@ -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.
|
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:
|
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:
|
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:
|
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.
|
64
|
+
rubygems_version: 2.5.1
|
65
65
|
signing_key:
|
66
66
|
specification_version: 4
|
67
|
-
summary:
|
67
|
+
summary: Ruby on Rails app monitoring
|
68
68
|
test_files:
|
69
69
|
- test/ror_vs_wild_test.rb
|
70
|
+
has_rdoc:
|