canvas_statsd 1.0.5 → 1.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 59016469f4db4d82cf1461666d4d7454821dc900
4
- data.tar.gz: e45d90741f862de134f4e687d029e24f05f17856
3
+ metadata.gz: 88c09ebe7c39746f6df19a58da9a5edf13097cd7
4
+ data.tar.gz: eb620ecca522585ccef830258632c8a42dd40040
5
5
  SHA512:
6
- metadata.gz: e4604014954d5f4a9db66e4de69d6cc97d3fa740dc541558e8bf0f00e4e34a6f0200865ab4d1c3984e432b651932674560a798752aa6465fd2d2a923b46cc29a
7
- data.tar.gz: 3d8c4895afaecc1cd100124e0d69aa87a7df6532fc12c67e95350eaca225bd71053730e4d2ea4f33137e0d23c11492d6e666659b937388a837f73359dcef66c9
6
+ metadata.gz: bd1688d68e7891ff38f7dbc4594c30715cdc823a03d98ccc3ad94134c6f2dc68e896548c15b0d1555dfade7a572eb54b110410415a4af338f90e6aa4867902aa
7
+ data.tar.gz: c29c8778a1299b4be63a2b95f5cad2ee5a69c3c8562c74175570d805698620f499ffb941f32bedc283af6eb244b04eb4a3010328252cee43f5b7361551271a60
@@ -2,14 +2,16 @@ module CanvasStatsd
2
2
  class DefaultTracking
3
3
 
4
4
  @ar_counter = CanvasStatsd::Counter.new('ar_counter')
5
+ @cache_read_counter = CanvasStatsd::Counter.new('cache_read_counter')
5
6
  @sql_tracker = CanvasStatsd::SqlTracker.new(blocked_names: ['SCHEMA'])
6
7
 
7
8
  def self.track_default_metrics(options={})
8
- options = {sql: true, active_record: true, logger: nil}.merge(options)
9
+ options = {sql: true, active_record: true, cache: true, logger: nil}.merge(options)
9
10
  @logger = RequestLogger.new(options[:logger])
10
11
  track_timing
11
12
  track_sql if !!options[:sql]
12
13
  track_active_record if !!options[:active_record]
14
+ track_cache if !!options[:cache]
13
15
  end
14
16
 
15
17
  def self.subscribe type, &block
@@ -23,24 +25,30 @@ module CanvasStatsd
23
25
  end
24
26
 
25
27
  def self.track_timing
26
- subscribe(/start_processing.action_controller/) {|*args| start_processing(*args)}
27
- subscribe(/process_action.action_controller/) {|*args| finalize_processing(*args)}
28
+ subscribe(/start_processing\.action_controller/) {|*args| start_processing(*args)}
29
+ subscribe(/process_action\.action_controller/) {|*args| finalize_processing(*args)}
28
30
  end
29
31
 
30
32
  def self.track_sql
31
33
  @tracking_sql = true
32
- subscribe(/sql.active_record/) {|*args| update_sql_count(*args)}
34
+ subscribe(/sql\.active_record/) {|*args| update_sql_count(*args)}
33
35
  end
34
36
 
35
37
  def self.track_active_record
36
38
  instrument_active_record_creation
37
39
  @tracking_active_record = true
38
- subscribe(/instance.active_record/) {|*args| update_active_record_count(*args)}
40
+ subscribe(/instance\.active_record/) {|*args| update_active_record_count(*args)}
41
+ end
42
+
43
+ def self.track_cache
44
+ @tracking_cache = true
45
+ subscribe(/cache_read\.active_support/) {|*args| update_cache_read_count(*args)}
39
46
  end
40
47
 
41
48
  def self.start_processing *args
42
49
  @sql_tracker.start
43
50
  @ar_counter.start
51
+ @cache_read_counter.start
44
52
  end
45
53
 
46
54
  def self.update_sql_count name, start, finish, id, payload
@@ -51,12 +59,17 @@ module CanvasStatsd
51
59
  @ar_counter.track payload.fetch(:name, '')
52
60
  end
53
61
 
62
+ def self.update_cache_read_count name, start, finish, id, payload
63
+ @cache_read_counter.track "read"
64
+ end
65
+
54
66
  def self.finalize_processing *args
55
67
  request_stat = CanvasStatsd::RequestStat.new(*args)
56
68
  request_stat.ar_count = @ar_counter.finalize_count if @tracking_active_record
57
69
  request_stat.sql_read_count = @sql_tracker.num_reads if @tracking_sql
58
70
  request_stat.sql_write_count = @sql_tracker.num_writes if @tracking_sql
59
71
  request_stat.sql_cache_count = @sql_tracker.num_caches if @tracking_sql
72
+ request_stat.cache_read_count = @cache_read_counter.finalize_count if @tracking_cache
60
73
  request_stat.report
61
74
  @logger.log(request_stat)
62
75
  end
@@ -8,7 +8,8 @@ module CanvasStatsd
8
8
  sql_read: :sql_read_count,
9
9
  sql_write: :sql_write_count,
10
10
  sql_cache: :sql_cache_count,
11
- active_record: :ar_count
11
+ active_record: :ar_count,
12
+ cache_read: :cache_read_count,
12
13
  }.freeze
13
14
 
14
15
 
@@ -5,6 +5,7 @@ module CanvasStatsd
5
5
  attr_accessor :sql_write_count
6
6
  attr_accessor :sql_cache_count
7
7
  attr_accessor :ar_count
8
+ attr_accessor :cache_read_count
8
9
 
9
10
  def initialize(name, start, finish, id, payload, statsd=CanvasStatsd::Statsd)
10
11
  @name = name
@@ -25,6 +26,7 @@ module CanvasStatsd
25
26
  @statsd.timing("#{common_key}.sql.write", sql_write_count) if sql_write_count
26
27
  @statsd.timing("#{common_key}.sql.cache", sql_cache_count) if sql_cache_count
27
28
  @statsd.timing("#{common_key}.active_record", ar_count) if ar_count
29
+ @statsd.timing("#{common_key}.cache.read", cache_read_count) if cache_read_count
28
30
  end
29
31
  end
30
32
 
data/lib/canvas_statsd.rb CHANGED
@@ -2,6 +2,7 @@ require 'statsd'
2
2
  require "aroi" if defined?(ActiveRecord)
3
3
 
4
4
  module CanvasStatsd
5
+ VALID_SETTINGS = [:host, :port, :namespace, :append_hostname]
5
6
 
6
7
  class ConfigurationError < StandardError; end
7
8
 
@@ -18,7 +19,21 @@ module CanvasStatsd
18
19
  end
19
20
 
20
21
  def self.settings=(value)
21
- @settings = value
22
+ @settings = validate_settings(value)
23
+ end
24
+
25
+ def self.validate_settings(value)
26
+ return nil if value.nil?
27
+
28
+ validated = {}
29
+ value.each do |k,v|
30
+ if !VALID_SETTINGS.include?(k.to_sym)
31
+ raise CanvasStatsd::ConfigurationError, "Invalid key: #{k}"
32
+ end
33
+ validated[k.to_sym] = v
34
+ end
35
+
36
+ env_settings.merge(validated)
22
37
  end
23
38
 
24
39
  def self.env_settings(env=ENV)
@@ -38,7 +38,7 @@ describe CanvasStatsd do
38
38
  end
39
39
 
40
40
  it "can be assigned a new value" do
41
- settings = {foo: 'bar', baz: 'apple'}
41
+ settings = { host: 'bar', port: 1234 }
42
42
  CanvasStatsd.settings = settings
43
43
 
44
44
  expect(CanvasStatsd.settings).to eq settings
@@ -53,16 +53,28 @@ describe CanvasStatsd do
53
53
  namespace: 'canvas',
54
54
  }
55
55
  expect(CanvasStatsd.settings).to eq(expected)
56
-
57
56
  end
58
57
 
59
- it 'configured settings take precedence over ENV settings' do
58
+ it 'configured settings are merged into and take precedence over any existing ENV settings' do
60
59
  ENV['CANVAS_STATSD_HOST'] = 'statsd.example.org'
61
60
  ENV['CANVAS_STATSD_NAMESPACE'] = 'canvas'
62
61
 
63
- settings = {foo: 'bar', baz: 'apple'}
62
+ settings = { host: 'statsd.example-override.org' }
64
63
  CanvasStatsd.settings = settings
65
- expect(CanvasStatsd.settings).to eq settings
64
+
65
+ expect(CanvasStatsd.settings).to eq(CanvasStatsd.env_settings.merge(settings))
66
+ expect(CanvasStatsd.settings[:host]).to eq(settings[:host])
67
+ end
68
+
69
+ it 'validates settings' do
70
+ settings = { foo: 'blah' }
71
+ expect { CanvasStatsd.settings = settings }.to raise_error(CanvasStatsd::ConfigurationError)
72
+ end
73
+
74
+ it 'converts string keys to symbols' do
75
+ settings = { 'host' => 'bar', 'port' => 1234 }
76
+ CanvasStatsd.settings = settings
77
+ expect(CanvasStatsd.settings).to eq({ host: 'bar', port: 1234 })
66
78
  end
67
79
  end
68
80
 
@@ -21,6 +21,11 @@ describe CanvasStatsd::DefaultTracking do
21
21
  CanvasStatsd::DefaultTracking.track_default_metrics active_record: false
22
22
  end
23
23
 
24
+ it 'should not track cache when cache: false option' do
25
+ expect(CanvasStatsd::DefaultTracking).not_to receive(:track_cache)
26
+ CanvasStatsd::DefaultTracking.track_default_metrics cache: false
27
+ end
28
+
24
29
  it 'should delegate log messages to the optional logger' do
25
30
  log_double = double()
26
31
  expect(log_double).to receive(:info)
@@ -39,11 +44,10 @@ describe CanvasStatsd::DefaultTracking do
39
44
  describe '#subscribe' do
40
45
  it 'should subscribe via ActiveSupport::Notifications' do
41
46
  target = double()
42
- CanvasStatsd::DefaultTracking.subscribe(/test.notification/) {|*args| target.callback(*args)}
47
+ CanvasStatsd::DefaultTracking.subscribe(/test\.notification/) {|*args| target.callback(*args)}
43
48
  expect(target).to receive(:callback)
44
49
  ActiveSupport::Notifications.instrument('test.notification') {}
45
50
  end
46
51
  end
47
52
 
48
53
  end
49
-
@@ -19,15 +19,15 @@ describe CanvasStatsd::RequestLogger do
19
19
  end
20
20
  it 'includes stats that are available' do
21
21
  request_stat = double('request_stat')
22
- request_stat.stub(:ms).and_return(100.21)
23
- request_stat.stub(:ar_count).and_return(24)
22
+ allow(request_stat).to receive(:ms).and_return(100.21)
23
+ allow(request_stat).to receive(:ar_count).and_return(24)
24
24
  results = @logger.build_log_message(request_stat)
25
25
  expect(results).to eq("[STATSD] (total: 100.21) (active_record: 24.00)")
26
26
  end
27
27
  it 'doesnt include nil stats' do
28
28
  request_stat = double('request_stat')
29
- request_stat.stub(:ms).and_return(100.22)
30
- request_stat.stub(:ar_count).and_return(nil)
29
+ allow(request_stat).to receive(:ms).and_return(100.22)
30
+ allow(request_stat).to receive(:ar_count).and_return(nil)
31
31
  results = @logger.build_log_message(request_stat)
32
32
  expect(results).to eq("[STATSD] (total: 100.22)")
33
33
  end
@@ -35,16 +35,16 @@ describe CanvasStatsd::RequestLogger do
35
35
  describe 'decimal precision' do
36
36
  it 'forces 2 decimal precision' do
37
37
  request_stat = double('request_stat')
38
- request_stat.stub(:ms).and_return(72.1)
38
+ allow(request_stat).to receive(:ms).and_return(72.1)
39
39
  results = @logger.build_log_message(request_stat)
40
40
  expect(results).to eq("[STATSD] (total: 72.10)")
41
41
  end
42
42
  it 'rounds values to 2 decimals' do
43
43
  request_stat = double('request_stat')
44
- request_stat.stub(:ms).and_return(72.1382928)
44
+ allow(request_stat).to receive(:ms).and_return(72.1382928)
45
45
  results = @logger.build_log_message(request_stat)
46
46
  expect(results).to eq("[STATSD] (total: 72.14)")
47
- request_stat.stub(:ms).and_return(72.1348209)
47
+ allow(request_stat).to receive(:ms).and_return(72.1348209)
48
48
  results = @logger.build_log_message(request_stat)
49
49
  expect(results).to eq("[STATSD] (total: 72.13)")
50
50
  end
@@ -65,7 +65,7 @@ describe CanvasStatsd::RequestLogger do
65
65
  logger = CanvasStatsd::RequestLogger.new(std_out_logger)
66
66
  expect(std_out_logger).to receive(:info).with("[DEFAULT_METRICS] (total: 100.20)")
67
67
  request_stat = double('request_stat')
68
- request_stat.stub(:ms).and_return(100.2)
68
+ allow(request_stat).to receive(:ms).and_return(100.2)
69
69
  logger.log(request_stat, "DEFAULT_METRICS")
70
70
  end
71
71
  end
@@ -121,6 +121,16 @@ describe CanvasStatsd::RequestStat do
121
121
  rs.report
122
122
  end
123
123
 
124
+ it 'sends cache_read_count when present' do
125
+ statsd = double
126
+ payload = {
127
+ params: {
128
+ 'controller' => 'foo',
129
+ 'action' => 'index'
130
+ }
131
+ }
132
+ end
133
+
124
134
  describe 'sql stats' do
125
135
 
126
136
  before :each do
@@ -132,6 +142,8 @@ describe CanvasStatsd::RequestStat do
132
142
  }
133
143
  }
134
144
  @rs = create_subject(payload, @statsd)
145
+ @rs.cache_read_count = 25
146
+ expect(@statsd).to receive(:timing).with('request.foo.index.cache.read', 25)
135
147
  end
136
148
 
137
149
  it 'doesnt send sql stats when they dont exist' do
@@ -21,11 +21,16 @@ require 'spec_helper'
21
21
  describe CanvasStatsd::Statsd do
22
22
  METHODS = %w(increment decrement count gauge timing)
23
23
 
24
+ after do
25
+ CanvasStatsd.settings = {}
26
+ CanvasStatsd::Statsd.reset_instance
27
+ end
28
+
24
29
  it "appends the hostname to stat names by default" do
25
- CanvasStatsd::Statsd.stub(:hostname).and_return("testhost")
30
+ allow(CanvasStatsd::Statsd).to receive(:hostname).and_return("testhost")
26
31
  statsd = double
27
- CanvasStatsd::Statsd.stub(:instance).and_return(statsd)
28
- CanvasStatsd::Statsd.stub(:append_hostname?).and_return(true)
32
+ allow(CanvasStatsd::Statsd).to receive(:instance).and_return(statsd)
33
+ allow(CanvasStatsd::Statsd).to receive(:append_hostname?).and_return(true)
29
34
  METHODS.each do |method|
30
35
  expect(statsd).to receive(method).with("test.name.testhost", "test")
31
36
  CanvasStatsd::Statsd.send(method, "test.name", "test")
@@ -37,8 +42,8 @@ describe CanvasStatsd::Statsd do
37
42
  it "omits hostname if specified in config" do
38
43
  expect(CanvasStatsd::Statsd).to receive(:hostname).never
39
44
  statsd = double
40
- CanvasStatsd::Statsd.stub(:instance).and_return(statsd)
41
- CanvasStatsd::Statsd.stub(:append_hostname?).and_return(false)
45
+ allow(CanvasStatsd::Statsd).to receive(:instance).and_return(statsd)
46
+ allow(CanvasStatsd::Statsd).to receive(:append_hostname?).and_return(false)
42
47
  METHODS.each do |method|
43
48
  expect(statsd).to receive(method).with("test.name", "test")
44
49
  CanvasStatsd::Statsd.send(method, "test.name", "test")
@@ -48,7 +53,7 @@ describe CanvasStatsd::Statsd do
48
53
  end
49
54
 
50
55
  it "ignores all calls if statsd isn't enabled" do
51
- CanvasStatsd::Statsd.stub(:instance).and_return(nil)
56
+ allow(CanvasStatsd::Statsd).to receive(:instance).and_return(nil)
52
57
  METHODS.each do |method|
53
58
  expect(CanvasStatsd::Statsd.send(method, "test.name")).to be_nil
54
59
  end
@@ -87,8 +92,4 @@ describe CanvasStatsd::Statsd do
87
92
  expect(result).to eq hash
88
93
  end
89
94
  end
90
-
91
- after do
92
- CanvasStatsd::Statsd.reset_instance
93
- end
94
95
  end
data/spec/spec_helper.rb CHANGED
@@ -1,9 +1,10 @@
1
1
  require 'canvas_statsd'
2
2
 
3
3
  RSpec.configure do |config|
4
- config.treat_symbols_as_metadata_keys_with_true_values = true
5
4
  config.run_all_when_everything_filtered = true
6
5
  config.filter_run :focus
7
6
 
7
+ config.raise_errors_for_deprecations!
8
+
8
9
  config.order = 'random'
9
10
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: canvas_statsd
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Cloward
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-07-02 00:00:00.000000000 Z
12
+ date: 2016-11-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: statsd-ruby
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
128
128
  version: '0'
129
129
  requirements: []
130
130
  rubyforge_project:
131
- rubygems_version: 2.4.6
131
+ rubygems_version: 2.5.1
132
132
  signing_key:
133
133
  specification_version: 4
134
134
  summary: Statsd for Canvas
@@ -143,4 +143,3 @@ test_files:
143
143
  - spec/canvas_statsd/statsd_spec.rb
144
144
  - spec/spec_helper.rb
145
145
  - spec/support/test.log
146
- has_rdoc: