metrician 0.0.6 → 0.0.7
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 -1
- data/CHANGELOG.md +7 -0
- data/gemfiles/Gemfile.4.2.sidekiq-4.lock +1 -1
- data/gemfiles/Gemfile.5.0.pg.lock +1 -1
- data/lib/metrician/configuration.rb +38 -13
- data/lib/metrician/reporters/active_record.rb +2 -2
- data/lib/metrician/version.rb +1 -1
- data/{config/metrician.yaml → metrician.defaults.yaml} +5 -1
- data/metrician.example.yaml +136 -0
- data/metrician.gemspec +1 -0
- data/script/setup +1 -2
- data/spec/metrician_spec.rb +21 -2
- data/spec/support/database.travis.yml +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9cf863462aef4c2b2425233de2c527f3b1286bdf
|
4
|
+
data.tar.gz: 461a4cafdc0255467e2b7cbf9c236c49575a2a6b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8f98d615943e39c4f1257420c7bb7f301c9d3c9ecf25bdea95b6c4c083b9b4c63b85519218385b468240c550790f126b06d8355764d13f912d708d678e91ba37
|
7
|
+
data.tar.gz: cf46b4c1638fd04ec00d3565e6650b511ea60e37b21edbfa38248ba796b06b9f00c42998903d36bba11928182427c45b823956bb88c9402ee328c20aee0a825f
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
### 0.0.7 [August 3, 2017]
|
2
|
+
* Allow partial config files
|
3
|
+
* Officially require Ruby 2
|
4
|
+
* Add separate DB command and table configs
|
5
|
+
* Don't add method tracing function by default
|
6
|
+
* Add example config file
|
7
|
+
|
1
8
|
### 0.0.6 [July 25, 2017]
|
2
9
|
* Fix edge case in web error tracking
|
3
10
|
|
@@ -7,34 +7,59 @@ module Metrician
|
|
7
7
|
def self.load
|
8
8
|
reset_dependents
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
return YAML.load(env_location)
|
14
|
-
end
|
15
|
-
|
16
|
-
if File.exist?(app_location)
|
17
|
-
return YAML.load_file(app_location)
|
10
|
+
config = {}
|
11
|
+
config_locations.reverse.each do |location|
|
12
|
+
deep_merge!(config, YAML.load_file(location)) if File.exist?(location)
|
18
13
|
end
|
14
|
+
config
|
15
|
+
end
|
19
16
|
|
20
|
-
|
17
|
+
def self.config_locations
|
18
|
+
[env_location, *app_locations, gem_location].compact
|
21
19
|
end
|
22
20
|
|
23
21
|
def self.env_location
|
24
|
-
ENV["METRICIAN_CONFIG"]
|
22
|
+
path = ENV["METRICIAN_CONFIG"]
|
23
|
+
if path && !File.exist?(path)
|
24
|
+
# this should never raise unless a bad ENV setting has been set
|
25
|
+
raise(FileMissing.new(path))
|
26
|
+
end
|
27
|
+
path
|
25
28
|
end
|
26
29
|
|
27
|
-
def self.
|
28
|
-
|
30
|
+
def self.app_locations
|
31
|
+
[
|
32
|
+
File.join(Dir.pwd, "config", "metrician.yaml"),
|
33
|
+
File.join(Dir.pwd, "config", "metrician.yml"),
|
34
|
+
]
|
29
35
|
end
|
30
36
|
|
31
37
|
def self.gem_location
|
32
|
-
File.expand_path("../../../
|
38
|
+
File.expand_path("../../../metrician.defaults.yaml", __FILE__)
|
33
39
|
end
|
34
40
|
|
35
41
|
def self.reset_dependents
|
36
42
|
Metrician::Jobs.reset
|
37
43
|
Metrician::Middleware.reset
|
38
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
|
39
64
|
end
|
40
65
|
end
|
@@ -37,11 +37,11 @@ module Metrician
|
|
37
37
|
config = Metrician.configuration[:database]
|
38
38
|
metrics = []
|
39
39
|
metrics << "database.query" if config[:query][:enabled]
|
40
|
-
if
|
40
|
+
if [:command, :table, :command_and_table].any?{ |key| config[key][:enabled] }
|
41
41
|
command, table = parse_sql(sql)
|
42
42
|
metrics << "database.#{command}" if config[:command][:enabled] && command
|
43
43
|
metrics << "database.#{table}" if config[:table][:enabled] && table
|
44
|
-
metrics << "database.#{command}.#{table}" if config[:
|
44
|
+
metrics << "database.#{command}.#{table}" if config[:command_and_table][:enabled] && command && table
|
45
45
|
end
|
46
46
|
begin
|
47
47
|
log_without_metrician(*args, &block)
|
data/lib/metrician/version.rb
CHANGED
@@ -65,6 +65,10 @@
|
|
65
65
|
:table:
|
66
66
|
:enabled: false
|
67
67
|
|
68
|
+
# collect query information about the command issued and table executed against
|
69
|
+
:command_and_table:
|
70
|
+
:enabled: false
|
71
|
+
|
68
72
|
|
69
73
|
# "external_service" settings control reporting metrics when Net::HTTP
|
70
74
|
# is used to make requests
|
@@ -133,4 +137,4 @@
|
|
133
137
|
|
134
138
|
# hook into Module with add_metrician_method_tracer added as a base
|
135
139
|
# feature of every ruby object
|
136
|
-
:enabled:
|
140
|
+
:enabled: false
|
@@ -0,0 +1,136 @@
|
|
1
|
+
# A configuration for Metrician that controls the features of its
|
2
|
+
# automated metric reporting
|
3
|
+
|
4
|
+
---
|
5
|
+
|
6
|
+
# # "request_timing" settings control the features of the Request Timing Rack Middleware
|
7
|
+
:request_timing:
|
8
|
+
# # hook into Rack middleware for request timing
|
9
|
+
# :enabled: true
|
10
|
+
|
11
|
+
# # collect basic request timing for every request
|
12
|
+
# :request:
|
13
|
+
# :enabled: true
|
14
|
+
|
15
|
+
# # report 5xx codes as errors
|
16
|
+
# :error:
|
17
|
+
# :enabled: true
|
18
|
+
|
19
|
+
# # report time between requests in a server process as idle time
|
20
|
+
# :idle:
|
21
|
+
# :enabled: false
|
22
|
+
|
23
|
+
# # report the payload size of requests
|
24
|
+
# :response_size:
|
25
|
+
# :enabled: false
|
26
|
+
|
27
|
+
# # report the amount of time spent on middleware per request
|
28
|
+
# :middleware:
|
29
|
+
# :enabled: false
|
30
|
+
|
31
|
+
# # report the amount of time a request spent queued at the web layer
|
32
|
+
# # before hitting Rack
|
33
|
+
# :queue_time:
|
34
|
+
# :enabled: false
|
35
|
+
|
36
|
+
# # report the controller, action, and verb for every request
|
37
|
+
# :route_tracking:
|
38
|
+
# :enabled: false
|
39
|
+
|
40
|
+
# # "apdex" controls the recording of metrics to measure apdex
|
41
|
+
# # More here: https://en.wikipedia.org/wiki/Apdex
|
42
|
+
# # Note this requires "request" tracking to be enabled
|
43
|
+
# :apdex:
|
44
|
+
# :enabled: true
|
45
|
+
|
46
|
+
# # set the threshold (seconds), above which a request is no longer
|
47
|
+
# # considered "sasifactory". The "tolerates" threshold will be
|
48
|
+
# # 4x this number.
|
49
|
+
# :satisfied_threshold: 2.5
|
50
|
+
|
51
|
+
# # "database" settings control ActiveRecord metric reporting features
|
52
|
+
:database:
|
53
|
+
# # hook into ActiveRecord for db call timing
|
54
|
+
# :enabled: true
|
55
|
+
|
56
|
+
# # collect basic query tracking for every query
|
57
|
+
# :query:
|
58
|
+
# :enabled: true
|
59
|
+
|
60
|
+
# # collect generic sql query information (select, update, insert, etc.)
|
61
|
+
# :command:
|
62
|
+
# :enabled: false
|
63
|
+
|
64
|
+
# # collect query information for specific tables
|
65
|
+
# :table:
|
66
|
+
# :enabled: false
|
67
|
+
|
68
|
+
|
69
|
+
# # "external_service" settings control reporting metrics when Net::HTTP
|
70
|
+
# # is used to make requests
|
71
|
+
:external_service:
|
72
|
+
# # hook into Net::HTTP to record timing metrics
|
73
|
+
# :enabled: true
|
74
|
+
|
75
|
+
# # collect basic external request timing information
|
76
|
+
# :request:
|
77
|
+
# :enabled: true
|
78
|
+
|
79
|
+
|
80
|
+
# # "jobs" settings control reporting metrics when ruby job systems
|
81
|
+
# # work through their queues
|
82
|
+
:jobs:
|
83
|
+
|
84
|
+
# # hook into job system middleware when presence detected
|
85
|
+
# :enabled: true
|
86
|
+
|
87
|
+
# # record the basic timing of every job
|
88
|
+
# :run:
|
89
|
+
# :enabled: true
|
90
|
+
|
91
|
+
# # record when an error occurs in the a job
|
92
|
+
# :error:
|
93
|
+
# :enabled: true
|
94
|
+
|
95
|
+
# # record metrics for each kind of job that is worked from the queue
|
96
|
+
# :job_specific:
|
97
|
+
# :enabled: false
|
98
|
+
|
99
|
+
# # "cache" settings control timing of commands to services often used as
|
100
|
+
# # application caches like memcached and redis
|
101
|
+
:cache:
|
102
|
+
|
103
|
+
# # hook into caching libraries
|
104
|
+
# :enabled: true
|
105
|
+
|
106
|
+
# # record aggregate timing information for all cache commands
|
107
|
+
# :command:
|
108
|
+
# :enabled: true
|
109
|
+
|
110
|
+
# # record the timing of each command as its own metric
|
111
|
+
# :command_specific:
|
112
|
+
# :enabled: false
|
113
|
+
|
114
|
+
|
115
|
+
# # "exception" settings control reporting when exceptions are caught
|
116
|
+
# # by an exception tracker in your application
|
117
|
+
:exception:
|
118
|
+
|
119
|
+
# # hook into exception tracking libraries
|
120
|
+
# :enabled: false
|
121
|
+
|
122
|
+
# # report when an exception is raised and caught by an exception tracker
|
123
|
+
# :raise:
|
124
|
+
# :enabled: true
|
125
|
+
|
126
|
+
# # report a metric per exception type raised
|
127
|
+
# :exception_specific:
|
128
|
+
# :enabled: false
|
129
|
+
|
130
|
+
# # "method_tracing" settings control hooking into Module and allowing
|
131
|
+
# # ruby methods to be timed
|
132
|
+
:method_tracer:
|
133
|
+
|
134
|
+
# # hook into Module with add_metrician_method_tracer added as a base
|
135
|
+
# # feature of every ruby object
|
136
|
+
# :enabled: true
|
data/metrician.gemspec
CHANGED
@@ -13,6 +13,7 @@ Gem::Specification.new do |s|
|
|
13
13
|
s.metadata = {
|
14
14
|
"source_code_uri" => "https://github.com/Instrumental/metrician-ruby"
|
15
15
|
}
|
16
|
+
s.required_ruby_version = '>= 2.0.0'
|
16
17
|
|
17
18
|
s.files = `git ls-files`.split("\n")
|
18
19
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/script/setup
CHANGED
@@ -15,7 +15,6 @@ brew list mysql > /dev/null 2>&1 || (
|
|
15
15
|
|
16
16
|
brew list postgresql > /dev/null 2>&1 || brew install postgresql
|
17
17
|
|
18
|
-
# TODO: Install all rubies in .travis
|
19
18
|
rbenv which ruby >/dev/null 2>&1 || (brew upgrade ruby-build || true; rbenv install)
|
20
19
|
|
21
20
|
# Setup rbenv so we can switch rubies below
|
@@ -43,7 +42,7 @@ for ruby_version in `ruby -ryaml -e 'puts YAML.load(File.read(".travis.yml"))["r
|
|
43
42
|
|
44
43
|
gem list -i gemika >/dev/null || gem install gemika
|
45
44
|
|
46
|
-
rake matrix:install
|
45
|
+
rake -t matrix:install
|
47
46
|
done
|
48
47
|
|
49
48
|
if ! psql postgres -tc "SELECT 1 FROM pg_database WHERE datname = 'metrician_test'" | grep -q 1; then
|
data/spec/metrician_spec.rb
CHANGED
@@ -10,12 +10,32 @@ end
|
|
10
10
|
RSpec.describe Metrician do
|
11
11
|
before(:each) do
|
12
12
|
Metrician.reset
|
13
|
+
ENV.delete("METRICIAN_CONFIG")
|
13
14
|
end
|
14
15
|
|
15
16
|
it "has a version number" do
|
16
17
|
Metrician::VERSION.should_not be nil
|
17
18
|
end
|
18
19
|
|
20
|
+
it "can load config from ENV" do
|
21
|
+
config = {request_timing: {enabled: "test value"}}
|
22
|
+
t = Tempfile.new("metrician_config")
|
23
|
+
t.write(config.to_yaml)
|
24
|
+
t.flush
|
25
|
+
ENV["METRICIAN_CONFIG"] = t.path
|
26
|
+
Metrician.reset
|
27
|
+
Metrician.configuration[:request_timing][:enabled].should == "test value"
|
28
|
+
end
|
29
|
+
|
30
|
+
specify "partially defined config shouldn't error" do
|
31
|
+
t = Tempfile.new("metrician_config")
|
32
|
+
t.write({request_timing: {enabled: true}}.to_yaml)
|
33
|
+
t.flush
|
34
|
+
ENV["METRICIAN_CONFIG"] = t.path
|
35
|
+
Metrician.reset
|
36
|
+
lambda { Metrician::Jobs.run? }.should_not raise_error
|
37
|
+
end
|
38
|
+
|
19
39
|
describe "Metrician.activate" do
|
20
40
|
it "takes an agent" do
|
21
41
|
# if this excepts, the world changed
|
@@ -70,8 +90,7 @@ RSpec.describe Metrician do
|
|
70
90
|
end
|
71
91
|
|
72
92
|
specify "per command and table instrumentation" do
|
73
|
-
Metrician.configuration[:database][:
|
74
|
-
Metrician.configuration[:database][:table][:enabled] = true
|
93
|
+
Metrician.configuration[:database][:command_and_table][:enabled] = true
|
75
94
|
@agent.stub(:gauge)
|
76
95
|
@agent.should_receive(:gauge).with("database.select.users", anything)
|
77
96
|
|
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.7
|
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-
|
11
|
+
date: 2017-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: instrumental_agent
|
@@ -114,7 +114,6 @@ files:
|
|
114
114
|
- METRICS.MD
|
115
115
|
- README.md
|
116
116
|
- Rakefile
|
117
|
-
- config/metrician.yaml
|
118
117
|
- gemfiles/Gemfile.4.2.sidekiq-4
|
119
118
|
- gemfiles/Gemfile.4.2.sidekiq-4.lock
|
120
119
|
- gemfiles/Gemfile.5.0.pg
|
@@ -140,6 +139,8 @@ files:
|
|
140
139
|
- lib/metrician/reporters/resque.rb
|
141
140
|
- lib/metrician/reporters/sidekiq.rb
|
142
141
|
- lib/metrician/version.rb
|
142
|
+
- metrician.defaults.yaml
|
143
|
+
- metrician.example.yaml
|
143
144
|
- metrician.gemspec
|
144
145
|
- script/setup
|
145
146
|
- script/test
|
@@ -166,7 +167,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
166
167
|
requirements:
|
167
168
|
- - ">="
|
168
169
|
- !ruby/object:Gem::Version
|
169
|
-
version:
|
170
|
+
version: 2.0.0
|
170
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
172
|
requirements:
|
172
173
|
- - ">="
|