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