librato-rails 0.9.0 → 0.10.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/CHANGELOG.md +14 -0
  2. data/FAQ.md +25 -0
  3. data/README.md +11 -2
  4. data/lib/librato/rails/configuration.rb +26 -29
  5. data/lib/librato/rails/railtie.rb +30 -5
  6. data/lib/librato/rails/subscribers/cache.rb +22 -0
  7. data/lib/librato/rails/subscribers/controller.rb +56 -0
  8. data/lib/librato/rails/subscribers/mail.rb +18 -0
  9. data/lib/librato/rails/subscribers/render.rb +28 -0
  10. data/lib/librato/rails/subscribers/sql.rb +24 -0
  11. data/lib/librato/rails/subscribers.rb +14 -69
  12. data/lib/librato/rails/tracker.rb +13 -0
  13. data/lib/librato/rails/version.rb +1 -1
  14. data/lib/librato/rails.rb +9 -214
  15. data/test/dummy/app/assets/javascripts/application.js +0 -3
  16. data/test/dummy/app/controllers/cache_controller.rb +44 -0
  17. data/test/dummy/app/controllers/render_controller.rb +4 -0
  18. data/test/dummy/app/models/user.rb +7 -5
  19. data/test/dummy/app/views/render/_first.html.erb +1 -0
  20. data/test/dummy/app/views/render/_second.html.erb +1 -0
  21. data/test/dummy/app/views/render/partial.html.erb +2 -0
  22. data/test/dummy/app/views/render/template.html.erb +1 -0
  23. data/test/dummy/config/application.rb +8 -6
  24. data/test/dummy/config/environments/test.rb +1 -1
  25. data/test/dummy/config/routes.rb +12 -3
  26. data/test/integration/cache_test.rb +40 -0
  27. data/test/integration/mail_test.rb +2 -4
  28. data/test/integration/render_test.rb +27 -0
  29. data/test/integration/request_test.rb +15 -11
  30. data/test/integration/sql_test.rb +6 -6
  31. data/test/support/integration_case.rb +11 -7
  32. data/test/unit/configuration_test.rb +63 -73
  33. data/test/unit/tracker_test.rb +15 -0
  34. metadata +36 -53
  35. data/lib/librato/rack/middleware.rb +0 -47
  36. data/lib/librato/rack.rb +0 -4
  37. data/lib/librato/rails/aggregator.rb +0 -95
  38. data/lib/librato/rails/collector.rb +0 -45
  39. data/lib/librato/rails/counter_cache.rb +0 -122
  40. data/lib/librato/rails/group.rb +0 -27
  41. data/lib/librato/rails/logging.rb +0 -77
  42. data/lib/librato/rails/validating_queue.rb +0 -31
  43. data/lib/librato/rails/worker.rb +0 -54
  44. data/lib/tasks/metrics-rails_tasks.rake +0 -4
  45. data/test/librato-rails_test.rb +0 -44
  46. data/test/remote/rails_remote_test.rb +0 -193
  47. data/test/unit/aggregator_test.rb +0 -53
  48. data/test/unit/counter_cache_test.rb +0 -90
  49. data/test/unit/group_test.rb +0 -54
  50. data/test/unit/middleware_test.rb +0 -82
  51. data/test/unit/worker_test.rb +0 -31
@@ -1,85 +1,75 @@
1
1
  require 'test_helper'
2
2
 
3
- class LibratoRailsConfigTest < MiniTest::Unit::TestCase
3
+ module Librato
4
+ module Rails
5
+ class ConfigTest < MiniTest::Unit::TestCase
4
6
 
5
- def setup
6
- Librato::Rails.explicit_source = nil
7
- end
7
+ def teardown
8
+ ENV.delete('LIBRATO_USER')
9
+ ENV.delete('LIBRATO_TOKEN')
10
+ ENV.delete('LIBRATO_SOURCE')
11
+ # legacy
12
+ ENV.delete('LIBRATO_METRICS_USER')
13
+ ENV.delete('LIBRATO_METRICS_TOKEN')
14
+ ENV.delete('LIBRATO_METRICS_SOURCE')
15
+ end
8
16
 
9
- def teardown
10
- ENV.delete('LIBRATO_USER')
11
- ENV.delete('LIBRATO_TOKEN')
12
- ENV.delete('LIBRATO_SOURCE')
13
- # legacy
14
- ENV.delete('LIBRATO_METRICS_USER')
15
- ENV.delete('LIBRATO_METRICS_TOKEN')
16
- ENV.delete('LIBRATO_METRICS_SOURCE')
17
- Librato::Rails.check_config
18
- Librato::Rails.prefix = nil
19
- Librato::Rails.explicit_source = nil
20
- end
17
+ def test_environmental_variable_config
18
+ ENV['LIBRATO_USER'] = 'foo@bar.com'
19
+ ENV['LIBRATO_TOKEN'] = 'api_key'
20
+ ENV['LIBRATO_SOURCE'] = 'source'
21
+ config = Configuration.new
22
+ assert_equal 'foo@bar.com', config.user
23
+ assert_equal 'api_key', config.token
24
+ assert_equal 'source', config.source
25
+ assert config.explicit_source?, 'source is explicit'
26
+ end
21
27
 
22
- def test_environmental_variable_config
23
- ENV['LIBRATO_USER'] = 'foo@bar.com'
24
- ENV['LIBRATO_TOKEN'] = 'api_key'
25
- ENV['LIBRATO_SOURCE'] = 'source'
26
- Librato::Rails.check_config
27
- assert_equal 'foo@bar.com', Librato::Rails.user
28
- assert_equal 'api_key', Librato::Rails.token
29
- assert_equal 'source', Librato::Rails.source
30
- assert Librato::Rails.explicit_source, 'source is explicit'
31
- end
28
+ def test_legacy_env_variable_config
29
+ ENV['LIBRATO_METRICS_USER'] = 'foo@bar.com'
30
+ ENV['LIBRATO_METRICS_TOKEN'] = 'api_key'
31
+ ENV['LIBRATO_METRICS_SOURCE'] = 'source'
32
+ config = Configuration.new
33
+ assert_equal 'foo@bar.com', config.user
34
+ assert_equal 'api_key', config.token
35
+ assert_equal 'source', config.source
36
+ assert config.explicit_source?, 'source is explicit'
37
+ end
32
38
 
33
- def test_legacy_env_variable_config
34
- ENV['LIBRATO_METRICS_USER'] = 'foo@bar.com'
35
- ENV['LIBRATO_METRICS_TOKEN'] = 'api_key'
36
- ENV['LIBRATO_METRICS_SOURCE'] = 'source'
37
- Librato::Rails.check_config
38
- assert_equal 'foo@bar.com', Librato::Rails.user
39
- assert_equal 'api_key', Librato::Rails.token
40
- assert_equal 'source', Librato::Rails.source
41
- assert Librato::Rails.explicit_source, 'source is explicit'
42
- end
39
+ def test_config_file_config
40
+ config = fixture_config
41
+ assert_equal 'test@bar.com', config.user
42
+ assert_equal 'test api key', config.token
43
+ assert_equal 'rails-test', config.prefix
44
+ assert_equal 30, config.flush_interval
45
+ assert_equal 'custom-1', config.source
46
+ assert_equal false, config.source_pids
47
+ assert config.explicit_source?, 'source is explicit'
48
+ end
43
49
 
44
- def test_config_file_config
45
- with_fixture_config do
46
- assert_equal 'test@bar.com', Librato::Rails.user
47
- assert_equal 'test api key', Librato::Rails.token
48
- assert_equal 'rails-test', Librato::Rails.prefix
49
- assert_equal 30, Librato::Rails.flush_interval
50
- assert_equal 'custom-1', Librato::Rails.source
51
- assert_equal false, Librato::Rails.source_pids
52
- assert Librato::Rails.explicit_source, 'source is explicit'
53
- end
54
- end
50
+ def test_implicit_source
51
+ config = fixture_config('simple')
52
+ assert_equal 'test@bar.com', config.user
53
+ assert_equal 'test api key', config.token
54
+ assert !config.explicit_source?, 'source is not explicit'
55
+ end
55
56
 
56
- def test_implicit_source
57
- with_fixture_config('simple') do
58
- assert_equal 'test@bar.com', Librato::Rails.user
59
- assert_equal 'test api key', Librato::Rails.token
60
- assert !Librato::Rails.explicit_source, 'source is not explicit'
61
- end
62
- end
57
+ def test_environmental_and_config_file_config
58
+ ENV['LIBRATO_METRICS_USER'] = 'foo@bar.com'
59
+ ENV['LIBRATO_METRICS_TOKEN'] = 'api_key'
60
+ ENV['LIBRATO_METRICS_SOURCE'] = 'source'
61
+ config = fixture_config
62
+ assert_equal 'test@bar.com', config.user # from config file
63
+ assert_equal 'test api key', config.token # from config file
64
+ assert_equal 'rails-test', config.prefix # from config file
65
+ assert_equal 30, config.flush_interval # from config file
66
+ end
63
67
 
64
- def test_environmental_and_config_file_config
65
- ENV['LIBRATO_METRICS_USER'] = 'foo@bar.com'
66
- ENV['LIBRATO_METRICS_TOKEN'] = 'api_key'
67
- ENV['LIBRATO_METRICS_SOURCE'] = 'source'
68
- with_fixture_config do
69
- assert_equal 'test@bar.com', Librato::Rails.user # from config file
70
- assert_equal 'test api key', Librato::Rails.token # from config file
71
- assert_equal 'rails-test', Librato::Rails.prefix # from config file
72
- assert_equal 30, Librato::Rails.flush_interval # from config file
73
- end
74
- end
68
+ def fixture_config(file='librato')
69
+ fixture_config = File.join(File.dirname(__FILE__), "../fixtures/config/#{file}.yml")
70
+ Configuration.new(:config_file => fixture_config)
71
+ end
75
72
 
76
- def with_fixture_config(file='librato')
77
- fixture_config = File.join(File.dirname(__FILE__), "../fixtures/config/#{file}.yml")
78
- previous, Librato::Rails.config_file = Librato::Rails.config_file, fixture_config
79
- Librato::Rails.check_config
80
- yield
81
- ensure
82
- Librato::Rails.config_file = previous
73
+ end
83
74
  end
84
-
85
75
  end
@@ -0,0 +1,15 @@
1
+ require 'test_helper'
2
+
3
+ module Librato
4
+ module Rails
5
+ class TrackerTest < MiniTest::Unit::TestCase
6
+
7
+ def test_user_agent
8
+ config = Configuration.new
9
+ tracker = Tracker.new(config)
10
+ assert_match /librato\-rails/, tracker.send(:user_agent)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: librato-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
5
- prerelease:
4
+ version: 0.10.0.pre1
5
+ prerelease: 7
6
6
  platform: ruby
7
7
  authors:
8
8
  - Matt Sanders
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-15 00:00:00.000000000 Z
12
+ date: 2013-08-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -28,13 +28,13 @@ dependencies:
28
28
  - !ruby/object:Gem::Version
29
29
  version: '3.0'
30
30
  - !ruby/object:Gem::Dependency
31
- name: librato-metrics
31
+ name: librato-rack
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
35
  - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: 1.1.0
37
+ version: 0.4.1
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
@@ -42,7 +42,7 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: 1.1.0
45
+ version: 0.4.1
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: sqlite3
48
48
  requirement: !ruby/object:Gem::Requirement
@@ -75,22 +75,6 @@ dependencies:
75
75
  - - ~>
76
76
  - !ruby/object:Gem::Version
77
77
  version: 2.0.3
78
- - !ruby/object:Gem::Dependency
79
- name: minitest
80
- requirement: !ruby/object:Gem::Requirement
81
- none: false
82
- requirements:
83
- - - ~>
84
- - !ruby/object:Gem::Version
85
- version: 3.4.0
86
- type: :development
87
- prerelease: false
88
- version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
- requirements:
91
- - - ~>
92
- - !ruby/object:Gem::Version
93
- version: 3.4.0
94
78
  description: Report key app statistics to the Librato Metrics service and easily track
95
79
  your own custom metrics.
96
80
  email:
@@ -99,26 +83,23 @@ executables: []
99
83
  extensions: []
100
84
  extra_rdoc_files: []
101
85
  files:
102
- - lib/librato/rack/middleware.rb
103
- - lib/librato/rack.rb
104
- - lib/librato/rails/aggregator.rb
105
- - lib/librato/rails/collector.rb
106
86
  - lib/librato/rails/configuration.rb
107
- - lib/librato/rails/counter_cache.rb
108
- - lib/librato/rails/group.rb
109
- - lib/librato/rails/logging.rb
110
87
  - lib/librato/rails/railtie.rb
88
+ - lib/librato/rails/subscribers/cache.rb
89
+ - lib/librato/rails/subscribers/controller.rb
90
+ - lib/librato/rails/subscribers/mail.rb
91
+ - lib/librato/rails/subscribers/render.rb
92
+ - lib/librato/rails/subscribers/sql.rb
111
93
  - lib/librato/rails/subscribers.rb
112
- - lib/librato/rails/validating_queue.rb
94
+ - lib/librato/rails/tracker.rb
113
95
  - lib/librato/rails/version.rb
114
- - lib/librato/rails/worker.rb
115
96
  - lib/librato/rails.rb
116
97
  - lib/librato-rails.rb
117
- - lib/tasks/metrics-rails_tasks.rake
118
98
  - LICENSE
119
99
  - Rakefile
120
100
  - README.md
121
101
  - CHANGELOG.md
102
+ - FAQ.md
122
103
  - test/dummy/app/assets/javascripts/application.js
123
104
  - test/dummy/app/assets/javascripts/home.js
124
105
  - test/dummy/app/assets/javascripts/status.js
@@ -126,7 +107,9 @@ files:
126
107
  - test/dummy/app/assets/stylesheets/home.css
127
108
  - test/dummy/app/assets/stylesheets/status.css
128
109
  - test/dummy/app/controllers/application_controller.rb
110
+ - test/dummy/app/controllers/cache_controller.rb
129
111
  - test/dummy/app/controllers/home_controller.rb
112
+ - test/dummy/app/controllers/render_controller.rb
130
113
  - test/dummy/app/controllers/status_controller.rb
131
114
  - test/dummy/app/controllers/user_controller.rb
132
115
  - test/dummy/app/helpers/application_helper.rb
@@ -136,6 +119,10 @@ files:
136
119
  - test/dummy/app/models/user.rb
137
120
  - test/dummy/app/views/home/index.html.erb
138
121
  - test/dummy/app/views/layouts/application.html.erb
122
+ - test/dummy/app/views/render/_first.html.erb
123
+ - test/dummy/app/views/render/_second.html.erb
124
+ - test/dummy/app/views/render/partial.html.erb
125
+ - test/dummy/app/views/render/template.html.erb
139
126
  - test/dummy/app/views/status/code.html.erb
140
127
  - test/dummy/app/views/user_mailer/welcome_email.text.erb
141
128
  - test/dummy/config/application.rb
@@ -167,22 +154,19 @@ files:
167
154
  - test/dummy/script/rails
168
155
  - test/fixtures/config/librato.yml
169
156
  - test/fixtures/config/simple.yml
157
+ - test/integration/cache_test.rb
170
158
  - test/integration/custom_test.rb
171
159
  - test/integration/mail_test.rb
160
+ - test/integration/render_test.rb
172
161
  - test/integration/request_test.rb
173
162
  - test/integration/sql_test.rb
174
- - test/librato-rails_test.rb
175
- - test/remote/rails_remote_test.rb
176
163
  - test/support/integration_case.rb
177
164
  - test/test_helper.rb
178
- - test/unit/aggregator_test.rb
179
165
  - test/unit/configuration_test.rb
180
- - test/unit/counter_cache_test.rb
181
- - test/unit/group_test.rb
182
- - test/unit/middleware_test.rb
183
- - test/unit/worker_test.rb
166
+ - test/unit/tracker_test.rb
184
167
  homepage: https://github.com/librato/librato-rails
185
- licenses: []
168
+ licenses:
169
+ - BSD 3-clause
186
170
  post_install_message:
187
171
  rdoc_options: []
188
172
  require_paths:
@@ -195,16 +179,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
195
179
  version: '0'
196
180
  segments:
197
181
  - 0
198
- hash: 928415932724141645
182
+ hash: -1394071796353976924
199
183
  required_rubygems_version: !ruby/object:Gem::Requirement
200
184
  none: false
201
185
  requirements:
202
- - - ! '>='
186
+ - - ! '>'
203
187
  - !ruby/object:Gem::Version
204
- version: '0'
205
- segments:
206
- - 0
207
- hash: 928415932724141645
188
+ version: 1.3.1
208
189
  requirements: []
209
190
  rubyforge_project:
210
191
  rubygems_version: 1.8.23
@@ -219,7 +200,9 @@ test_files:
219
200
  - test/dummy/app/assets/stylesheets/home.css
220
201
  - test/dummy/app/assets/stylesheets/status.css
221
202
  - test/dummy/app/controllers/application_controller.rb
203
+ - test/dummy/app/controllers/cache_controller.rb
222
204
  - test/dummy/app/controllers/home_controller.rb
205
+ - test/dummy/app/controllers/render_controller.rb
223
206
  - test/dummy/app/controllers/status_controller.rb
224
207
  - test/dummy/app/controllers/user_controller.rb
225
208
  - test/dummy/app/helpers/application_helper.rb
@@ -229,6 +212,10 @@ test_files:
229
212
  - test/dummy/app/models/user.rb
230
213
  - test/dummy/app/views/home/index.html.erb
231
214
  - test/dummy/app/views/layouts/application.html.erb
215
+ - test/dummy/app/views/render/_first.html.erb
216
+ - test/dummy/app/views/render/_second.html.erb
217
+ - test/dummy/app/views/render/partial.html.erb
218
+ - test/dummy/app/views/render/template.html.erb
232
219
  - test/dummy/app/views/status/code.html.erb
233
220
  - test/dummy/app/views/user_mailer/welcome_email.text.erb
234
221
  - test/dummy/config/application.rb
@@ -260,17 +247,13 @@ test_files:
260
247
  - test/dummy/script/rails
261
248
  - test/fixtures/config/librato.yml
262
249
  - test/fixtures/config/simple.yml
250
+ - test/integration/cache_test.rb
263
251
  - test/integration/custom_test.rb
264
252
  - test/integration/mail_test.rb
253
+ - test/integration/render_test.rb
265
254
  - test/integration/request_test.rb
266
255
  - test/integration/sql_test.rb
267
- - test/librato-rails_test.rb
268
- - test/remote/rails_remote_test.rb
269
256
  - test/support/integration_case.rb
270
257
  - test/test_helper.rb
271
- - test/unit/aggregator_test.rb
272
258
  - test/unit/configuration_test.rb
273
- - test/unit/counter_cache_test.rb
274
- - test/unit/group_test.rb
275
- - test/unit/middleware_test.rb
276
- - test/unit/worker_test.rb
259
+ - test/unit/tracker_test.rb
@@ -1,47 +0,0 @@
1
- class Librato::Rack::Middleware
2
- def initialize(app, metrics = Librato::Rails)
3
- @app, @metrics = app, metrics
4
- end
5
-
6
- def call(env)
7
- @metrics.check_worker
8
-
9
- header_metrics env
10
-
11
- time = Time.now
12
- response = @app.call(env)
13
- duration = (Time.now - time) * 1000.0
14
-
15
- request_metrics response.first, duration
16
-
17
- response
18
- end
19
-
20
- private
21
-
22
- def header_metrics(env)
23
- return unless env.keys.include?('HTTP_X_HEROKU_QUEUE_DEPTH')
24
-
25
- @metrics.group 'rack.heroku' do |group|
26
- group.measure 'queue.depth', env['HTTP_X_HEROKU_QUEUE_DEPTH'].to_f
27
- group.timing 'queue.wait_time', env['HTTP_X_HEROKU_QUEUE_WAIT_TIME'].to_f
28
- group.measure 'queue.dynos', env['HTTP_X_HEROKU_DYNOS_IN_USE'].to_f
29
- end
30
- end
31
-
32
- def request_metrics(status, duration)
33
- @metrics.group 'rack.request' do |group|
34
- group.increment 'total'
35
- group.timing 'time', duration
36
- group.increment 'slow' if duration > 200.0
37
-
38
- group.group 'status' do |s|
39
- s.increment status
40
- s.increment "#{status.to_s[0]}xx"
41
-
42
- s.timing "#{status}.time", duration
43
- s.timing "#{status.to_s[0]}xx.time", duration
44
- end
45
- end
46
- end
47
- end
data/lib/librato/rack.rb DELETED
@@ -1,4 +0,0 @@
1
- module Librato::Rack
2
- end
3
-
4
- require 'librato/rack/middleware'
@@ -1,95 +0,0 @@
1
- module Librato
2
- module Rails
3
- class Aggregator
4
- extend Forwardable
5
-
6
- def_delegators :@cache, :empty?, :prefix, :prefix=
7
-
8
- def initialize(options={})
9
- @cache = Librato::Metrics::Aggregator.new(:prefix => options[:prefix])
10
- @lock = Mutex.new
11
- end
12
-
13
- def [](key)
14
- fetch(key)
15
- end
16
-
17
- def fetch(key, options={})
18
- return nil if @cache.empty?
19
- gauges = nil
20
- source = options[:source]
21
- @lock.synchronize { gauges = @cache.queued[:gauges] }
22
- gauges.each do |metric|
23
- if metric[:name] == key.to_s
24
- return metric if !source && !metric[:source]
25
- return metric if source.to_s == metric[:source]
26
- end
27
- end
28
- nil
29
- end
30
-
31
- def delete_all
32
- @lock.synchronize { @cache.clear }
33
- end
34
-
35
- # transfer all measurements to queue and reset internal status
36
- def flush_to(queue, options={})
37
- queued = nil
38
- @lock.synchronize do
39
- return if @cache.empty?
40
- queued = @cache.queued
41
- @cache.clear
42
- end
43
- queue.merge!(queued) if queued
44
- end
45
-
46
- # @example Simple measurement
47
- # measure 'sources_returned', sources.length
48
- #
49
- # @example Simple timing in milliseconds
50
- # timing 'twitter.lookup', 2.31
51
- #
52
- # @example Block-based timing
53
- # timing 'db.query' do
54
- # do_my_query
55
- # end
56
- #
57
- # @example Custom source
58
- # measure 'user.all_orders', user.order_count, :source => user.id
59
- #
60
- def measure(*args, &block)
61
- options = {}
62
- event = args[0].to_s
63
- returned = nil
64
-
65
- # handle block or specified argument
66
- if block_given?
67
- start = Time.now
68
- returned = yield
69
- value = ((Time.now - start) * 1000.0).to_i
70
- elsif args[1]
71
- value = args[1]
72
- else
73
- raise "no value provided"
74
- end
75
-
76
- # detect options hash if present
77
- if args.length > 1 and args[-1].respond_to?(:each)
78
- options = args[-1]
79
- end
80
- source = options[:source]
81
-
82
- @lock.synchronize do
83
- if source
84
- @cache.add event => {:source => source, :value => value}
85
- else
86
- @cache.add event => value
87
- end
88
- end
89
- returned
90
- end
91
- alias :timing :measure
92
-
93
- end
94
- end
95
- end
@@ -1,45 +0,0 @@
1
-
2
- # an abstract collector object which can be given measurement values
3
- # and can periodically report those values back to the Metrics service
4
-
5
- module Librato
6
- module Rails
7
- class Collector
8
- extend Forwardable
9
-
10
- def_delegators :counters, :increment
11
- def_delegators :aggregate, :measure, :timing
12
-
13
- # access to internal aggregator object
14
- def aggregate
15
- @aggregator_cache ||= Aggregator.new(:prefix => @prefix)
16
- end
17
-
18
- # access to internal counters object
19
- def counters
20
- @counter_cache ||= CounterCache.new
21
- end
22
-
23
- # remove any accumulated but unsent metrics
24
- def delete_all
25
- aggregate.delete_all
26
- counters.delete_all
27
- end
28
-
29
- def group(prefix)
30
- group = Group.new(prefix)
31
- yield group
32
- end
33
-
34
- # update prefix
35
- def prefix=(new_prefix)
36
- @prefix = new_prefix
37
- aggregate.prefix = @prefix
38
- end
39
-
40
- def prefix
41
- @prefix
42
- end
43
- end
44
- end
45
- end
@@ -1,122 +0,0 @@
1
- module Librato
2
- module Rails
3
-
4
- class CounterCache
5
- DEFAULT_SOURCE = '%%'
6
-
7
- extend Forwardable
8
-
9
- def_delegators :@cache, :empty?
10
-
11
- def initialize
12
- @cache = {}
13
- @lock = Mutex.new
14
- @sporadics = {}
15
- end
16
-
17
- # Retrieve the current value for a given metric. This is a short
18
- # form for convenience which only retrieves metrics with no custom
19
- # source specified. For more options see #fetch.
20
- #
21
- # @param [String|Symbol] key metric name
22
- # @return [Integer|Float] current value
23
- def [](key)
24
- @lock.synchronize do
25
- @cache[key.to_s][DEFAULT_SOURCE]
26
- end
27
- end
28
-
29
- # removes all tracked metrics. note this removes all measurement
30
- # data AND metric names any continuously tracked metrics will not
31
- # report until they get another measurement
32
- def delete_all
33
- @lock.synchronize { @cache.clear }
34
- end
35
-
36
-
37
- def fetch(key, options={})
38
- source = DEFAULT_SOURCE
39
- if options[:source]
40
- source = options[:source].to_s
41
- end
42
- @lock.synchronize do
43
- return nil unless @cache[key.to_s]
44
- @cache[key.to_s][source]
45
- end
46
- end
47
-
48
- # transfer all measurements to queue and reset internal status
49
- def flush_to(queue)
50
- counts = nil
51
- @lock.synchronize do
52
- # work off of a duplicate data set so we block for
53
- # as little time as possible
54
- counts = Marshal.load(Marshal.dump(@cache))
55
- reset_cache
56
- end
57
- counts.each do |key, data|
58
- data.each do |source, value|
59
- if source == DEFAULT_SOURCE
60
- queue.add key => value
61
- else
62
- queue.add key => {:value => value, :source => source}
63
- end
64
- end
65
- end
66
- end
67
-
68
- # Increment a given metric
69
- #
70
- # @example Increment metric 'foo' by 1
71
- # increment :foo
72
- #
73
- # @example Increment metric 'bar' by 2
74
- # increment :bar, :by => 2
75
- #
76
- # @example Increment metric 'foo' by 1 with a custom source
77
- # increment :foo, :source => user.id
78
- #
79
- def increment(counter, options={})
80
- counter = counter.to_s
81
- if options.is_a?(Fixnum)
82
- # suppport legacy style
83
- options = {:by => options}
84
- end
85
- by = options[:by] || 1
86
- source = DEFAULT_SOURCE
87
- if options[:source]
88
- source = options[:source].to_s
89
- end
90
- if options[:sporadic]
91
- make_sporadic(counter, source)
92
- end
93
- @lock.synchronize do
94
- @cache[counter] ||= {}
95
- @cache[counter][source] ||= 0
96
- @cache[counter][source] += by
97
- end
98
- end
99
-
100
- private
101
-
102
- def make_sporadic(metric, source)
103
- @sporadics[metric] ||= Set.new
104
- @sporadics[metric] << source
105
- end
106
-
107
- def reset_cache
108
- # remove any source/metric pairs that aren't continuous
109
- @sporadics.each do |key, sources|
110
- sources.each { |source| @cache[key].delete(source) }
111
- end
112
- @sporadics.clear
113
- # reset all continuous source/metric pairs to 0
114
- @cache.each_key do |key|
115
- @cache[key].each_key { |source| @cache[key][source] = 0 }
116
- end
117
- end
118
-
119
- end
120
-
121
- end
122
- end