metrician 0.0.10 → 0.0.11
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/.travis.yml +1 -0
- data/CHANGELOG.md +3 -0
- data/gemfiles/Gemfile.4.2.sidekiq-4.lock +1 -1
- data/gemfiles/Gemfile.5.0.pg.lock +1 -1
- data/gemfiles/Gemfile.dalli_not_memcached.lock +1 -1
- data/gemfiles/Gemfile.minimal +14 -0
- data/gemfiles/Gemfile.minimal.lock +48 -0
- data/lib/metrician.rb +1 -0
- data/lib/metrician/configuration.rb +1 -20
- data/lib/metrician/core_ext.rb +48 -0
- data/lib/metrician/version.rb +1 -1
- data/script/test +8 -0
- data/spec/metrician_spec.rb +33 -18
- data/spec/spec_helper.rb +0 -2
- data/spec/support/database.rb +27 -25
- data/spec/support/models.rb +3 -1
- data/spec/support/test_rails_app.rb +16 -14
- data/spec/support/test_sidekiq_worker.rb +7 -5
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ea4543ca702d54b9c5b3b98da80914d17c4804e
|
4
|
+
data.tar.gz: 923cd68e6fd20feb0b1a786c83b53dec87e629a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8c3ef47ea845363d1c5d581435de855b4c115397523aa71d4632489a70dbed294e51779d05582a3d2119ad88800037760348f8acfb4ad1d469753c5df325c454
|
7
|
+
data.tar.gz: f29e315bffa5fa8ccd9dd86d0f39782f174eab18278f4c98ed09e5d898ca6597c4dbcd87efcf97c39ca91a08d62114a833bbbcde1052821d62545f10b13788be
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Differentiated development dependencies
|
4
|
+
gem 'rspec', '~> 3.4'
|
5
|
+
|
6
|
+
# Development dependencies
|
7
|
+
gem 'instrumental_agent'
|
8
|
+
gem 'rake'
|
9
|
+
gem 'byebug'
|
10
|
+
gem 'gemika'
|
11
|
+
gem 'simplecov', :require => false, :group => :test
|
12
|
+
|
13
|
+
# Gem under test
|
14
|
+
gem 'metrician', :path => '..'
|
@@ -0,0 +1,48 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ..
|
3
|
+
specs:
|
4
|
+
metrician (0.0.11)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: https://rubygems.org/
|
8
|
+
specs:
|
9
|
+
byebug (9.0.6)
|
10
|
+
diff-lcs (1.3)
|
11
|
+
docile (1.1.5)
|
12
|
+
gemika (0.3.2)
|
13
|
+
instrumental_agent (1.0.1)
|
14
|
+
json (2.1.0)
|
15
|
+
rake (12.0.0)
|
16
|
+
rspec (3.6.0)
|
17
|
+
rspec-core (~> 3.6.0)
|
18
|
+
rspec-expectations (~> 3.6.0)
|
19
|
+
rspec-mocks (~> 3.6.0)
|
20
|
+
rspec-core (3.6.0)
|
21
|
+
rspec-support (~> 3.6.0)
|
22
|
+
rspec-expectations (3.6.0)
|
23
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
24
|
+
rspec-support (~> 3.6.0)
|
25
|
+
rspec-mocks (3.6.0)
|
26
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
27
|
+
rspec-support (~> 3.6.0)
|
28
|
+
rspec-support (3.6.0)
|
29
|
+
simplecov (0.15.0)
|
30
|
+
docile (~> 1.1.0)
|
31
|
+
json (>= 1.8, < 3)
|
32
|
+
simplecov-html (~> 0.10.0)
|
33
|
+
simplecov-html (0.10.2)
|
34
|
+
|
35
|
+
PLATFORMS
|
36
|
+
ruby
|
37
|
+
|
38
|
+
DEPENDENCIES
|
39
|
+
byebug
|
40
|
+
gemika
|
41
|
+
instrumental_agent
|
42
|
+
metrician!
|
43
|
+
rake
|
44
|
+
rspec (~> 3.4)
|
45
|
+
simplecov
|
46
|
+
|
47
|
+
BUNDLED WITH
|
48
|
+
1.14.2
|
data/lib/metrician.rb
CHANGED
@@ -9,7 +9,7 @@ module Metrician
|
|
9
9
|
|
10
10
|
config = {}
|
11
11
|
config_locations.reverse.each do |location|
|
12
|
-
deep_merge!(
|
12
|
+
config.deep_merge!(YAML.load_file(location)) if File.exist?(location)
|
13
13
|
end
|
14
14
|
config
|
15
15
|
end
|
@@ -42,24 +42,5 @@ module Metrician
|
|
42
42
|
Metrician::Jobs.reset
|
43
43
|
Metrician::Middleware.reset
|
44
44
|
end
|
45
|
-
|
46
|
-
def self.deep_merge!(this_hash, other_hash, &block)
|
47
|
-
return this_hash unless other_hash
|
48
|
-
other_hash.each_pair do |current_key, other_value|
|
49
|
-
this_value = this_hash[current_key]
|
50
|
-
|
51
|
-
this_hash[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
|
52
|
-
this_value.deep_merge(other_value, &block)
|
53
|
-
else
|
54
|
-
if block_given? && this_hash.key?(current_key)
|
55
|
-
block.call(current_key, this_value, other_value)
|
56
|
-
else
|
57
|
-
other_value
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
this_hash
|
63
|
-
end
|
64
45
|
end
|
65
46
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
begin
|
2
|
+
require 'active_support/core_ext/hash/deep_merge'
|
3
|
+
rescue LoadError
|
4
|
+
class Hash
|
5
|
+
# active_support
|
6
|
+
def deep_merge(other_hash, &block)
|
7
|
+
dup.deep_merge!(other_hash, &block)
|
8
|
+
end if !{}.respond_to?(:deep_merge)
|
9
|
+
|
10
|
+
def deep_merge!(other_hash, &block)
|
11
|
+
other_hash.each_pair do |current_key, other_value|
|
12
|
+
this_value = self[current_key]
|
13
|
+
|
14
|
+
self[current_key] = if this_value.is_a?(Hash) && other_value.is_a?(Hash)
|
15
|
+
this_value.deep_merge(other_value, &block)
|
16
|
+
else
|
17
|
+
if block_given? && key?(current_key)
|
18
|
+
block.call(current_key, this_value, other_value)
|
19
|
+
else
|
20
|
+
other_value
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
self
|
26
|
+
end if !{}.respond_to?(:deep_merge!)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
begin
|
31
|
+
require 'active_support/core_ext/string/inflections'
|
32
|
+
rescue LoadError
|
33
|
+
class String
|
34
|
+
# active_support
|
35
|
+
def underscore
|
36
|
+
camel_cased_word = self
|
37
|
+
return camel_cased_word unless camel_cased_word =~ /[A-Z-]|::/
|
38
|
+
word = camel_cased_word.to_s.gsub(/::/, '/')
|
39
|
+
# word.gsub!(/(?:(?<=([A-Za-z\d]))|\b)(#{inflections.acronym_regex})(?=\b|[^a-z])/) { "#{$1 && '_'}#{$2.downcase}" }
|
40
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
41
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
42
|
+
word.tr!("-", "_")
|
43
|
+
word.downcase!
|
44
|
+
word end
|
45
|
+
end if !"".respond_to?(:underscore)
|
46
|
+
end
|
47
|
+
|
48
|
+
|
data/lib/metrician/version.rb
CHANGED
data/script/test
CHANGED
@@ -19,6 +19,14 @@ for ruby_version in `ruby -ryaml -e 'puts YAML.load(File.read(".travis.yml"))["r
|
|
19
19
|
} || success="false"
|
20
20
|
done
|
21
21
|
|
22
|
+
minimum_coverage="90"
|
23
|
+
if ! bundle exec ruby -e "require 'simplecov'; exit SimpleCov::LastRun.read['result']['covered_percent'] >= ${minimum_coverage}"; then
|
24
|
+
success="false"
|
25
|
+
echo
|
26
|
+
echo "Coverage fell below minimum of ${minimum_coverage}:"
|
27
|
+
cat coverage/.last_run.json
|
28
|
+
fi
|
29
|
+
|
22
30
|
if [ $success == "true" ]; then
|
23
31
|
tput bold # bold text
|
24
32
|
tput setaf 2 # green text
|
data/spec/metrician_spec.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "instrumental_agent"
|
3
|
+
require "tempfile"
|
3
4
|
|
4
5
|
module Metrician
|
5
6
|
def self.null_agent(agent_class: Instrumental::Agent)
|
@@ -7,6 +8,12 @@ module Metrician
|
|
7
8
|
end
|
8
9
|
end
|
9
10
|
|
11
|
+
def should_skip?(gem_name)
|
12
|
+
unless Gemika::Env.gem?(gem_name)
|
13
|
+
"Skipping tests because gem '#{gem_name}' isn't loaded. Make sure this is correct for the current Gemfile."
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
10
17
|
RSpec.describe Metrician do
|
11
18
|
before(:each) do
|
12
19
|
Metrician.reset
|
@@ -63,14 +70,17 @@ RSpec.describe Metrician do
|
|
63
70
|
describe "exception tracking" do
|
64
71
|
before do
|
65
72
|
Metrician.configuration[:exception][:enabled] = true
|
66
|
-
Honeybadger.configure do |config|
|
67
|
-
config.disabled = true
|
68
|
-
end
|
69
73
|
@agent = Metrician.null_agent
|
70
74
|
Metrician.activate(@agent)
|
71
75
|
end
|
72
76
|
|
73
|
-
describe "honeybadger" do
|
77
|
+
describe "honeybadger", skip: should_skip?('honeybadger') do
|
78
|
+
before do
|
79
|
+
Honeybadger.configure do |config|
|
80
|
+
config.disabled = true
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
74
84
|
specify "exceptions are instrumented" do
|
75
85
|
@agent.stub(:increment)
|
76
86
|
@agent.should_receive(:increment).with("app.tracked_exception", 1)
|
@@ -105,7 +115,7 @@ RSpec.describe Metrician do
|
|
105
115
|
end
|
106
116
|
end
|
107
117
|
|
108
|
-
describe "ActiveRecord" do
|
118
|
+
describe "ActiveRecord", skip: should_skip?('activerecord') do
|
109
119
|
before do
|
110
120
|
@agent = Metrician.null_agent
|
111
121
|
Metrician.activate(@agent)
|
@@ -144,7 +154,7 @@ RSpec.describe Metrician do
|
|
144
154
|
end
|
145
155
|
|
146
156
|
describe "job systems" do
|
147
|
-
describe "delayed_job" do
|
157
|
+
describe "delayed_job", skip: should_skip?('delayed_job') do
|
148
158
|
before do
|
149
159
|
@agent = Metrician.null_agent
|
150
160
|
Metrician.activate(@agent)
|
@@ -176,7 +186,7 @@ RSpec.describe Metrician do
|
|
176
186
|
end
|
177
187
|
end
|
178
188
|
|
179
|
-
describe "resque" do
|
189
|
+
describe "resque", skip: should_skip?('resque') do
|
180
190
|
before do
|
181
191
|
Resque.inline = true
|
182
192
|
@agent = Metrician.null_agent
|
@@ -202,7 +212,7 @@ RSpec.describe Metrician do
|
|
202
212
|
end
|
203
213
|
end
|
204
214
|
|
205
|
-
describe "sidekiq" do
|
215
|
+
describe "sidekiq", skip: should_skip?('sidekiq') do
|
206
216
|
before do
|
207
217
|
Sidekiq::Testing.inline!
|
208
218
|
@agent = Metrician.null_agent
|
@@ -260,7 +270,7 @@ RSpec.describe Metrician do
|
|
260
270
|
end
|
261
271
|
|
262
272
|
describe "cache systems" do
|
263
|
-
specify "redis is instrumented" do
|
273
|
+
specify "redis is instrumented", skip: should_skip?('redis') do
|
264
274
|
agent = Metrician.null_agent
|
265
275
|
Metrician.activate(agent)
|
266
276
|
client = Redis.new
|
@@ -269,13 +279,8 @@ RSpec.describe Metrician do
|
|
269
279
|
client.get("foo-#{rand(100_000)}")
|
270
280
|
end
|
271
281
|
|
272
|
-
|
273
|
-
|
274
|
-
::Dalli::Client.new("localhost:11211"),
|
275
|
-
].compact
|
276
|
-
|
277
|
-
memcached_clients.each do |client|
|
278
|
-
specify "memcached is instrumented (#{client.class.name})" do
|
282
|
+
shared_examples "memcache libs" do
|
283
|
+
it "is instrumented" do
|
279
284
|
agent = Metrician.null_agent
|
280
285
|
Metrician.activate(agent)
|
281
286
|
agent.stub(:gauge)
|
@@ -289,6 +294,16 @@ RSpec.describe Metrician do
|
|
289
294
|
end
|
290
295
|
end
|
291
296
|
end
|
297
|
+
|
298
|
+
describe "memcached gem", skip: should_skip?('memcached') do
|
299
|
+
let(:client) { ::Memcached.new("localhost:11211") }
|
300
|
+
it_behaves_like "memcache libs"
|
301
|
+
end
|
302
|
+
|
303
|
+
describe "dalli gem", skip: should_skip?('dalli') do
|
304
|
+
let(:client) { ::Dalli::Client.new("localhost:11211") }
|
305
|
+
it_behaves_like "memcache libs"
|
306
|
+
end
|
292
307
|
end
|
293
308
|
|
294
309
|
describe "external service timing" do
|
@@ -302,8 +317,8 @@ RSpec.describe Metrician do
|
|
302
317
|
end
|
303
318
|
end
|
304
319
|
|
305
|
-
describe "request timing" do
|
306
|
-
include Rack::Test::Methods
|
320
|
+
describe "request timing", skip: should_skip?('rack') do
|
321
|
+
include Rack::Test::Methods if Gemika::Env.gem?('rack')
|
307
322
|
|
308
323
|
let(:agent) { Metrician.null_agent }
|
309
324
|
|
data/spec/spec_helper.rb
CHANGED
data/spec/support/database.rb
CHANGED
@@ -1,33 +1,35 @@
|
|
1
|
-
|
2
|
-
database.
|
1
|
+
if Gemika::Env.gem?('activerecord')
|
2
|
+
database = Gemika::Database.new
|
3
|
+
database.connect
|
3
4
|
|
4
|
-
if Gemika::Env.gem?('activerecord', '< 5')
|
5
|
-
|
6
|
-
|
5
|
+
if Gemika::Env.gem?('activerecord', '< 5')
|
6
|
+
class ActiveRecord::ConnectionAdapters::Mysql2Adapter
|
7
|
+
NATIVE_DATABASE_TYPES[:primary_key] = "int(11) auto_increment PRIMARY KEY"
|
8
|
+
end
|
7
9
|
end
|
8
|
-
end
|
9
10
|
|
10
|
-
database.rewrite_schema! do
|
11
|
+
database.rewrite_schema! do
|
11
12
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
create_table :users do |t|
|
14
|
+
t.string :name
|
15
|
+
t.string :email
|
16
|
+
t.string :city
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
19
|
+
create_table :delayed_jobs, force: true do |table|
|
20
|
+
table.integer :priority, default: 0, null: false # Allows some jobs to jump to the front of the queue
|
21
|
+
table.integer :attempts, default: 0, null: false # Provides for retries, but still fail eventually.
|
22
|
+
table.text :handler, null: false # YAML-encoded string of the object that will do work
|
23
|
+
table.text :last_error # reason for last failure (See Note below)
|
24
|
+
table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
|
25
|
+
table.datetime :locked_at # Set when a client is working on this object
|
26
|
+
table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
|
27
|
+
table.string :locked_by # Who is working on this object (if locked)
|
28
|
+
table.string :queue # The name of the queue this job is in
|
29
|
+
table.timestamps null: true
|
30
|
+
end
|
30
31
|
|
31
|
-
|
32
|
+
add_index :delayed_jobs, [:priority, :run_at], name: "delayed_jobs_priority"
|
32
33
|
|
34
|
+
end
|
33
35
|
end
|
data/spec/support/models.rb
CHANGED
@@ -1,21 +1,23 @@
|
|
1
|
-
|
1
|
+
if Gemika::Env.gem?('activerecord')
|
2
|
+
require "rails/all"
|
2
3
|
|
3
|
-
class TestRailsApp < Rails::Application
|
4
|
-
|
5
|
-
|
4
|
+
class TestRailsApp < Rails::Application
|
5
|
+
secrets.secret_token = "secret_token"
|
6
|
+
secrets.secret_key_base = "secret_key_base"
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
config.logger = Logger.new($stdout)
|
9
|
+
Rails.logger = config.logger
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
routes.draw do
|
12
|
+
get "/", to: "foobars#index"
|
13
|
+
end
|
12
14
|
end
|
13
|
-
end
|
14
15
|
|
15
|
-
class FoobarsController < ActionController::Base
|
16
|
-
|
16
|
+
class FoobarsController < ActionController::Base
|
17
|
+
include Rails.application.routes.url_helpers
|
17
18
|
|
18
|
-
|
19
|
-
|
19
|
+
def index
|
20
|
+
render inline: "foobar response"
|
21
|
+
end
|
20
22
|
end
|
21
|
-
end
|
23
|
+
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
if Gemika::Env.gem?('sidekiq')
|
2
|
+
class TestSidekiqWorker
|
3
|
+
include Sidekiq::Worker
|
3
4
|
|
4
|
-
|
5
|
-
|
6
|
-
|
5
|
+
def perform(options = {})
|
6
|
+
return if options["success"]
|
7
|
+
raise "suck it nerd" if options["error"]
|
8
|
+
end
|
7
9
|
end
|
8
10
|
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.11
|
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-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: instrumental_agent
|
@@ -133,8 +133,11 @@ files:
|
|
133
133
|
- gemfiles/Gemfile.5.0.pg.lock
|
134
134
|
- gemfiles/Gemfile.dalli_not_memcached
|
135
135
|
- gemfiles/Gemfile.dalli_not_memcached.lock
|
136
|
+
- gemfiles/Gemfile.minimal
|
137
|
+
- gemfiles/Gemfile.minimal.lock
|
136
138
|
- lib/metrician.rb
|
137
139
|
- lib/metrician/configuration.rb
|
140
|
+
- lib/metrician/core_ext.rb
|
138
141
|
- lib/metrician/jobs.rb
|
139
142
|
- lib/metrician/jobs/delayed_job_callbacks.rb
|
140
143
|
- lib/metrician/jobs/resque_plugin.rb
|