metrician 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/gemfiles/Gemfile.4.2.sidekiq-4 +4 -1
- data/gemfiles/Gemfile.4.2.sidekiq-4.lock +14 -2
- data/gemfiles/Gemfile.5.0.pg +3 -0
- data/gemfiles/Gemfile.5.0.pg.lock +13 -1
- data/lib/metrician/reporters/honeybadger.rb +2 -0
- data/lib/metrician/reporters/memcache.rb +13 -8
- data/lib/metrician/version.rb +1 -1
- data/metrician.gemspec +1 -0
- data/spec/metrician_spec.rb +88 -4
- data/spec/spec_helper.rb +6 -0
- data/spec/support/test_rails_app.rb +21 -0
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52f0bb06f70b89a43c10dfdbbfa5b989c2dfad48
|
4
|
+
data.tar.gz: 61bc03ef7baf8a15640ed25e8608fe8c3481a8ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 865aa70211d3d49137d2b8e53b9b7568fea8b74299bed02bda52aa24b8a4ec4b8850e705a12b8ad63b92088d8aa486678eee465c685d55f09381ecc79f5b0809
|
7
|
+
data.tar.gz: 0af23a989d74ccbb153fd665d1bdac9c9eec041aafd7420050dcc139efde8712dcaead5b981340f0e36e485a9b4fb5b2d745aa1437642c5af0b6405aa6b81a6a
|
data/CHANGELOG.md
CHANGED
@@ -17,8 +17,11 @@ gem 'database_cleaner'
|
|
17
17
|
gem 'delayed_job_active_record'
|
18
18
|
gem 'resque'
|
19
19
|
gem 'redis'
|
20
|
-
gem '
|
20
|
+
gem 'dalli', '~>2.6'
|
21
|
+
gem 'memcached', '~>1.7'
|
21
22
|
gem 'rack-test'
|
23
|
+
gem 'simplecov', :require => false, :group => :test
|
24
|
+
gem 'honeybadger'
|
22
25
|
|
23
26
|
# Gem under test
|
24
27
|
gem 'metrician', :path => '..'
|
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
metrician (0.0.
|
4
|
+
metrician (0.0.8)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -45,6 +45,7 @@ GEM
|
|
45
45
|
byebug (9.0.6)
|
46
46
|
concurrent-ruby (1.0.5)
|
47
47
|
connection_pool (2.2.1)
|
48
|
+
dalli (2.7.6)
|
48
49
|
database_cleaner (1.6.1)
|
49
50
|
delayed_job (4.1.3)
|
50
51
|
activesupport (>= 3.0, < 5.2)
|
@@ -52,12 +53,15 @@ GEM
|
|
52
53
|
activerecord (>= 3.0, < 5.2)
|
53
54
|
delayed_job (>= 3.0, < 5)
|
54
55
|
diff-lcs (1.3)
|
56
|
+
docile (1.1.5)
|
55
57
|
erubis (2.7.0)
|
56
58
|
gemika (0.3.2)
|
57
59
|
globalid (0.4.0)
|
58
60
|
activesupport (>= 4.2.0)
|
61
|
+
honeybadger (3.1.2)
|
59
62
|
i18n (0.8.4)
|
60
63
|
instrumental_agent (1.0.1)
|
64
|
+
json (1.8.6)
|
61
65
|
loofah (2.0.3)
|
62
66
|
nokogiri (>= 1.5.9)
|
63
67
|
mail (2.6.6)
|
@@ -130,6 +134,11 @@ GEM
|
|
130
134
|
connection_pool (~> 2.2, >= 2.2.0)
|
131
135
|
rack-protection (>= 1.5.0)
|
132
136
|
redis (~> 3.2, >= 3.2.1)
|
137
|
+
simplecov (0.14.1)
|
138
|
+
docile (~> 1.1.0)
|
139
|
+
json (>= 1.8, < 3)
|
140
|
+
simplecov-html (~> 0.10.0)
|
141
|
+
simplecov-html (0.10.1)
|
133
142
|
sinatra (1.4.8)
|
134
143
|
rack (~> 1.5)
|
135
144
|
rack-protection (~> 1.4)
|
@@ -154,11 +163,13 @@ PLATFORMS
|
|
154
163
|
|
155
164
|
DEPENDENCIES
|
156
165
|
byebug
|
166
|
+
dalli (~> 2.6)
|
157
167
|
database_cleaner
|
158
168
|
delayed_job_active_record
|
159
169
|
gemika
|
170
|
+
honeybadger
|
160
171
|
instrumental_agent
|
161
|
-
memcached
|
172
|
+
memcached (~> 1.7)
|
162
173
|
metrician!
|
163
174
|
mysql2 (= 0.3.17)
|
164
175
|
rack-test
|
@@ -168,6 +179,7 @@ DEPENDENCIES
|
|
168
179
|
resque
|
169
180
|
rspec (~> 3.4)
|
170
181
|
sidekiq (~> 4.0)
|
182
|
+
simplecov
|
171
183
|
|
172
184
|
BUNDLED WITH
|
173
185
|
1.14.6
|
data/gemfiles/Gemfile.5.0.pg
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: ..
|
3
3
|
specs:
|
4
|
-
metrician (0.0.
|
4
|
+
metrician (0.0.8)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -56,16 +56,20 @@ GEM
|
|
56
56
|
activerecord (>= 3.0, < 5.2)
|
57
57
|
delayed_job (>= 3.0, < 5)
|
58
58
|
diff-lcs (1.3)
|
59
|
+
docile (1.1.5)
|
59
60
|
erubis (2.7.0)
|
60
61
|
gemika (0.3.2)
|
61
62
|
globalid (0.4.0)
|
62
63
|
activesupport (>= 4.2.0)
|
64
|
+
honeybadger (3.1.2)
|
63
65
|
i18n (0.8.4)
|
64
66
|
instrumental_agent (1.0.1)
|
67
|
+
json (1.8.6)
|
65
68
|
loofah (2.0.3)
|
66
69
|
nokogiri (>= 1.5.9)
|
67
70
|
mail (2.6.5)
|
68
71
|
mime-types (>= 1.16, < 4)
|
72
|
+
memcached (1.8.0)
|
69
73
|
method_source (0.8.2)
|
70
74
|
mime-types (3.1)
|
71
75
|
mime-types-data (~> 3.2015)
|
@@ -135,6 +139,11 @@ GEM
|
|
135
139
|
connection_pool (~> 2.2, >= 2.2.0)
|
136
140
|
rack-protection (>= 1.5.0)
|
137
141
|
redis (~> 3.3, >= 3.3.3)
|
142
|
+
simplecov (0.14.1)
|
143
|
+
docile (~> 1.1.0)
|
144
|
+
json (>= 1.8, < 3)
|
145
|
+
simplecov-html (~> 0.10.0)
|
146
|
+
simplecov-html (0.10.1)
|
138
147
|
sinatra (2.0.0)
|
139
148
|
mustermann (~> 1.0)
|
140
149
|
rack (~> 2.0)
|
@@ -167,7 +176,9 @@ DEPENDENCIES
|
|
167
176
|
database_cleaner
|
168
177
|
delayed_job_active_record
|
169
178
|
gemika
|
179
|
+
honeybadger
|
170
180
|
instrumental_agent
|
181
|
+
memcached
|
171
182
|
metrician!
|
172
183
|
pg (~> 0.18.4)
|
173
184
|
rack-test
|
@@ -177,6 +188,7 @@ DEPENDENCIES
|
|
177
188
|
resque
|
178
189
|
rspec (~> 3.5)
|
179
190
|
sidekiq
|
191
|
+
simplecov
|
180
192
|
|
181
193
|
BUNDLED WITH
|
182
194
|
1.15.1
|
@@ -7,6 +7,7 @@ module Metrician
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def instrument
|
10
|
+
return if ::Honeybadger::Agent.method_defined?(:notify_with_metrician)
|
10
11
|
::Honeybadger::Agent.class_eval do
|
11
12
|
def notify_with_metrician(exception, options = {})
|
12
13
|
# We can differentiate whether or not we live inside a web
|
@@ -15,6 +16,7 @@ module Metrician
|
|
15
16
|
notify_without_metrician(exception, options)
|
16
17
|
ensure
|
17
18
|
Metrician.increment("exception.raise") if Metrician.configuration[:exception][:raise][:enabled]
|
19
|
+
# TODO: underscore is rails only
|
18
20
|
Metrician.increment("exception.raise.#{Metrician.dotify(exception.class.name.underscore)}") if exception && Metrician.configuration[:exception][:exception_specific][:enabled]
|
19
21
|
end
|
20
22
|
alias_method :notify_without_metrician, :notify
|
@@ -11,12 +11,11 @@ module Metrician
|
|
11
11
|
!!defined?(::Dalli) && !!defined?(::Dalli::Client)
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
15
|
-
|
16
|
-
Memcached
|
17
|
-
|
18
|
-
|
19
|
-
end
|
14
|
+
def client_classes
|
15
|
+
[
|
16
|
+
self.class.memcached_gem? && Memcached,
|
17
|
+
self.class.dalli_gem? && Dalli::Client,
|
18
|
+
].compact
|
20
19
|
end
|
21
20
|
|
22
21
|
def self.enabled?
|
@@ -25,10 +24,16 @@ module Metrician
|
|
25
24
|
end
|
26
25
|
|
27
26
|
def instrument
|
27
|
+
client_classes.each do |client_class|
|
28
|
+
instrument_class(client_class)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def instrument_class(client_class)
|
28
33
|
return if client_class.method_defined?(:get_with_metrician_trace)
|
29
34
|
METHODS.each do |method_name|
|
30
35
|
next unless client_class.method_defined?(method_name)
|
31
|
-
client_class.class_eval <<-
|
36
|
+
client_class.class_eval <<-RUBY
|
32
37
|
def #{method_name}_with_metrician_trace(*args, &blk)
|
33
38
|
start_time = Time.now
|
34
39
|
begin
|
@@ -41,7 +46,7 @@ module Metrician
|
|
41
46
|
end
|
42
47
|
alias #{method_name}_without_metrician_trace #{method_name}
|
43
48
|
alias #{method_name} #{method_name}_with_metrician_trace
|
44
|
-
|
49
|
+
RUBY
|
45
50
|
end
|
46
51
|
end
|
47
52
|
|
data/lib/metrician/version.rb
CHANGED
data/metrician.gemspec
CHANGED
data/spec/metrician_spec.rb
CHANGED
@@ -60,6 +60,51 @@ RSpec.describe Metrician do
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
describe "exception tracking" do
|
64
|
+
before do
|
65
|
+
Metrician.configuration[:exception][:enabled] = true
|
66
|
+
Honeybadger.configure do |config|
|
67
|
+
config.disabled = true
|
68
|
+
end
|
69
|
+
@agent = Metrician.null_agent
|
70
|
+
Metrician.activate(@agent)
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "honeybadger" do
|
74
|
+
specify "exceptions are instrumented" do
|
75
|
+
@agent.stub(:increment)
|
76
|
+
@agent.should_receive(:increment).with("exception.raise", 1)
|
77
|
+
Honeybadger.notify('Something went wrong.', {
|
78
|
+
error_class: 'MyClass',
|
79
|
+
context: {my_data: 'value'}
|
80
|
+
})
|
81
|
+
end
|
82
|
+
|
83
|
+
specify "exceptions are instrumented (job specific, string)" do
|
84
|
+
Metrician.configuration[:exception][:exception_specific][:enabled] = true
|
85
|
+
@agent.stub(:increment)
|
86
|
+
@agent.should_receive(:increment).with("exception.raise.string", 1)
|
87
|
+
Honeybadger.notify('Something went wrong.', {
|
88
|
+
error_class: 'MyClass',
|
89
|
+
context: {my_data: 'value'}
|
90
|
+
})
|
91
|
+
end
|
92
|
+
|
93
|
+
specify "exceptions are instrumented (job specific, exception)" do
|
94
|
+
Metrician.configuration[:exception][:exception_specific][:enabled] = true
|
95
|
+
@agent.stub(:increment)
|
96
|
+
@agent.should_receive(:increment).with("exception.raise.runtime_error", 1)
|
97
|
+
begin
|
98
|
+
fail 'badgers!'
|
99
|
+
rescue => exception
|
100
|
+
Honeybadger.notify(exception, context: {
|
101
|
+
my_data: 'value'
|
102
|
+
})
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
63
108
|
describe "ActiveRecord" do
|
64
109
|
before do
|
65
110
|
@agent = Metrician.null_agent
|
@@ -191,6 +236,26 @@ RSpec.describe Metrician do
|
|
191
236
|
# worker bits at latest possible time
|
192
237
|
lambda { TestSidekiqWorker.perform_async({ "error" => true}) }.should raise_error(StandardError)
|
193
238
|
end
|
239
|
+
|
240
|
+
specify "per job instrumentation" do
|
241
|
+
Metrician.configuration[:jobs][:job_specific][:enabled] = true
|
242
|
+
@agent.stub(:gauge)
|
243
|
+
|
244
|
+
@agent.should_receive(:gauge).with("jobs.run.job.TestSidekiqWorker", anything)
|
245
|
+
# avoid load order error of sidekiq here by just including the
|
246
|
+
# worker bits at latest possible time
|
247
|
+
TestSidekiqWorker.perform_async({ "success" => true})
|
248
|
+
end
|
249
|
+
|
250
|
+
specify "job errors are instrumented per job" do
|
251
|
+
Metrician.configuration[:jobs][:job_specific][:enabled] = true
|
252
|
+
@agent.stub(:increment)
|
253
|
+
@agent.should_receive(:increment).with("jobs.error.job.TestSidekiqWorker", 1)
|
254
|
+
|
255
|
+
# avoid load order error of sidekiq here by just including the
|
256
|
+
# worker bits at latest possible time
|
257
|
+
lambda { TestSidekiqWorker.perform_async({ "error" => true}) }.should raise_error(StandardError)
|
258
|
+
end
|
194
259
|
end
|
195
260
|
end
|
196
261
|
|
@@ -205,10 +270,9 @@ RSpec.describe Metrician do
|
|
205
270
|
end
|
206
271
|
|
207
272
|
memcached_clients = [
|
208
|
-
|
209
|
-
|
210
|
-
]
|
211
|
-
raise "no memcached client" if memcached_clients.empty?
|
273
|
+
::Memcached.new("localhost:11211"),
|
274
|
+
::Dalli::Client.new("localhost:11211"),
|
275
|
+
]
|
212
276
|
|
213
277
|
memcached_clients.each do |client|
|
214
278
|
specify "memcached is instrumented (#{client.class.name})" do
|
@@ -412,5 +476,25 @@ RSpec.describe Metrician do
|
|
412
476
|
end
|
413
477
|
|
414
478
|
end
|
479
|
+
|
480
|
+
describe "rails" do
|
481
|
+
def app
|
482
|
+
TestRailsApp.instance
|
483
|
+
end
|
484
|
+
|
485
|
+
let(:agent) { Metrician.null_agent }
|
486
|
+
|
487
|
+
before do
|
488
|
+
Metrician.activate(agent)
|
489
|
+
end
|
490
|
+
|
491
|
+
it "hooks into rails automatically" do
|
492
|
+
agent.stub(:gauge)
|
493
|
+
agent.should_receive(:gauge).with("web.request", anything)
|
494
|
+
|
495
|
+
get "/"
|
496
|
+
last_response.body.should == "foobar response"
|
497
|
+
end
|
498
|
+
end
|
415
499
|
end
|
416
500
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
require "rails/all"
|
2
|
+
|
3
|
+
class TestRailsApp < Rails::Application
|
4
|
+
secrets.secret_token = "secret_token"
|
5
|
+
secrets.secret_key_base = "secret_key_base"
|
6
|
+
|
7
|
+
config.logger = Logger.new($stdout)
|
8
|
+
Rails.logger = config.logger
|
9
|
+
|
10
|
+
routes.draw do
|
11
|
+
get "/", to: "foobars#index"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class FoobarsController < ActionController::Base
|
16
|
+
include Rails.application.routes.url_helpers
|
17
|
+
|
18
|
+
def index
|
19
|
+
render inline: "foobar response"
|
20
|
+
end
|
21
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: metrician
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Expected Behavior
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-08-
|
11
|
+
date: 2017-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: instrumental_agent
|
@@ -94,6 +94,20 @@ dependencies:
|
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: simplecov
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
97
111
|
description: Automatically report the most important metrics about your ruby application,
|
98
112
|
from request timing to job execution.
|
99
113
|
email:
|
@@ -151,6 +165,7 @@ files:
|
|
151
165
|
- spec/support/database.travis.yml
|
152
166
|
- spec/support/models.rb
|
153
167
|
- spec/support/test_delayed_job.rb
|
168
|
+
- spec/support/test_rails_app.rb
|
154
169
|
- spec/support/test_resque_job.rb
|
155
170
|
- spec/support/test_sidekiq_worker.rb
|
156
171
|
homepage: http://instrumentalapp.com/
|
@@ -187,5 +202,6 @@ test_files:
|
|
187
202
|
- spec/support/database.travis.yml
|
188
203
|
- spec/support/models.rb
|
189
204
|
- spec/support/test_delayed_job.rb
|
205
|
+
- spec/support/test_rails_app.rb
|
190
206
|
- spec/support/test_resque_job.rb
|
191
207
|
- spec/support/test_sidekiq_worker.rb
|