librato-rack 0.1.0

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.
@@ -0,0 +1,22 @@
1
+ require 'bundler'
2
+ Bundler.setup
3
+
4
+ require 'pry'
5
+ require 'minitest/autorun'
6
+ # require 'mocha/setup'
7
+
8
+ # Configure Rails Environment
9
+ ENV["RAILS_ENV"] = "test"
10
+
11
+ require 'librato/rack'
12
+
13
+ # require File.expand_path("../dummy/config/environment.rb", __FILE__)
14
+ # require "rails/test_help"
15
+
16
+ # Configure capybara
17
+ # require 'capybara/rails'
18
+ # Capybara.default_driver = :rack_test
19
+ # Capybara.default_selector = :css
20
+
21
+ # Load support files
22
+ #Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ module Librato
4
+ class Collector
5
+ class AggregatorTest < MiniTest::Unit::TestCase
6
+
7
+ def setup
8
+ @agg = Aggregator.new
9
+ end
10
+
11
+ def test_adding_timings
12
+ @agg.timing 'request.time.total', 23.7
13
+ @agg.timing 'request.time.db', 5.3
14
+ @agg.timing 'request.time.total', 64.3
15
+
16
+ assert_equal 2, @agg['request.time.total'][:count]
17
+ assert_equal 88.0, @agg['request.time.total'][:sum]
18
+ end
19
+
20
+ def test_block_timing
21
+ @agg.timing 'my.task' do
22
+ sleep 0.2
23
+ end
24
+ assert_in_delta @agg['my.task'][:sum], 200, 50
25
+
26
+ @agg.timing('another.task') { sleep 0.1 }
27
+ assert_in_delta @agg['another.task'][:sum], 100, 50
28
+ end
29
+
30
+ def test_return_values
31
+ simple = @agg.timing 'simple', 20
32
+ assert_equal nil, simple
33
+
34
+ timing = @agg.timing 'foo' do
35
+ sleep 0.1
36
+ 'bar'
37
+ end
38
+ assert_equal 'bar', timing
39
+ end
40
+
41
+ def test_custom_source
42
+ # sources are kept separate
43
+ @agg.measure 'meaning.of.life', 1
44
+ @agg.measure 'meaning.of.life', 42, :source => 'douglas_adams'
45
+ assert_equal 1.0, @agg.fetch('meaning.of.life')[:sum]
46
+ assert_equal 42.0, @agg.fetch('meaning.of.life', :source => 'douglas_adams')[:sum]
47
+
48
+ # sources work with time blocks
49
+ @agg.timing 'mytiming', :source => 'mine' do
50
+ sleep 0.02
51
+ end
52
+ assert_in_delta @agg.fetch('mytiming', :source => 'mine')[:sum], 20, 10
53
+ end
54
+
55
+ def test_flush
56
+ @agg.measure 'meaning.of.life', 1
57
+ @agg.measure 'meaning.of.life', 42, :source => 'douglas_adams'
58
+
59
+ q = Librato::Metrics::Queue.new
60
+ @agg.flush_to(q)
61
+ expected = Set.new([
62
+ {:name=>"meaning.of.life", :count=>1, :sum=>1.0, :min=>1.0, :max=>1.0},
63
+ {:name=>"meaning.of.life", :count=>1, :sum=>42.0, :min=>42.0, :max=>42.0, :source=>"douglas_adams"}])
64
+ assert_equal expected, Set.new(q.queued[:gauges])
65
+ end
66
+
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,96 @@
1
+ require 'test_helper'
2
+
3
+ module Librato
4
+ class Collector
5
+ class CounterCacheTest < MiniTest::Unit::TestCase
6
+
7
+ def test_basic_operations
8
+ cc = CounterCache.new
9
+ cc.increment :foo
10
+ assert_equal 1, cc[:foo]
11
+
12
+ # accepts optional argument
13
+ cc.increment :foo, :by => 5
14
+ assert_equal 6, cc[:foo]
15
+
16
+ # legacy style
17
+ cc.increment :foo, 2
18
+ assert_equal 8, cc[:foo]
19
+
20
+ # strings or symbols work
21
+ cc.increment 'foo'
22
+ assert_equal 9, cc['foo']
23
+ end
24
+
25
+ def test_custom_sources
26
+ cc = CounterCache.new
27
+
28
+ cc.increment :foo, :source => 'bar'
29
+ assert_equal 1, cc.fetch(:foo, :source => 'bar')
30
+
31
+ # symbols also work
32
+ cc.increment :foo, :source => :baz
33
+ assert_equal 1, cc.fetch(:foo, :source => :baz)
34
+
35
+ # strings and symbols are interchangable
36
+ cc.increment :foo, :source => :bar
37
+ assert_equal 2, cc.fetch(:foo, :source => 'bar')
38
+
39
+ # custom source and custom increment
40
+ cc.increment :foo, :source => 'boombah', :by => 10
41
+ assert_equal 10, cc.fetch(:foo, :source => 'boombah')
42
+ end
43
+
44
+ def test_sporadic
45
+ cc = CounterCache.new
46
+
47
+ cc.increment :foo
48
+ cc.increment :foo, :source => 'bar'
49
+
50
+ cc.increment :baz, :sporadic => true
51
+ cc.increment :baz, :source => 118, :sporadic => true
52
+ assert_equal 1, cc[:baz]
53
+ assert_equal 1, cc.fetch(:baz, :source => 118)
54
+
55
+ # persist values once
56
+ cc.flush_to(Librato::Metrics::Queue.new)
57
+
58
+ # normal values persist
59
+ assert_equal 0, cc[:foo]
60
+ assert_equal 0, cc.fetch(:foo, :source => 'bar')
61
+
62
+ # sporadic do not
63
+ assert_equal nil, cc[:baz]
64
+ assert_equal nil, cc.fetch(:baz, :source => 118)
65
+
66
+ # add a different sporadic metric
67
+ cc.increment :bazoom, :sporadic => true
68
+ assert_equal 1, cc[:bazoom]
69
+
70
+ # persist values again
71
+ cc.flush_to(Librato::Metrics::Queue.new)
72
+ assert_equal nil, cc[:bazoom]
73
+ end
74
+
75
+ def test_flushing
76
+ cc = CounterCache.new
77
+
78
+ cc.increment :foo
79
+ cc.increment :bar, :by => 2
80
+ cc.increment :foo, :source => 'foobar'
81
+ cc.increment :foo, :source => 'foobar', :by => 3
82
+
83
+ q = Librato::Metrics::Queue.new
84
+ cc.flush_to(q)
85
+
86
+ expected = Set.new [{:name=>"foo", :value=>1},
87
+ {:name=>"foo", :value=>4, :source=>"foobar"},
88
+ {:name=>"bar", :value=>2}]
89
+ queued = Set.new(q.gauges)
90
+ queued.each { |hash| hash.delete(:measure_time) }
91
+ assert_equal queued, expected
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,53 @@
1
+ require 'test_helper'
2
+
3
+ module Librato
4
+ class Collector
5
+ class GroupTest < MiniTest::Unit::TestCase
6
+
7
+ def test_increment
8
+ collector = Collector.new
9
+ collector.group 'foo' do |g|
10
+ g.increment :bar
11
+ end
12
+ assert_equal 1, collector.counters['foo.bar']
13
+ end
14
+
15
+ def test_measure
16
+ collector = Collector.new
17
+ collector.group 'foo' do |g|
18
+ g.measure :baz, 23
19
+ end
20
+ assert_equal 23, collector.aggregate['foo.baz'][:sum]
21
+ end
22
+
23
+ def test_timing
24
+ collector = Collector.new
25
+ collector.group 'foo' do |g|
26
+ g.timing :bam, 32.0
27
+ end
28
+ assert_equal 32.0, collector.aggregate['foo.bam'][:sum]
29
+ end
30
+
31
+ def test_timing_block
32
+ collector = Collector.new
33
+ collector.group 'foo' do |g|
34
+ g.timing :bak do
35
+ sleep 0.01
36
+ end
37
+ end
38
+ assert_in_delta 10.0, collector.aggregate['foo.bak'][:sum], 2
39
+ end
40
+
41
+ def test_nesting
42
+ collector = Collector.new
43
+ collector.group 'foo' do |g|
44
+ g.group :bar do |b|
45
+ b.increment :baz, 2
46
+ end
47
+ end
48
+ assert_equal 2, collector.counters['foo.bar.baz']
49
+ end
50
+
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,23 @@
1
+ require 'test_helper'
2
+
3
+ module Librato
4
+ class CollectorTest < MiniTest::Unit::TestCase
5
+
6
+ def test_proxy_object_access
7
+ collector = Collector.new
8
+ assert collector.aggregate, 'should have aggregate object'
9
+ assert collector.counters, 'should have counter object'
10
+ end
11
+
12
+ def test_basic_grouping
13
+ collector = Collector.new
14
+ collector.group 'foo' do |g|
15
+ g.increment :bar
16
+ g.measure :baz, 23
17
+ end
18
+ assert_equal 1, collector.counters['foo.bar']
19
+ assert_equal 23, collector.aggregate['foo.baz'][:sum]
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,86 @@
1
+ require 'test_helper'
2
+
3
+ module Librato
4
+ class Rack
5
+ class ConfigurationTest < MiniTest::Unit::TestCase
6
+
7
+ def setup
8
+ clear_env_vars
9
+ end
10
+
11
+ def teardown
12
+ clear_env_vars
13
+ end
14
+
15
+ def test_defaults
16
+ config = Configuration.new
17
+ assert_equal 60, config.flush_interval
18
+ assert_equal Librato::Metrics.api_endpoint, config.api_endpoint
19
+ end
20
+
21
+ def test_environment_variable_config
22
+ ENV['LIBRATO_USER'] = 'foo@bar.com'
23
+ ENV['LIBRATO_TOKEN'] = 'api_key'
24
+ ENV['LIBRATO_SOURCE'] = 'source'
25
+ config = Configuration.new
26
+ assert_equal 'foo@bar.com', config.user
27
+ assert_equal 'api_key', config.token
28
+ assert_equal 'source', config.source
29
+ #assert Librato::Rails.explicit_source, 'source is explicit'
30
+ end
31
+
32
+ def test_legacy_env_variable_config
33
+ ENV['LIBRATO_METRICS_USER'] = 'foo@bar.com'
34
+ ENV['LIBRATO_METRICS_TOKEN'] = 'api_key'
35
+ ENV['LIBRATO_METRICS_SOURCE'] = 'source'
36
+ config = Configuration.new
37
+ assert_equal 'foo@bar.com', config.user
38
+ assert_equal 'api_key', config.token
39
+ assert_equal 'source', config.source
40
+ # assert Librato::Rails.explicit_source, 'source is explicit'
41
+ end
42
+
43
+ def test_explicit_source
44
+ config = Configuration.new
45
+ assert !config.explicit_source?
46
+ config.source = 'tessaract'
47
+ assert config.explicit_source?
48
+ config.source = nil
49
+ assert !config.explicit_source?, 'source should no long be explicit when reset'
50
+ end
51
+
52
+ def test_prefix_change_notification
53
+ config = Configuration.new
54
+ listener = listener_object
55
+ config.register_listener(listener)
56
+ config.prefix = 'newfoo'
57
+ assert_equal 'newfoo', listener.prefix
58
+ end
59
+
60
+ private
61
+
62
+ def clear_env_vars
63
+ ENV.delete('LIBRATO_USER')
64
+ ENV.delete('LIBRATO_TOKEN')
65
+ ENV.delete('LIBRATO_SOURCE')
66
+ ENV.delete('LIBRATO_LOG_LEVEL')
67
+ # legacy
68
+ ENV.delete('LIBRATO_METRICS_USER')
69
+ ENV.delete('LIBRATO_METRICS_TOKEN')
70
+ ENV.delete('LIBRATO_METRICS_SOURCE')
71
+ end
72
+
73
+ def listener_object
74
+ listener = Object.new
75
+ def listener.prefix=(prefix)
76
+ @prefix = prefix
77
+ end
78
+ def listener.prefix
79
+ @prefix
80
+ end
81
+ listener
82
+ end
83
+
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,91 @@
1
+ require 'test_helper'
2
+ require 'stringio'
3
+
4
+ module Librato
5
+ class Rack
6
+ class LoggerTest < MiniTest::Unit::TestCase
7
+
8
+ def setup
9
+ @buffer = StringIO.new
10
+ #log_object = ::Logger.new(@buffer) # stdlib logger
11
+ @logger = Logger.new(@buffer) # rack logger
12
+ end
13
+
14
+ def test_log_levels
15
+ assert_equal :info, @logger.log_level, 'should default to info'
16
+
17
+ @logger.log_level = :debug
18
+ assert_equal :debug, @logger.log_level, 'should accept symbols'
19
+
20
+ @logger.log_level = 'trace'
21
+ assert_equal :trace, @logger.log_level, 'should accept strings'
22
+
23
+ assert_raises(InvalidLogLevel) { @logger.log_level = :foo }
24
+ end
25
+
26
+ def test_simple_logging
27
+ @logger.log_level = :info
28
+
29
+ # logging at log level
30
+ @logger.log :info, 'a log message'
31
+ assert_equal 1, buffer_lines.length, 'should have added a line'
32
+ assert buffer_lines[0].index('a log message'), 'should log message'
33
+
34
+ # logging above level
35
+ @logger.log :error, 'an error message'
36
+ assert_equal 2, buffer_lines.length, 'should have added a line'
37
+ assert buffer_lines[1].index('an error message'), 'should log message'
38
+
39
+ # logging below level
40
+ @logger.log :debug, 'a debug message'
41
+ assert_equal 2, buffer_lines.length, 'should not have added a line'
42
+ end
43
+
44
+ def test_logging_through_stdlib_logger_object
45
+ stdlib_logger = ::Logger.new(@buffer)
46
+ @logger = Logger.new(stdlib_logger)
47
+
48
+ @logger.log_level = :info
49
+
50
+ # logging at log level
51
+ @logger.log :info, 'a log message'
52
+ assert_equal 1, buffer_lines.length, 'should have added a line'
53
+ assert buffer_lines[0].index('a log message'), 'should log message'
54
+
55
+ # logging above level
56
+ @logger.log :error, 'an error message'
57
+ assert_equal 2, buffer_lines.length, 'should have added a line'
58
+ assert buffer_lines[1].index('an error message'), 'should log message'
59
+
60
+ # logging below level
61
+ @logger.log :debug, 'a debug message'
62
+ assert_equal 2, buffer_lines.length, 'should not have added a line'
63
+ end
64
+
65
+ def test_block_logging
66
+ @logger.log_level = :info
67
+
68
+ # logging at log level
69
+ @logger.log(:info) { "log statement" }
70
+ assert_equal 1, buffer_lines.length, 'should have added a line'
71
+ assert buffer_lines[0].index('log statement'), 'should log message'
72
+ end
73
+
74
+ def test_log_prefix
75
+ assert_equal '[librato-rack] ', @logger.prefix
76
+
77
+ @logger.prefix = '[test prefix] '
78
+ @logger.log :error, 'an error message'
79
+ assert buffer_lines[0].index('[test prefix] '), 'should use prefix'
80
+ end
81
+
82
+ private
83
+
84
+ def buffer_lines
85
+ @buffer.rewind
86
+ @buffer.readlines
87
+ end
88
+
89
+ end
90
+ end
91
+ end