metrician 0.0.7 → 0.0.8
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/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
|