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,27 +0,0 @@
1
- module Librato
2
- module Rails
3
- class Group
4
-
5
- def initialize(prefix)
6
- @prefix = "#{prefix}."
7
- end
8
-
9
- def group(prefix)
10
- prefix = "#{@prefix}#{prefix}"
11
- yield self.class.new(prefix)
12
- end
13
-
14
- def increment(counter, by=1)
15
- counter = "#{@prefix}#{counter}"
16
- Librato::Rails.increment counter, by
17
- end
18
-
19
- def measure(event, duration)
20
- event = "#{@prefix}#{event}"
21
- Librato::Rails.measure event, duration
22
- end
23
- alias :timing :measure
24
-
25
- end
26
- end
27
- end
@@ -1,77 +0,0 @@
1
- module Librato::Rails
2
- module Logging
3
- LOG_LEVELS = [:off, :error, :warn, :info, :debug, :trace]
4
-
5
- attr_writer :logger
6
-
7
- # ex: log :debug, 'this is a debug message'
8
- def log(level, message)
9
- return unless should_log?(level)
10
- case level
11
- when :error, :warn
12
- method = level
13
- else
14
- method = :info
15
- end
16
- message = '[librato-rails] ' << message
17
- logger.send(method, message)
18
- end
19
-
20
- # set log level to any of LOG_LEVELS
21
- def log_level=(level)
22
- level = level.to_sym
23
- if LOG_LEVELS.index(level)
24
- @log_level = level
25
- require 'pp' if should_log?(:debug)
26
- else
27
- raise "Invalid log level '#{level}'"
28
- end
29
- end
30
-
31
- def log_level
32
- @log_level ||= :info
33
- end
34
-
35
- def logger
36
- @logger ||= if on_heroku
37
- logger = Logger.new(STDOUT)
38
- logger.level = Logger::INFO
39
- logger
40
- else
41
- ::Rails.logger
42
- end
43
- end
44
-
45
- private
46
-
47
- def should_log?(level)
48
- LOG_LEVELS.index(self.log_level) >= LOG_LEVELS.index(level)
49
- end
50
-
51
- # trace current environment
52
- def trace_environment
53
- log :info, "Environment: " + ENV.pretty_inspect
54
- end
55
-
56
- # trace metrics being sent
57
- def trace_queued(queued)
58
- log :trace, "Queued: " + queued.pretty_inspect
59
- end
60
-
61
- def trace_settings
62
- settings = {
63
- :user => self.user,
64
- :token => self.token,
65
- :source => source,
66
- :explicit_source => self.explicit_source ? 'true' : 'false',
67
- :source_pids => self.source_pids ? 'true' : 'false',
68
- :qualified_source => qualified_source,
69
- :log_level => log_level,
70
- :prefix => prefix,
71
- :flush_interval => self.flush_interval
72
- }
73
- log :info, 'Settings: ' + settings.pretty_inspect
74
- end
75
-
76
- end
77
- end
@@ -1,31 +0,0 @@
1
- # this functionality should probably be available in librato-metrics
2
- # eventually, spiking here for now to work out the kinks
3
- module Librato
4
- module Rails
5
- class ValidatingQueue < Librato::Metrics::Queue
6
- LOGGER = Librato::Rails
7
- METRIC_NAME_REGEX = /\A[-.:_\w]{1,255}\z/
8
- SOURCE_NAME_REGEX = /\A[-:A-Za-z0-9_.]{1,255}\z/
9
-
10
- # screen all measurements for validity before sending
11
- def submit
12
- @queued[:gauges].delete_if do |entry|
13
- name = entry[:name].to_s
14
- source = entry[:source] && entry[:source].to_s
15
- if name !~ METRIC_NAME_REGEX
16
- LOGGER.log :warn, "invalid metric name '#{name}', not sending."
17
- true # delete
18
- elsif source && source !~ SOURCE_NAME_REGEX
19
- LOGGER.log :warn, "invalid source name '#{source}', not sending."
20
- true # delete
21
- else
22
- false # preserve
23
- end
24
- end
25
-
26
- super
27
- end
28
-
29
- end
30
- end
31
- end
@@ -1,54 +0,0 @@
1
- module Librato
2
- module Rails
3
-
4
- # This class manages the background thread which submits all data
5
- # to the Librato Metrics service.
6
- class Worker
7
-
8
- def initialize
9
- @interrupt = false
10
- end
11
-
12
- # do the assigned work, catching some special cases
13
- #
14
- def execute(obj)
15
- obj.call
16
- end
17
-
18
- # run the given block every <period> seconds, looping
19
- # infinitely unless @interrupt becomes true.
20
- #
21
- def run_periodically(period, &block)
22
- next_run = start_time(period)
23
- until @interrupt do
24
- now = Time.now
25
- if now >= next_run
26
- execute(block) # runs given block
27
- while next_run <= now
28
- next_run += period
29
- end
30
- else
31
- sleep(next_run - now)
32
- end
33
- end
34
- end
35
-
36
- # Give some structure to worker start times so when possible
37
- # they will be in sync.
38
- def start_time(period)
39
- earliest = Time.now + period
40
- # already on a whole minute
41
- return earliest if earliest.sec == 0
42
- if period > 30
43
- # bump to whole minute
44
- earliest + (60-earliest.sec)
45
- else
46
- # ensure sync to whole minute if minute is evenly divisible
47
- earliest + (period-(earliest.sec%period))
48
- end
49
- end
50
-
51
- end
52
-
53
- end
54
- end
@@ -1,4 +0,0 @@
1
- # desc "Explaining what the task does"
2
- # task :librato-rails do
3
- # # Task goes here
4
- # end
@@ -1,44 +0,0 @@
1
- require 'test_helper'
2
-
3
- class LibratoRailsTest < ActiveSupport::TestCase
4
-
5
- test 'is a module' do
6
- assert_kind_of Module, Librato::Rails
7
- end
8
-
9
- test 'client is available' do
10
- assert_kind_of Librato::Metrics::Client, Librato::Rails.client
11
- end
12
-
13
- test '#increment exists' do
14
- assert Librato::Rails.respond_to?(:increment)
15
- Librato::Rails.increment :baz, 5
16
- end
17
-
18
- test '#measure exists' do
19
- assert Librato::Rails.respond_to?(:measure)
20
- Librato::Rails.measure 'queries', 10
21
- end
22
-
23
- test '#timing exists' do
24
- assert Librato::Rails.respond_to?(:timing)
25
- Librato::Rails.timing 'request.time.total', 121.2
26
- end
27
-
28
- test 'source is assignable' do
29
- original = Librato::Rails.source
30
- Librato::Rails.source = 'foobar'
31
- assert_equal 'foobar', Librato::Rails.source
32
- Librato::Rails.source = original
33
- end
34
-
35
- test 'qualified source includes pid' do
36
- assert_match /\.\d{2,6}$/, Librato::Rails.qualified_source
37
- end
38
-
39
- test 'qualified source does not include pid when disabled' do
40
- Librato::Rails.source_pids = false
41
- assert_match Librato::Rails.source, Librato::Rails.qualified_source
42
- Librato::Rails.source_pids = true
43
- end
44
- end
@@ -1,193 +0,0 @@
1
- # encoding: UTF-8
2
- require 'test_helper'
3
-
4
- class LibratoRailsRemoteTest < ActiveSupport::TestCase
5
-
6
- # These tests connect to the Metrics server with an account and verify remote
7
- # functions. They will only run if the below environment variables are set.
8
- #
9
- # BE CAREFUL, running these tests will DELETE ALL metrics currently in the
10
- # test account.
11
- #
12
- if ENV['LIBRATO_RAILS_TEST_EMAIL'] && ENV['LIBRATO_RAILS_TEST_API_KEY']
13
-
14
- setup do
15
- # delete any generated Librato::Rails
16
- Librato::Rails.user = ENV['LIBRATO_RAILS_TEST_EMAIL']
17
- Librato::Rails.token = ENV['LIBRATO_RAILS_TEST_API_KEY']
18
- if ENV['LIBRATO_RAILS_TEST_API_ENDPOINT']
19
- Librato::Rails.api_endpoint = ENV['LIBRATO_RAILS_TEST_API_ENDPOINT']
20
- end
21
- Librato::Rails.delete_all
22
- delete_all_metrics
23
- end
24
-
25
- teardown do
26
- Librato::Rails.prefix = nil
27
- end
28
-
29
- test 'flush sends counters' do
30
- source = Librato::Rails.qualified_source
31
-
32
- Librato::Rails.increment :foo
33
- Librato::Rails.increment :bar, 2
34
- Librato::Rails.increment :foo
35
- Librato::Rails.increment :foo, :source => 'baz', :by => 3
36
- Librato::Rails.flush
37
-
38
- client = Librato::Rails.client
39
- metric_names = client.list.map { |m| m['name'] }
40
- assert metric_names.include?('foo'), 'foo should be present'
41
- assert metric_names.include?('bar'), 'bar should be present'
42
-
43
- foo = client.fetch 'foo', :count => 10
44
- assert_equal 1, foo[source].length
45
- assert_equal 2, foo[source][0]['value']
46
-
47
- # custom source
48
- assert_equal 1, foo['baz'].length
49
- assert_equal 3, foo['baz'][0]['value']
50
-
51
- bar = client.fetch 'bar', :count => 10
52
- assert_equal 1, bar[source].length
53
- assert_equal 2, bar[source][0]['value']
54
- end
55
-
56
- test 'counters should persist through flush' do
57
- Librato::Rails.increment 'knightrider'
58
- Librato::Rails.increment 'badguys', :sporadic => true
59
- assert_equal 1, Librato::Rails.counters['knightrider']
60
- assert_equal 1, Librato::Rails.counters['badguys']
61
-
62
- Librato::Rails.flush
63
- assert_equal 0, Librato::Rails.counters['knightrider']
64
- assert_equal nil, Librato::Rails.counters['badguys']
65
- end
66
-
67
- test 'flush sends measures/timings' do
68
- source = Librato::Rails.qualified_source
69
-
70
- Librato::Rails.timing 'request.time.total', 122.1
71
- Librato::Rails.measure 'items_bought', 20
72
- Librato::Rails.timing 'request.time.total', 81.3
73
- Librato::Rails.timing 'jobs.queued', 5, :source => 'worker.3'
74
- Librato::Rails.flush
75
-
76
- client = Librato::Rails.client
77
- metric_names = client.list.map { |m| m['name'] }
78
- assert metric_names.include?('request.time.total'), 'request.time.total should be present'
79
- assert metric_names.include?('items_bought'), 'request.time.db should be present'
80
-
81
- total = client.fetch 'request.time.total', :count => 10
82
- assert_equal 2, total[source][0]['count']
83
- assert_in_delta 203.4, total[source][0]['sum'], 0.1
84
-
85
- items = client.fetch 'items_bought', :count => 10
86
- assert_equal 1, items[source][0]['count']
87
- assert_in_delta 20, items[source][0]['sum'], 0.1
88
-
89
- jobs = client.fetch 'jobs.queued', :count => 10
90
- assert_equal 1, jobs['worker.3'][0]['count']
91
- assert_in_delta 5, jobs['worker.3'][0]['sum'], 0.1
92
- end
93
-
94
- test 'flush should purge measures/timings' do
95
- Librato::Rails.timing 'request.time.total', 122.1
96
- Librato::Rails.measure 'items_bought', 20
97
- Librato::Rails.flush
98
-
99
- assert Librato::Rails.aggregate.empty?, 'measures and timings should be cleared with flush'
100
- end
101
-
102
- test 'empty flush should not be sent' do
103
- Librato::Rails.flush
104
- assert_equal [], Librato::Rails.client.list
105
- end
106
-
107
- test 'flush respects prefix' do
108
- source = Librato::Rails.qualified_source
109
- Librato::Rails.prefix = 'testyprefix'
110
-
111
- Librato::Rails.timing 'mytime', 221.1
112
- Librato::Rails.increment 'mycount', 4
113
- Librato::Rails.flush
114
-
115
- client = Librato::Rails.client
116
- metric_names = client.list.map { |m| m['name'] }
117
- assert metric_names.include?('testyprefix.mytime'), 'testyprefix.mytime should be present'
118
- assert metric_names.include?('testyprefix.mycount'), 'testyprefix.mycount should be present'
119
-
120
- mytime = client.fetch 'testyprefix.mytime', :count => 10
121
- assert_equal 1, mytime[source][0]['count']
122
-
123
- mycount = client.fetch 'testyprefix.mycount', :count => 10
124
- assert_equal 4, mycount[source][0]['value']
125
- end
126
-
127
- test 'flush recovers from failed flush' do
128
- client = Librato::Rails.client
129
- source = Librato::Rails.qualified_source
130
-
131
- # create a metric foo of counter type
132
- client.submit :foo => {:type => :counter, :value => 12}
133
-
134
- # failing flush - submit a foo measurement as a gauge (type mismatch)
135
- Librato::Rails.measure :foo, 2.12
136
- Librato::Rails.flush
137
-
138
- foo = client.fetch :foo, :count => 10
139
- assert_equal 1, foo['unassigned'].length
140
- assert_nil foo[source] # shouldn't have been accepted
141
-
142
- Librato::Rails.measure :boo, 2.12
143
- Librato::Rails.flush
144
-
145
- boo = client.fetch :boo, :count => 10
146
- assert_equal 2.12, boo[source][0]["value"]
147
- end
148
-
149
- test 'flush tolerates invalid metric names' do
150
- client = Librato::Rails.client
151
- source = Librato::Rails.qualified_source
152
-
153
- Librato::Rails.increment :foo
154
- Librato::Rails.increment 'fübar'
155
- Librato::Rails.measure 'fu/bar/baz', 12.1
156
- Librato::Rails.flush
157
-
158
- metric_names = client.list.map { |m| m['name'] }
159
- assert metric_names.include?('foo')
160
-
161
- # should have saved values for foo even though
162
- # other metrics had invalid names
163
- foo = client.fetch :foo, :count => 5
164
- assert_equal 1.0, foo[source][0]["value"]
165
- end
166
-
167
- test 'flush tolerates invalid source names' do
168
- client = Librato::Rails.client
169
-
170
- Librato::Rails.increment :foo, :source => 'atreides'
171
- Librato::Rails.increment :bar, :source => 'glébnöst'
172
- Librato::Rails.measure 'baz', 2.25, :source => 'b/l/ak/nok'
173
- Librato::Rails.flush
174
-
175
- # should have saved values for foo even though
176
- # other metrics had invalid sources
177
- foo = client.fetch :foo, :count => 5
178
- assert_equal 1.0, foo['atreides'][0]["value"]
179
- end
180
-
181
- private
182
-
183
- def delete_all_metrics
184
- client = Librato::Rails.client
185
- metric_names = client.list.map { |metric| metric['name'] }
186
- client.delete(*metric_names) if !metric_names.empty?
187
- end
188
-
189
- else
190
- puts "Skipping remote tests..."
191
- end
192
-
193
- end
@@ -1,53 +0,0 @@
1
- require 'test_helper'
2
-
3
- class LibratoRailsAggregatorTest < MiniTest::Unit::TestCase
4
-
5
- def setup
6
- @agg = Librato::Rails::Aggregator.new
7
- end
8
-
9
- def test_adding_timings
10
- @agg.timing 'request.time.total', 23.7
11
- @agg.timing 'request.time.db', 5.3
12
- @agg.timing 'request.time.total', 64.3
13
-
14
- assert_equal 2, @agg['request.time.total'][:count]
15
- assert_equal 88.0, @agg['request.time.total'][:sum]
16
- end
17
-
18
- def test_block_timing
19
- @agg.timing 'my.task' do
20
- sleep 0.2
21
- end
22
- assert_in_delta @agg['my.task'][:sum], 200, 50
23
-
24
- @agg.timing('another.task') { sleep 0.1 }
25
- assert_in_delta @agg['another.task'][:sum], 100, 50
26
- end
27
-
28
- def test_return_values
29
- simple = @agg.timing 'simple', 20
30
- assert_equal nil, simple
31
-
32
- timing = @agg.timing 'foo' do
33
- sleep 0.1
34
- 'bar'
35
- end
36
- assert_equal 'bar', timing
37
- end
38
-
39
- def test_custom_source
40
- # sources are kept separate
41
- @agg.measure 'meaning.of.life', 1
42
- @agg.measure 'meaning.of.life', 42, :source => 'douglas_adams'
43
- assert_equal 1.0, @agg.fetch('meaning.of.life')[:sum]
44
- assert_equal 42.0, @agg.fetch('meaning.of.life', :source => 'douglas_adams')[:sum]
45
-
46
- # sources work with time blocks
47
- @agg.timing 'mytiming', :source => 'mine' do
48
- sleep 0.02
49
- end
50
- assert_in_delta @agg.fetch('mytiming', :source => 'mine')[:sum], 20, 10
51
- end
52
-
53
- end
@@ -1,90 +0,0 @@
1
- require 'test_helper'
2
-
3
- class LibratoRailsCounterCacheTest < MiniTest::Unit::TestCase
4
-
5
- def test_basic_operations
6
- cc = Librato::Rails::CounterCache.new
7
- cc.increment :foo
8
- assert_equal 1, cc[:foo]
9
-
10
- # accepts optional argument
11
- cc.increment :foo, :by => 5
12
- assert_equal 6, cc[:foo]
13
-
14
- # legacy style
15
- cc.increment :foo, 2
16
- assert_equal 8, cc[:foo]
17
-
18
- # strings or symbols work
19
- cc.increment 'foo'
20
- assert_equal 9, cc['foo']
21
- end
22
-
23
- def test_custom_sources
24
- cc = Librato::Rails::CounterCache.new
25
-
26
- cc.increment :foo, :source => 'bar'
27
- assert_equal 1, cc.fetch(:foo, :source => 'bar')
28
-
29
- # symbols also work
30
- cc.increment :foo, :source => :baz
31
- assert_equal 1, cc.fetch(:foo, :source => :baz)
32
-
33
- # strings and symbols are interchangable
34
- cc.increment :foo, :source => :bar
35
- assert_equal 2, cc.fetch(:foo, :source => 'bar')
36
-
37
- # custom source and custom increment
38
- cc.increment :foo, :source => 'boombah', :by => 10
39
- assert_equal 10, cc.fetch(:foo, :source => 'boombah')
40
- end
41
-
42
- def test_continuous
43
- cc = Librato::Rails::CounterCache.new
44
-
45
- cc.increment :foo
46
- cc.increment :foo, :source => 'bar'
47
-
48
- cc.increment :baz, :sporadic => true
49
- cc.increment :baz, :source => 118, :sporadic => true
50
- assert_equal 1, cc[:baz]
51
- assert_equal 1, cc.fetch(:baz, :source => 118)
52
-
53
- cc.flush_to(Librato::Metrics::Queue.new) # persist values once
54
-
55
- # continous values persist
56
- assert_equal 0, cc[:foo]
57
- assert_equal 0, cc.fetch(:foo, :source => 'bar')
58
-
59
- # non-continous do not
60
- assert_equal nil, cc[:baz]
61
- assert_equal nil, cc.fetch(:baz, :source => 118)
62
-
63
- # add a different sporadic metric
64
- cc.increment :bazoom, :sporadic => true
65
- assert_equal 1, cc[:bazoom]
66
-
67
- cc.flush_to(Librato::Metrics::Queue.new) # persist values again
68
- assert_equal nil, cc[:bazoom]
69
- end
70
-
71
- def test_flushing
72
- cc = Librato::Rails::CounterCache.new
73
-
74
- cc.increment :foo
75
- cc.increment :bar, :by => 2
76
- cc.increment :foo, :source => 'foobar'
77
- cc.increment :foo, :source => 'foobar', :by => 3
78
-
79
- q = Librato::Metrics::Queue.new
80
- cc.flush_to(q)
81
-
82
- expected = Set.new [{:name=>"foo", :value=>1},
83
- {:name=>"foo", :value=>4, :source=>"foobar"},
84
- {:name=>"bar", :value=>2}]
85
- queued = Set.new q.gauges
86
- queued.each { |hash| hash.delete(:measure_time) }
87
- assert_equal queued, expected
88
- end
89
-
90
- end
@@ -1,54 +0,0 @@
1
- require 'test_helper'
2
-
3
- class LibratoRailsGroupTest < MiniTest::Unit::TestCase
4
-
5
- def test_basic_grouping
6
- Librato::Rails.group 'fruit' do |g|
7
- g.increment 'bites'
8
- g.increment 'nibbles', :by => 2
9
- g.increment 'nibbles', 5
10
-
11
- g.increment 'chomps', :source => 'pacman'
12
- g.increment 'chomps', :source => 'pacman', :by => 5
13
-
14
- g.measure 'banana', 12
15
- g.measure 'banana', 10
16
-
17
- g.timing 'grow_time', 122.2
18
- g.timing 'grow_time', 24.3
19
- end
20
-
21
- assert_equal 1, counters['fruit.bites']
22
- assert_equal 7, counters['fruit.nibbles']
23
- assert_equal 6, counters.fetch('fruit.chomps', :source => 'pacman')
24
-
25
- assert_equal 2, aggregate['fruit.banana'][:count]
26
- assert_equal 22, aggregate['fruit.banana'][:sum]
27
-
28
- assert_equal 2, aggregate['fruit.grow_time'][:count]
29
- assert_equal 146.5, aggregate['fruit.grow_time'][:sum]
30
- end
31
-
32
- def test_nesting
33
- Librato::Rails.group 'street' do |s|
34
- s.increment 'count'
35
- s.group 'market' do |m|
36
- m.increment 'tenants', 10
37
- end
38
- end
39
-
40
- assert_equal 1, counters['street.count']
41
- assert_equal 10, counters['street.market.tenants']
42
- end
43
-
44
- private
45
-
46
- def aggregate
47
- Librato::Rails.aggregate
48
- end
49
-
50
- def counters
51
- Librato::Rails.counters
52
- end
53
-
54
- end