librato-rack 1.1.1 → 2.0.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.
- data/CHANGELOG.md +3 -0
 - data/README.md +43 -20
 - data/lib/librato/collector/aggregator.rb +45 -25
 - data/lib/librato/collector/counter_cache.rb +38 -24
 - data/lib/librato/collector.rb +9 -3
 - data/lib/librato/rack/configuration.rb +24 -16
 - data/lib/librato/rack/errors.rb +2 -0
 - data/lib/librato/rack/tracker.rb +11 -16
 - data/lib/librato/rack/validating_queue.rb +8 -6
 - data/lib/librato/rack/version.rb +1 -1
 - data/lib/librato/rack.rb +6 -12
 - data/test/apps/custom.ru +5 -1
 - data/test/integration/custom_test.rb +20 -6
 - data/test/integration/no_stats_test.rb +2 -3
 - data/test/integration/no_suites_test.rb +4 -5
 - data/test/integration/queue_wait_test.rb +4 -10
 - data/test/integration/request_test.rb +20 -23
 - data/test/integration/suites_test.rb +5 -7
 - data/test/remote/tracker_test.rb +53 -45
 - data/test/support/environment_helpers.rb +1 -1
 - data/test/test_helper.rb +1 -1
 - data/test/unit/collector/aggregator_test.rb +70 -31
 - data/test/unit/collector/counter_cache_test.rb +73 -33
 - data/test/unit/collector/group_test.rb +20 -16
 - data/test/unit/collector_test.rb +6 -5
 - data/test/unit/rack/configuration_test.rb +19 -8
 - data/test/unit/rack/tracker_test.rb +41 -5
 - data.tar.gz.sig +0 -0
 - metadata +83 -42
 - metadata.gz.sig +1 -0
 - checksums.yaml +0 -7
 
| 
         @@ -5,33 +5,40 @@ require 'rack/test' 
     | 
|
| 
       5 
5 
     | 
    
         
             
            #
         
     | 
| 
       6 
6 
     | 
    
         
             
            class CustomTest < Minitest::Test
         
     | 
| 
       7 
7 
     | 
    
         
             
              include Rack::Test::Methods
         
     | 
| 
      
 8 
     | 
    
         
            +
              include EnvironmentHelpers
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
10 
     | 
    
         
             
              def app
         
     | 
| 
       10 
11 
     | 
    
         
             
                Rack::Builder.parse_file('test/apps/custom.ru').first
         
     | 
| 
       11 
12 
     | 
    
         
             
              end
         
     | 
| 
       12 
13 
     | 
    
         | 
| 
      
 14 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 15 
     | 
    
         
            +
                ENV["LIBRATO_TAGS"] = "hostname=metrics-web-stg-1"
         
     | 
| 
      
 16 
     | 
    
         
            +
                @tags = { hostname: "metrics-web-stg-1" }
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
       13 
19 
     | 
    
         
             
              def teardown
         
     | 
| 
       14 
20 
     | 
    
         
             
                # clear metrics before each run
         
     | 
| 
       15 
21 
     | 
    
         
             
                aggregate.delete_all
         
     | 
| 
       16 
22 
     | 
    
         
             
                counters.delete_all
         
     | 
| 
      
 23 
     | 
    
         
            +
                clear_config_env_vars
         
     | 
| 
       17 
24 
     | 
    
         
             
              end
         
     | 
| 
       18 
25 
     | 
    
         | 
| 
       19 
26 
     | 
    
         
             
              def test_increment
         
     | 
| 
       20 
27 
     | 
    
         
             
                get '/increment'
         
     | 
| 
       21 
     | 
    
         
            -
                assert_equal 1, counters[:hits]
         
     | 
| 
      
 28 
     | 
    
         
            +
                assert_equal 1, counters[:hits][:value]
         
     | 
| 
       22 
29 
     | 
    
         
             
                2.times { get '/increment' }
         
     | 
| 
       23 
     | 
    
         
            -
                assert_equal 3, counters[:hits]
         
     | 
| 
      
 30 
     | 
    
         
            +
                assert_equal 3, counters[:hits][:value]
         
     | 
| 
       24 
31 
     | 
    
         
             
              end
         
     | 
| 
       25 
32 
     | 
    
         | 
| 
       26 
33 
     | 
    
         
             
              def test_measure
         
     | 
| 
       27 
34 
     | 
    
         
             
                get '/measure'
         
     | 
| 
       28 
     | 
    
         
            -
                assert_equal 3.0, aggregate 
     | 
| 
       29 
     | 
    
         
            -
                assert_equal 1, aggregate 
     | 
| 
      
 35 
     | 
    
         
            +
                assert_equal 3.0, aggregate.fetch(:nodes, @tags)[:sum]
         
     | 
| 
      
 36 
     | 
    
         
            +
                assert_equal 1, aggregate.fetch(:nodes, @tags)[:count]
         
     | 
| 
       30 
37 
     | 
    
         
             
              end
         
     | 
| 
       31 
38 
     | 
    
         | 
| 
       32 
39 
     | 
    
         
             
              def test_timing
         
     | 
| 
       33 
40 
     | 
    
         
             
                get '/timing'
         
     | 
| 
       34 
     | 
    
         
            -
                assert_equal 1, aggregate 
     | 
| 
      
 41 
     | 
    
         
            +
                assert_equal 1, aggregate.fetch("lookup.time", @tags)[:count]
         
     | 
| 
       35 
42 
     | 
    
         
             
              end
         
     | 
| 
       36 
43 
     | 
    
         | 
| 
       37 
44 
     | 
    
         
             
              def test_timing_block
         
     | 
| 
         @@ -42,10 +49,17 @@ class CustomTest < Minitest::Test 
     | 
|
| 
       42 
49 
     | 
    
         | 
| 
       43 
50 
     | 
    
         
             
              def test_grouping
         
     | 
| 
       44 
51 
     | 
    
         
             
                get '/group'
         
     | 
| 
       45 
     | 
    
         
            -
                assert_equal 1, counters['did.a.thing']
         
     | 
| 
      
 52 
     | 
    
         
            +
                assert_equal 1, counters['did.a.thing'][:value]
         
     | 
| 
       46 
53 
     | 
    
         
             
                assert_equal 1, aggregate['did.a.timing'][:count]
         
     | 
| 
       47 
54 
     | 
    
         
             
              end
         
     | 
| 
       48 
55 
     | 
    
         | 
| 
      
 56 
     | 
    
         
            +
              def test_tags
         
     | 
| 
      
 57 
     | 
    
         
            +
                tags = { region: "us-east-1" }
         
     | 
| 
      
 58 
     | 
    
         
            +
                get '/tags'
         
     | 
| 
      
 59 
     | 
    
         
            +
                assert_equal 1, counters.fetch("requests", tags: tags)[:value]
         
     | 
| 
      
 60 
     | 
    
         
            +
                assert_equal 1, aggregate.fetch("requests.time", tags: tags)[:count]
         
     | 
| 
      
 61 
     | 
    
         
            +
              end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
       49 
63 
     | 
    
         
             
              private
         
     | 
| 
       50 
64 
     | 
    
         | 
| 
       51 
65 
     | 
    
         
             
              def aggregate
         
     | 
| 
         @@ -20,9 +20,8 @@ class NoStatsTest < Minitest::Test 
     | 
|
| 
       20 
20 
     | 
    
         
             
                get '/'
         
     | 
| 
       21 
21 
     | 
    
         
             
                assert last_response.ok?
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
     | 
    
         
            -
                assert_nil counters["rack.request 
     | 
| 
       24 
     | 
    
         
            -
                assert_nil counters["rack.request.status 
     | 
| 
       25 
     | 
    
         
            -
                assert_nil counters["rack.request.status.2xx"]
         
     | 
| 
      
 23 
     | 
    
         
            +
                assert_nil counters["rack.request"]
         
     | 
| 
      
 24 
     | 
    
         
            +
                assert_nil counters["rack.request.status"]
         
     | 
| 
       26 
25 
     | 
    
         
             
              end
         
     | 
| 
       27 
26 
     | 
    
         | 
| 
       28 
27 
     | 
    
         
             
              def test_no_standard_measures
         
     | 
| 
         @@ -24,7 +24,7 @@ class NoSuitesTest < Minitest::Test 
     | 
|
| 
       24 
24 
     | 
    
         
             
              def test_increment_total
         
     | 
| 
       25 
25 
     | 
    
         
             
                get '/'
         
     | 
| 
       26 
26 
     | 
    
         
             
                assert last_response.ok?
         
     | 
| 
       27 
     | 
    
         
            -
                assert_nil counters["rack.request 
     | 
| 
      
 27 
     | 
    
         
            +
                assert_nil counters["rack.request"], "should not increment"
         
     | 
| 
       28 
28 
     | 
    
         
             
              end
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
30 
     | 
    
         
             
              def test_track_queue_time
         
     | 
| 
         @@ -36,16 +36,15 @@ class NoSuitesTest < Minitest::Test 
     | 
|
| 
       36 
36 
     | 
    
         
             
              def test_increment_status
         
     | 
| 
       37 
37 
     | 
    
         
             
                get '/'
         
     | 
| 
       38 
38 
     | 
    
         
             
                assert last_response.ok?
         
     | 
| 
       39 
     | 
    
         
            -
                assert_nil counters["rack.request.status 
     | 
| 
       40 
     | 
    
         
            -
                assert_nil counters["rack.request.status.2xx"], 'should not increment'
         
     | 
| 
      
 39 
     | 
    
         
            +
                assert_nil counters["rack.request.status"], "should not increment"
         
     | 
| 
       41 
40 
     | 
    
         
             
              end
         
     | 
| 
       42 
41 
     | 
    
         | 
| 
       43 
42 
     | 
    
         
             
              def test_track_http_method_info
         
     | 
| 
       44 
43 
     | 
    
         
             
                get '/'
         
     | 
| 
       45 
     | 
    
         
            -
                assert_nil counters[ 
     | 
| 
      
 44 
     | 
    
         
            +
                assert_nil counters["rack.request.method"]
         
     | 
| 
       46 
45 
     | 
    
         | 
| 
       47 
46 
     | 
    
         
             
                post '/'
         
     | 
| 
       48 
     | 
    
         
            -
                assert_nil counters[ 
     | 
| 
      
 47 
     | 
    
         
            +
                assert_nil counters["rack.request.method"]
         
     | 
| 
       49 
48 
     | 
    
         
             
              end
         
     | 
| 
       50 
49 
     | 
    
         | 
| 
       51 
50 
     | 
    
         
             
              def test_increment_exception
         
     | 
| 
         @@ -19,13 +19,10 @@ class QueueWaitTest < Minitest::Test 
     | 
|
| 
       19 
19 
     | 
    
         
             
              def test_milliseconds
         
     | 
| 
       20 
20 
     | 
    
         
             
                get '/milli'
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
     | 
    
         
            -
                # give jruby a bit more time since it can be slow
         
     | 
| 
       23 
     | 
    
         
            -
                delta = defined?(JRUBY_VERSION) ? 6 : 4
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
22 
     | 
    
         
             
                # puts "milli: #{aggregate["rack.request.queue.time"].inspect}"
         
     | 
| 
       26 
23 
     | 
    
         
             
                assert_equal 1, aggregate["rack.request.queue.time"][:count],
         
     | 
| 
       27 
24 
     | 
    
         
             
                  'should track total queue time'
         
     | 
| 
       28 
     | 
    
         
            -
                assert_in_delta 5, aggregate["rack.request.queue.time"][:sum],  
     | 
| 
      
 25 
     | 
    
         
            +
                assert_in_delta 5, aggregate["rack.request.queue.time"][:sum], 4
         
     | 
| 
       29 
26 
     | 
    
         
             
              end
         
     | 
| 
       30 
27 
     | 
    
         | 
| 
       31 
28 
     | 
    
         
             
              def test_microseconds
         
     | 
| 
         @@ -40,13 +37,10 @@ class QueueWaitTest < Minitest::Test 
     | 
|
| 
       40 
37 
     | 
    
         
             
              def test_queue_start
         
     | 
| 
       41 
38 
     | 
    
         
             
                get '/queue_start'
         
     | 
| 
       42 
39 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                # give jruby a bit more time since it can be slow
         
     | 
| 
       44 
     | 
    
         
            -
                delta = defined?(JRUBY_VERSION) ? 6 : 4
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
40 
     | 
    
         
             
                # puts "micro: #{aggregate["rack.request.queue.time"].inspect}"
         
     | 
| 
       47 
41 
     | 
    
         
             
                assert_equal 1, aggregate["rack.request.queue.time"][:count],
         
     | 
| 
       48 
42 
     | 
    
         
             
                  'should track total queue time'
         
     | 
| 
       49 
     | 
    
         
            -
                assert_in_delta 15, aggregate["rack.request.queue.time"][:sum],  
     | 
| 
      
 43 
     | 
    
         
            +
                assert_in_delta 15, aggregate["rack.request.queue.time"][:sum], 6
         
     | 
| 
       50 
44 
     | 
    
         
             
              end
         
     | 
| 
       51 
45 
     | 
    
         | 
| 
       52 
46 
     | 
    
         
             
              def test_with_t
         
     | 
| 
         @@ -55,14 +49,14 @@ class QueueWaitTest < Minitest::Test 
     | 
|
| 
       55 
49 
     | 
    
         
             
                # puts "micro: #{aggregate["rack.request.queue.time"].inspect}"
         
     | 
| 
       56 
50 
     | 
    
         
             
                assert_equal 1, aggregate["rack.request.queue.time"][:count],
         
     | 
| 
       57 
51 
     | 
    
         
             
                  'should track total queue time'
         
     | 
| 
       58 
     | 
    
         
            -
                assert_in_delta 20, aggregate["rack.request.queue.time"][:sum],  
     | 
| 
      
 52 
     | 
    
         
            +
                assert_in_delta 20, aggregate["rack.request.queue.time"][:sum], 6
         
     | 
| 
       59 
53 
     | 
    
         
             
              end
         
     | 
| 
       60 
54 
     | 
    
         | 
| 
       61 
55 
     | 
    
         
             
              def test_with_period
         
     | 
| 
       62 
56 
     | 
    
         
             
                get '/with_period'
         
     | 
| 
       63 
57 
     | 
    
         | 
| 
       64 
58 
     | 
    
         
             
                # give jruby a bit more time since it can be slow
         
     | 
| 
       65 
     | 
    
         
            -
                delta = defined?(JRUBY_VERSION) ? 10 :  
     | 
| 
      
 59 
     | 
    
         
            +
                delta = defined?(JRUBY_VERSION) ? 10 : 6
         
     | 
| 
       66 
60 
     | 
    
         
             
                assert_equal 1, aggregate["rack.request.queue.time"][:count],
         
     | 
| 
       67 
61 
     | 
    
         
             
                  'should track total queue time'
         
     | 
| 
       68 
62 
     | 
    
         
             
                assert_in_delta 25, aggregate["rack.request.queue.time"][:sum], delta
         
     | 
| 
         @@ -5,29 +5,34 @@ require 'rack/test' 
     | 
|
| 
       5 
5 
     | 
    
         
             
            #
         
     | 
| 
       6 
6 
     | 
    
         
             
            class RequestTest < Minitest::Test
         
     | 
| 
       7 
7 
     | 
    
         
             
              include Rack::Test::Methods
         
     | 
| 
      
 8 
     | 
    
         
            +
              include EnvironmentHelpers
         
     | 
| 
       8 
9 
     | 
    
         | 
| 
       9 
10 
     | 
    
         
             
              def app
         
     | 
| 
       10 
11 
     | 
    
         
             
                Rack::Builder.parse_file('test/apps/basic.ru').first
         
     | 
| 
       11 
12 
     | 
    
         
             
              end
         
     | 
| 
       12 
13 
     | 
    
         | 
| 
      
 14 
     | 
    
         
            +
              def setup
         
     | 
| 
      
 15 
     | 
    
         
            +
                ENV["LIBRATO_TAGS"] = "hostname=metrics-web-stg-1"
         
     | 
| 
      
 16 
     | 
    
         
            +
                @tags = { hostname: "metrics-web-stg-1" }
         
     | 
| 
      
 17 
     | 
    
         
            +
              end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
       13 
19 
     | 
    
         
             
              def teardown
         
     | 
| 
       14 
20 
     | 
    
         
             
                # clear metrics before each run
         
     | 
| 
       15 
21 
     | 
    
         
             
                aggregate.delete_all
         
     | 
| 
       16 
22 
     | 
    
         
             
                counters.delete_all
         
     | 
| 
      
 23 
     | 
    
         
            +
                clear_config_env_vars
         
     | 
| 
       17 
24 
     | 
    
         
             
              end
         
     | 
| 
       18 
25 
     | 
    
         | 
| 
       19 
26 
     | 
    
         
             
              def test_increment_total_and_status
         
     | 
| 
       20 
27 
     | 
    
         
             
                get '/'
         
     | 
| 
       21 
28 
     | 
    
         
             
                assert last_response.ok?
         
     | 
| 
       22 
     | 
    
         
            -
                assert_equal 1, counters["rack.request.total"]
         
     | 
| 
       23 
     | 
    
         
            -
                assert_equal 1, counters 
     | 
| 
       24 
     | 
    
         
            -
                assert_equal 1, counters["rack.request.status.2xx"]
         
     | 
| 
      
 29 
     | 
    
         
            +
                assert_equal 1, counters["rack.request.total"][:value]
         
     | 
| 
      
 30 
     | 
    
         
            +
                assert_equal 1, counters.fetch("rack.request.status", tags: @tags.merge({ status: 200 }))[:value]
         
     | 
| 
       25 
31 
     | 
    
         | 
| 
       26 
32 
     | 
    
         
             
                get '/status/204'
         
     | 
| 
       27 
     | 
    
         
            -
                assert_equal 2, counters["rack.request.total"]
         
     | 
| 
       28 
     | 
    
         
            -
                assert_equal 1, counters 
     | 
| 
       29 
     | 
    
         
            -
                assert_equal 1, counters 
     | 
| 
       30 
     | 
    
         
            -
                assert_equal 2, counters["rack.request.status.2xx"]
         
     | 
| 
      
 33 
     | 
    
         
            +
                assert_equal 2, counters["rack.request.total"][:value]
         
     | 
| 
      
 34 
     | 
    
         
            +
                assert_equal 1, counters.fetch("rack.request.status", tags: @tags.merge({ status: 200 }))[:value], "should not increment"
         
     | 
| 
      
 35 
     | 
    
         
            +
                assert_equal 1, counters.fetch("rack.request.status", tags: @tags.merge({ status: 204 }))[:value], "should increment"
         
     | 
| 
       31 
36 
     | 
    
         
             
              end
         
     | 
| 
       32 
37 
     | 
    
         | 
| 
       33 
38 
     | 
    
         
             
              def test_request_times
         
     | 
| 
         @@ -38,30 +43,22 @@ class RequestTest < Minitest::Test 
     | 
|
| 
       38 
43 
     | 
    
         
             
                  'should track total request time'
         
     | 
| 
       39 
44 
     | 
    
         | 
| 
       40 
45 
     | 
    
         
             
                # should calculate p95 value
         
     | 
| 
       41 
     | 
    
         
            -
                assert aggregate.fetch("rack.request.time", percentile: 95) > 0.0
         
     | 
| 
      
 46 
     | 
    
         
            +
                assert aggregate.fetch("rack.request.time", tags: @tags, percentile: 95) > 0.0
         
     | 
| 
       42 
47 
     | 
    
         | 
| 
       43 
48 
     | 
    
         
             
                # status specific
         
     | 
| 
       44 
     | 
    
         
            -
                assert_equal 1, aggregate 
     | 
| 
       45 
     | 
    
         
            -
                assert_equal 1, aggregate["rack.request.status.2xx.time"][:count]
         
     | 
| 
      
 49 
     | 
    
         
            +
                assert_equal 1, aggregate.fetch("rack.request.status.time", tags: @tags.merge({ status: 200 }))[:count]
         
     | 
| 
       46 
50 
     | 
    
         
             
              end
         
     | 
| 
       47 
51 
     | 
    
         | 
| 
       48 
52 
     | 
    
         
             
              def test_track_http_method_info
         
     | 
| 
       49 
53 
     | 
    
         
             
                get '/'
         
     | 
| 
       50 
54 
     | 
    
         | 
| 
       51 
     | 
    
         
            -
                assert_equal 1, counters 
     | 
| 
       52 
     | 
    
         
            -
                assert_equal 1, aggregate 
     | 
| 
      
 55 
     | 
    
         
            +
                assert_equal 1, counters.fetch("rack.request.method", tags: @tags.merge({ method: "GET" }))[:value]
         
     | 
| 
      
 56 
     | 
    
         
            +
                assert_equal 1, aggregate.fetch("rack.request.method.time", tags: @tags.merge({ method: "get" }))[:count]
         
     | 
| 
       53 
57 
     | 
    
         | 
| 
       54 
58 
     | 
    
         
             
                post '/'
         
     | 
| 
       55 
59 
     | 
    
         | 
| 
       56 
     | 
    
         
            -
                assert_equal 1, counters 
     | 
| 
       57 
     | 
    
         
            -
                assert_equal 1, aggregate 
     | 
| 
       58 
     | 
    
         
            -
              end
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
              def test_request_method_not_mutated
         
     | 
| 
       61 
     | 
    
         
            -
                get '/', {}, {'REQUEST_METHOD' => "GET".freeze}
         
     | 
| 
       62 
     | 
    
         
            -
             
     | 
| 
       63 
     | 
    
         
            -
                assert_equal 1, counters['rack.request.method.get']
         
     | 
| 
       64 
     | 
    
         
            -
                assert_equal 1, aggregate['rack.request.method.get.time'][:count]
         
     | 
| 
      
 60 
     | 
    
         
            +
                assert_equal 1, counters.fetch("rack.request.method", tags: @tags.merge({ method: "POST" }))[:value]
         
     | 
| 
      
 61 
     | 
    
         
            +
                assert_equal 1, aggregate.fetch("rack.request.method.time", tags: @tags.merge({ method: "post" }))[:count]
         
     | 
| 
       65 
62 
     | 
    
         
             
              end
         
     | 
| 
       66 
63 
     | 
    
         | 
| 
       67 
64 
     | 
    
         
             
              def test_track_exceptions
         
     | 
| 
         @@ -70,12 +67,12 @@ class RequestTest < Minitest::Test 
     | 
|
| 
       70 
67 
     | 
    
         
             
                rescue RuntimeError => e
         
     | 
| 
       71 
68 
     | 
    
         
             
                  raise unless e.message == 'exception raised!'
         
     | 
| 
       72 
69 
     | 
    
         
             
                end
         
     | 
| 
       73 
     | 
    
         
            -
                assert_equal 1, counters["rack.request.exceptions"]
         
     | 
| 
      
 70 
     | 
    
         
            +
                assert_equal 1, counters["rack.request.exceptions"][:value]
         
     | 
| 
       74 
71 
     | 
    
         
             
              end
         
     | 
| 
       75 
72 
     | 
    
         | 
| 
       76 
73 
     | 
    
         
             
              def test_track_slow_requests
         
     | 
| 
       77 
74 
     | 
    
         
             
                get '/slow'
         
     | 
| 
       78 
     | 
    
         
            -
                assert_equal 1, counters["rack.request.slow"]
         
     | 
| 
      
 75 
     | 
    
         
            +
                assert_equal 1, counters["rack.request.slow"][:value]
         
     | 
| 
       79 
76 
     | 
    
         
             
              end
         
     | 
| 
       80 
77 
     | 
    
         | 
| 
       81 
78 
     | 
    
         
             
              private
         
     | 
| 
         @@ -21,18 +21,16 @@ class SuitesTest < Minitest::Test 
     | 
|
| 
       21 
21 
     | 
    
         
             
                assert last_response.ok?
         
     | 
| 
       22 
22 
     | 
    
         | 
| 
       23 
23 
     | 
    
         
             
                # rack.request metrics (rack suite) should get logged
         
     | 
| 
       24 
     | 
    
         
            -
                assert_equal 1, counters["rack.request.total"]
         
     | 
| 
      
 24 
     | 
    
         
            +
                assert_equal 1, counters["rack.request.total"][:value]
         
     | 
| 
       25 
25 
     | 
    
         
             
                assert_equal 1, aggregate["rack.request.time"][:count]
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
                # rack.request.method metrics (rack_method suite) should not get logged
         
     | 
| 
       28 
     | 
    
         
            -
                assert_nil counters 
     | 
| 
       29 
     | 
    
         
            -
                assert_nil aggregate 
     | 
| 
      
 28 
     | 
    
         
            +
                assert_nil counters.fetch("rack.request.method", tags: { method: "GET" })
         
     | 
| 
      
 29 
     | 
    
         
            +
                assert_nil aggregate.fetch("rack.request.method.time", tags: { method: "get" })
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
31 
     | 
    
         
             
                # rack.request.status metrics (rack_status suite) should not get logged
         
     | 
| 
       32 
     | 
    
         
            -
                assert_nil counters 
     | 
| 
       33 
     | 
    
         
            -
                assert_nil counters 
     | 
| 
       34 
     | 
    
         
            -
                assert_nil counters["rack.request.status.200.time"]
         
     | 
| 
       35 
     | 
    
         
            -
                assert_nil counters["rack.request.status.2xx.time"]
         
     | 
| 
      
 32 
     | 
    
         
            +
                assert_nil counters.fetch("rack.request.status", tags: { status: 200, status_message: "OK" })
         
     | 
| 
      
 33 
     | 
    
         
            +
                assert_nil counters.fetch("rack.request.status.time", tags: { status: 200, status_message: "OK" })
         
     | 
| 
       36 
34 
     | 
    
         
             
              end
         
     | 
| 
       37 
35 
     | 
    
         | 
| 
       38 
36 
     | 
    
         
             
              private
         
     | 
    
        data/test/remote/tracker_test.rb
    CHANGED
    
    | 
         @@ -27,24 +27,26 @@ class TrackerRemoteTest < Minitest::Test 
     | 
|
| 
       27 
27 
     | 
    
         
             
                end
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                def test_flush_counters
         
     | 
| 
       30 
     | 
    
         
            -
                  tracker.increment :foo 
     | 
| 
       31 
     | 
    
         
            -
                  tracker.increment :bar, 2 
     | 
| 
       32 
     | 
    
         
            -
                  tracker.increment :foo 
     | 
| 
       33 
     | 
    
         
            -
                  tracker.increment :foo,  
     | 
| 
      
 30 
     | 
    
         
            +
                  tracker.increment :foo                                    # simple
         
     | 
| 
      
 31 
     | 
    
         
            +
                  tracker.increment :bar, 2                                 # specified
         
     | 
| 
      
 32 
     | 
    
         
            +
                  tracker.increment :foo                                    # multincrement
         
     | 
| 
      
 33 
     | 
    
         
            +
                  tracker.increment :foo, tags: { hostname: "baz" }, by: 3  # custom source
         
     | 
| 
       34 
34 
     | 
    
         
             
                  @queued = tracker.queued
         
     | 
| 
       35 
35 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
       36 
36 
     | 
    
         | 
| 
      
 37 
     | 
    
         
            +
                  sleep 15 # TODO: retry logic for replica delay
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
       37 
39 
     | 
    
         
             
                  # metrics are SSA, so should exist but won't have measurements yet
         
     | 
| 
       38 
     | 
    
         
            -
                  metric_names = client. 
     | 
| 
      
 40 
     | 
    
         
            +
                  metric_names = client.metrics.map { |m| m['name'] }
         
     | 
| 
       39 
41 
     | 
    
         
             
                  assert metric_names.include?('foo'), 'foo should be present'
         
     | 
| 
       40 
42 
     | 
    
         
             
                  assert metric_names.include?('bar'), 'bar should be present'
         
     | 
| 
       41 
43 
     | 
    
         | 
| 
       42 
44 
     | 
    
         
             
                  # interogate queued payload for expected values
         
     | 
| 
       43 
     | 
    
         
            -
                  assert_equal  
     | 
| 
      
 45 
     | 
    
         
            +
                  assert_equal [:host], @queued[:measurements].first[:tags].keys
         
     | 
| 
       44 
46 
     | 
    
         
             
                  assert_equal 2, queued('foo')
         
     | 
| 
       45 
47 
     | 
    
         | 
| 
       46 
48 
     | 
    
         
             
                  # custom source
         
     | 
| 
       47 
     | 
    
         
            -
                  assert_equal 3, queued( 
     | 
| 
      
 49 
     | 
    
         
            +
                  assert_equal 3, queued("foo", tags: { hostname: "baz" })
         
     | 
| 
       48 
50 
     | 
    
         | 
| 
       49 
51 
     | 
    
         
             
                  # different counter
         
     | 
| 
       50 
52 
     | 
    
         
             
                  assert_equal 2, queued('bar')
         
     | 
| 
         @@ -53,39 +55,41 @@ class TrackerRemoteTest < Minitest::Test 
     | 
|
| 
       53 
55 
     | 
    
         
             
                def test_counter_persistent_through_flush
         
     | 
| 
       54 
56 
     | 
    
         
             
                  tracker.increment 'knightrider'
         
     | 
| 
       55 
57 
     | 
    
         
             
                  tracker.increment 'badguys', sporadic: true
         
     | 
| 
       56 
     | 
    
         
            -
                  assert_equal 1, collector.counters['knightrider']
         
     | 
| 
       57 
     | 
    
         
            -
                  assert_equal 1, collector.counters['badguys']
         
     | 
| 
      
 58 
     | 
    
         
            +
                  assert_equal 1, collector.counters['knightrider'][:value]
         
     | 
| 
      
 59 
     | 
    
         
            +
                  assert_equal 1, collector.counters['badguys'][:value]
         
     | 
| 
       58 
60 
     | 
    
         | 
| 
       59 
61 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
       60 
     | 
    
         
            -
                  assert_equal 0, collector.counters['knightrider']
         
     | 
| 
      
 62 
     | 
    
         
            +
                  assert_equal 0, collector.counters['knightrider'][:value]
         
     | 
| 
       61 
63 
     | 
    
         
             
                  assert_nil collector.counters['badguys']
         
     | 
| 
       62 
64 
     | 
    
         
             
                end
         
     | 
| 
       63 
65 
     | 
    
         | 
| 
       64 
66 
     | 
    
         
             
                def test_flush_should_send_measures_and_timings
         
     | 
| 
       65 
     | 
    
         
            -
                  tracker.timing   
     | 
| 
      
 67 
     | 
    
         
            +
                  tracker.timing  "request.time", 122.1
         
     | 
| 
       66 
68 
     | 
    
         
             
                  tracker.measure 'items_bought', 20
         
     | 
| 
       67 
     | 
    
         
            -
                  tracker.timing   
     | 
| 
       68 
     | 
    
         
            -
                  tracker.timing   
     | 
| 
      
 69 
     | 
    
         
            +
                  tracker.timing  "request.time", 81.3
         
     | 
| 
      
 70 
     | 
    
         
            +
                  tracker.timing  "jobs.queued", 5, tags: { hostname: "worker.3" }
         
     | 
| 
       69 
71 
     | 
    
         
             
                  @queued = tracker.queued
         
     | 
| 
       70 
72 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
       71 
73 
     | 
    
         | 
| 
      
 74 
     | 
    
         
            +
                  sleep 15 # TODO: retry logic for replica delay
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
       72 
76 
     | 
    
         
             
                  # metrics are SSA, so should exist but won't have measurements yet
         
     | 
| 
       73 
     | 
    
         
            -
                  metric_names = client. 
     | 
| 
       74 
     | 
    
         
            -
                  assert metric_names.include?('request.time 
     | 
| 
      
 77 
     | 
    
         
            +
                  metric_names = client.metrics.map { |m| m['name'] }
         
     | 
| 
      
 78 
     | 
    
         
            +
                  assert metric_names.include?('request.time'), 'request.time should be present'
         
     | 
| 
       75 
79 
     | 
    
         
             
                  assert metric_names.include?('items_bought'), 'request.time.db should be present'
         
     | 
| 
       76 
80 
     | 
    
         | 
| 
       77 
     | 
    
         
            -
                  assert_equal 2, queued( 
     | 
| 
       78 
     | 
    
         
            -
                  assert_in_delta 203.4, queued( 
     | 
| 
      
 81 
     | 
    
         
            +
                  assert_equal 2, queued("request.time", tags: tags)[:count]
         
     | 
| 
      
 82 
     | 
    
         
            +
                  assert_in_delta 203.4, queued("request.time", tags: tags)[:sum], 0.1
         
     | 
| 
       79 
83 
     | 
    
         | 
| 
       80 
     | 
    
         
            -
                  assert_equal 1, queued( 
     | 
| 
       81 
     | 
    
         
            -
                  assert_in_delta 20, queued( 
     | 
| 
      
 84 
     | 
    
         
            +
                  assert_equal 1, queued("items_bought", tags: tags)[:count]
         
     | 
| 
      
 85 
     | 
    
         
            +
                  assert_in_delta 20, queued("items_bought", tags: tags)[:sum], 0.1
         
     | 
| 
       82 
86 
     | 
    
         | 
| 
       83 
     | 
    
         
            -
                  assert_equal 1, queued( 
     | 
| 
       84 
     | 
    
         
            -
                  assert_in_delta 5, queued( 
     | 
| 
      
 87 
     | 
    
         
            +
                  assert_equal 1, queued("jobs.queued", tags: { hostname: "worker.3" })[:count]
         
     | 
| 
      
 88 
     | 
    
         
            +
                  assert_in_delta 5, queued("jobs.queued", tags: { hostname: "worker.3" })[:sum], 0.1
         
     | 
| 
       85 
89 
     | 
    
         
             
                end
         
     | 
| 
       86 
90 
     | 
    
         | 
| 
       87 
91 
     | 
    
         
             
                def test_flush_should_purge_measures_and_timings
         
     | 
| 
       88 
     | 
    
         
            -
                  tracker.timing   
     | 
| 
      
 92 
     | 
    
         
            +
                  tracker.timing  "request.time", 122.1
         
     | 
| 
       89 
93 
     | 
    
         
             
                  tracker.measure 'items_bought', 20
         
     | 
| 
       90 
94 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
       91 
95 
     | 
    
         | 
| 
         @@ -94,29 +98,33 @@ class TrackerRemoteTest < Minitest::Test 
     | 
|
| 
       94 
98 
     | 
    
         
             
                end
         
     | 
| 
       95 
99 
     | 
    
         | 
| 
       96 
100 
     | 
    
         
             
                def test_flush_respects_prefix
         
     | 
| 
      
 101 
     | 
    
         
            +
                  tags = { hostname: "metrics-web-stg-1" }
         
     | 
| 
       97 
102 
     | 
    
         
             
                  config.prefix = 'testyprefix'
         
     | 
| 
       98 
103 
     | 
    
         | 
| 
       99 
     | 
    
         
            -
                  tracker.timing  
     | 
| 
      
 104 
     | 
    
         
            +
                  tracker.timing "mytime", 221.1, tags: tags
         
     | 
| 
       100 
105 
     | 
    
         
             
                  tracker.increment 'mycount', 4
         
     | 
| 
       101 
106 
     | 
    
         
             
                  @queued = tracker.queued
         
     | 
| 
       102 
107 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
       103 
108 
     | 
    
         | 
| 
       104 
     | 
    
         
            -
                   
     | 
| 
      
 109 
     | 
    
         
            +
                  sleep 15 # TODO: retry logic for replica delay
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                  metric_names = client.metrics.map { |m| m['name'] }
         
     | 
| 
      
 112 
     | 
    
         
            +
             
     | 
| 
       105 
113 
     | 
    
         
             
                  assert metric_names.include?('testyprefix.mytime'),
         
     | 
| 
       106 
114 
     | 
    
         
             
                    'testyprefix.mytime should be present'
         
     | 
| 
       107 
115 
     | 
    
         
             
                  assert metric_names.include?('testyprefix.mycount'), '
         
     | 
| 
       108 
116 
     | 
    
         
             
                    testyprefix.mycount should be present'
         
     | 
| 
       109 
117 
     | 
    
         | 
| 
       110 
     | 
    
         
            -
                  assert_equal 1, queued( 
     | 
| 
      
 118 
     | 
    
         
            +
                  assert_equal 1, queued("testyprefix.mytime", tags: tags)[:count]
         
     | 
| 
       111 
119 
     | 
    
         
             
                  assert_equal 4, queued('testyprefix.mycount')
         
     | 
| 
       112 
120 
     | 
    
         
             
                end
         
     | 
| 
       113 
121 
     | 
    
         | 
| 
       114 
122 
     | 
    
         
             
                def test_flush_recovers_from_failure
         
     | 
| 
       115 
123 
     | 
    
         
             
                  # create a metric foo of counter type
         
     | 
| 
       116 
     | 
    
         
            -
                  client.submit  
     | 
| 
      
 124 
     | 
    
         
            +
                  client.submit test_counter: { type: :counter, value: 12 }
         
     | 
| 
       117 
125 
     | 
    
         | 
| 
       118 
126 
     | 
    
         
             
                  # failing flush - submit a foo measurement as a gauge (type mismatch)
         
     | 
| 
       119 
     | 
    
         
            -
                  tracker.measure : 
     | 
| 
      
 127 
     | 
    
         
            +
                  tracker.measure :test_counter, 2.12
         
     | 
| 
       120 
128 
     | 
    
         | 
| 
       121 
129 
     | 
    
         
             
                  # won't be accepted
         
     | 
| 
       122 
130 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
         @@ -124,7 +132,7 @@ class TrackerRemoteTest < Minitest::Test 
     | 
|
| 
       124 
132 
     | 
    
         
             
                  tracker.measure :boo, 2.12
         
     | 
| 
       125 
133 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
       126 
134 
     | 
    
         | 
| 
       127 
     | 
    
         
            -
                  metric_names = client. 
     | 
| 
      
 135 
     | 
    
         
            +
                  metric_names = client.metrics.map { |m| m['name'] }
         
     | 
| 
       128 
136 
     | 
    
         
             
                  assert metric_names.include?('boo')
         
     | 
| 
       129 
137 
     | 
    
         
             
                end
         
     | 
| 
       130 
138 
     | 
    
         | 
| 
         @@ -135,24 +143,24 @@ class TrackerRemoteTest < Minitest::Test 
     | 
|
| 
       135 
143 
     | 
    
         
             
                  @queued = tracker.queued
         
     | 
| 
       136 
144 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
       137 
145 
     | 
    
         | 
| 
       138 
     | 
    
         
            -
                  metric_names = client. 
     | 
| 
      
 146 
     | 
    
         
            +
                  metric_names = client.metrics.map { |m| m['name'] }
         
     | 
| 
       139 
147 
     | 
    
         
             
                  assert metric_names.include?('foo')
         
     | 
| 
       140 
148 
     | 
    
         | 
| 
       141 
149 
     | 
    
         
             
                  # should be sending value for foo
         
     | 
| 
       142 
150 
     | 
    
         
             
                  assert_equal 1.0, queued('foo')
         
     | 
| 
       143 
151 
     | 
    
         
             
                end
         
     | 
| 
       144 
152 
     | 
    
         | 
| 
       145 
     | 
    
         
            -
                def  
     | 
| 
       146 
     | 
    
         
            -
                  tracker.increment :foo,  
     | 
| 
       147 
     | 
    
         
            -
                  tracker.increment :bar,  
     | 
| 
       148 
     | 
    
         
            -
                  tracker.measure 'baz', 2.25,  
     | 
| 
      
 153 
     | 
    
         
            +
                def test_flush_handles_invalid_tags
         
     | 
| 
      
 154 
     | 
    
         
            +
                  tracker.increment :foo, tags: { hostname: "atreides" }        # valid
         
     | 
| 
      
 155 
     | 
    
         
            +
                  tracker.increment :bar, tags: { hostname: "glébnöst" }        # invalid
         
     | 
| 
      
 156 
     | 
    
         
            +
                  tracker.measure 'baz', 2.25, tags: { hostname: "b/l/ak/nok" } # invalid
         
     | 
| 
       149 
157 
     | 
    
         
             
                  @queued = tracker.queued
         
     | 
| 
       150 
158 
     | 
    
         
             
                  tracker.flush
         
     | 
| 
       151 
159 
     | 
    
         | 
| 
       152 
     | 
    
         
            -
                  metric_names = client. 
     | 
| 
      
 160 
     | 
    
         
            +
                  metric_names = client.metrics.map { |m| m['name'] }
         
     | 
| 
       153 
161 
     | 
    
         
             
                  assert metric_names.include?('foo')
         
     | 
| 
       154 
162 
     | 
    
         | 
| 
       155 
     | 
    
         
            -
                  assert_equal 1.0, queued( 
     | 
| 
      
 163 
     | 
    
         
            +
                  assert_equal 1.0, queued("foo", tags: { hostname: "atreides" })
         
     | 
| 
       156 
164 
     | 
    
         
             
                end
         
     | 
| 
       157 
165 
     | 
    
         | 
| 
       158 
166 
     | 
    
         
             
                private
         
     | 
| 
         @@ -176,29 +184,29 @@ class TrackerRemoteTest < Minitest::Test 
     | 
|
| 
       176 
184 
     | 
    
         
             
                # wrapper to make api format more easy to query
         
     | 
| 
       177 
185 
     | 
    
         
             
                def queued(name, opts={})
         
     | 
| 
       178 
186 
     | 
    
         
             
                  raise "No queued found" unless @queued
         
     | 
| 
       179 
     | 
    
         
            -
                   
     | 
| 
      
 187 
     | 
    
         
            +
                  tags_query = opts.fetch(:tags, nil)
         
     | 
| 
       180 
188 
     | 
    
         | 
| 
       181 
     | 
    
         
            -
                  @queued[: 
     | 
| 
       182 
     | 
    
         
            -
                    if  
     | 
| 
       183 
     | 
    
         
            -
                      if  
     | 
| 
      
 189 
     | 
    
         
            +
                  @queued[:measurements].each do |measurement|
         
     | 
| 
      
 190 
     | 
    
         
            +
                    if measurement[:name] == name.to_s && measurement[:tags] == tags_query || measurement[:name] == name.to_s && @queued[:tags] == tags_query
         
     | 
| 
      
 191 
     | 
    
         
            +
                      if measurement[:count]
         
     | 
| 
       184 
192 
     | 
    
         
             
                        # complex metric, return the whole hash
         
     | 
| 
       185 
     | 
    
         
            -
                        return  
     | 
| 
      
 193 
     | 
    
         
            +
                        return measurement
         
     | 
| 
       186 
194 
     | 
    
         
             
                      else
         
     | 
| 
       187 
195 
     | 
    
         
             
                        # return just the value
         
     | 
| 
       188 
     | 
    
         
            -
                        return  
     | 
| 
      
 196 
     | 
    
         
            +
                        return measurement[:value]
         
     | 
| 
       189 
197 
     | 
    
         
             
                      end
         
     | 
| 
       190 
198 
     | 
    
         
             
                    end
         
     | 
| 
       191 
199 
     | 
    
         
             
                  end
         
     | 
| 
       192 
200 
     | 
    
         
             
                  raise "No queued entry with '#{name}' found."
         
     | 
| 
       193 
201 
     | 
    
         
             
                end
         
     | 
| 
       194 
202 
     | 
    
         | 
| 
       195 
     | 
    
         
            -
                def  
     | 
| 
       196 
     | 
    
         
            -
                  @tracker. 
     | 
| 
      
 203 
     | 
    
         
            +
                def tags
         
     | 
| 
      
 204 
     | 
    
         
            +
                  @tracker.send(:tags)
         
     | 
| 
       197 
205 
     | 
    
         
             
                end
         
     | 
| 
       198 
206 
     | 
    
         | 
| 
       199 
207 
     | 
    
         
             
                def delete_all_metrics
         
     | 
| 
       200 
     | 
    
         
            -
                  metric_names = client. 
     | 
| 
       201 
     | 
    
         
            -
                  client. 
     | 
| 
      
 208 
     | 
    
         
            +
                  metric_names = client.metrics.map { |metric| metric['name'] }
         
     | 
| 
      
 209 
     | 
    
         
            +
                  client.delete_metrics(*metric_names) if !metric_names.empty?
         
     | 
| 
       202 
210 
     | 
    
         
             
                end
         
     | 
| 
       203 
211 
     | 
    
         | 
| 
       204 
212 
     | 
    
         
             
              else
         
     | 
| 
         @@ -7,7 +7,7 @@ module EnvironmentHelpers 
     | 
|
| 
       7 
7 
     | 
    
         
             
                ENV.delete('LIBRATO_USER')
         
     | 
| 
       8 
8 
     | 
    
         
             
                ENV.delete('LIBRATO_TOKEN')
         
     | 
| 
       9 
9 
     | 
    
         
             
                ENV.delete('LIBRATO_PROXY')
         
     | 
| 
       10 
     | 
    
         
            -
                ENV.delete( 
     | 
| 
      
 10 
     | 
    
         
            +
                ENV.delete("LIBRATO_TAGS")
         
     | 
| 
       11 
11 
     | 
    
         
             
                ENV.delete('LIBRATO_PREFIX')
         
     | 
| 
       12 
12 
     | 
    
         
             
                ENV.delete('LIBRATO_SUITES')
         
     | 
| 
       13 
13 
     | 
    
         
             
                ENV.delete('LIBRATO_LOG_LEVEL')
         
     | 
    
        data/test/test_helper.rb
    CHANGED