chillout 0.2.1 → 0.2.2
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/lib/chillout/client.rb +17 -2
 - data/lib/chillout/creations_container.rb +14 -4
 - data/lib/chillout/middleware/creations_monitor.rb +2 -1
 - data/lib/chillout/railtie.rb +2 -0
 - data/lib/chillout/version.rb +1 -1
 - data/lib/chillout/worker.rb +31 -0
 - data/test/creations_container_test.rb +18 -3
 - data/test/integration/creations_monitor_rack_test.rb +2 -0
 - data/test/middleware/creations_monitor_test.rb +3 -4
 - metadata +5 -4
 
    
        data/lib/chillout/client.rb
    CHANGED
    
    | 
         @@ -7,6 +7,8 @@ require 'chillout/config' 
     | 
|
| 
       7 
7 
     | 
    
         
             
            require 'chillout/error'
         
     | 
| 
       8 
8 
     | 
    
         
             
            require 'chillout/event_data_builder'
         
     | 
| 
       9 
9 
     | 
    
         
             
            require 'chillout/prefixed_logger'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require 'chillout/worker'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require 'thread'
         
     | 
| 
       10 
12 
     | 
    
         | 
| 
       11 
13 
     | 
    
         
             
            module Chillout
         
     | 
| 
       12 
14 
     | 
    
         
             
              class Client
         
     | 
| 
         @@ -16,6 +18,7 @@ module Chillout 
     | 
|
| 
       16 
18 
     | 
    
         | 
| 
       17 
19 
     | 
    
         
             
                attr_reader :config
         
     | 
| 
       18 
20 
     | 
    
         
             
                attr_reader :logger
         
     | 
| 
      
 21 
     | 
    
         
            +
                attr_reader :queue
         
     | 
| 
       19 
22 
     | 
    
         | 
| 
       20 
23 
     | 
    
         
             
                def initialize(config_or_api_key, options = {})
         
     | 
| 
       21 
24 
     | 
    
         
             
                  build_config(config_or_api_key, options)
         
     | 
| 
         @@ -27,14 +30,26 @@ module Chillout 
     | 
|
| 
       27 
30 
     | 
    
         
             
                  @http_client = HttpClient.new(@config, logger)
         
     | 
| 
       28 
31 
     | 
    
         
             
                  @event_data_builder = EventDataBuilder.new(@config)
         
     | 
| 
       29 
32 
     | 
    
         
             
                  @server_side = ServerSide.new(@event_data_builder, @http_client)
         
     | 
| 
       30 
     | 
    
         
            -
                  @filter 
     | 
| 
       31 
     | 
    
         
            -
                  @dispatcher 
     | 
| 
      
 33 
     | 
    
         
            +
                  @filter = ErrorFilter.new
         
     | 
| 
      
 34 
     | 
    
         
            +
                  @dispatcher = Dispatcher.new(@filter, @server_side)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  @queue = Queue.new
         
     | 
| 
       32 
36 
     | 
    
         
             
                end
         
     | 
| 
       33 
37 
     | 
    
         | 
| 
       34 
38 
     | 
    
         
             
                def send_exception(exception, environment = {})
         
     | 
| 
       35 
39 
     | 
    
         
             
                  send_error(Error.new(exception, environment))
         
     | 
| 
       36 
40 
     | 
    
         
             
                end
         
     | 
| 
       37 
41 
     | 
    
         | 
| 
      
 42 
     | 
    
         
            +
                def enqueue(creations)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  @queue << creations
         
     | 
| 
      
 44 
     | 
    
         
            +
                end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                def start_worker
         
     | 
| 
      
 47 
     | 
    
         
            +
                  thread = Thread.new do
         
     | 
| 
      
 48 
     | 
    
         
            +
                    worker = Worker.new(@dispatcher, @queue, @logger)
         
     | 
| 
      
 49 
     | 
    
         
            +
                    worker.run
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
       38 
53 
     | 
    
         
             
                private
         
     | 
| 
       39 
54 
     | 
    
         
             
                def build_config(config_or_api_key, options)
         
     | 
| 
       40 
55 
     | 
    
         
             
                  case config_or_api_key
         
     | 
| 
         @@ -4,18 +4,28 @@ module Chillout 
     | 
|
| 
       4 
4 
     | 
    
         
             
                  @container = Hash.new {|hash, key| hash[key] = 0}
         
     | 
| 
       5 
5 
     | 
    
         
             
                end
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
                def increment!(class_name)
         
     | 
| 
       8 
     | 
    
         
            -
                  key = class_name 
     | 
| 
       9 
     | 
    
         
            -
                  @container[key] +=  
     | 
| 
      
 7 
     | 
    
         
            +
                def increment!(class_name, value=1)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  key = key(class_name)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @container[key] += value
         
     | 
| 
       10 
10 
     | 
    
         
             
                end
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                def [](name)
         
     | 
| 
       13 
     | 
    
         
            -
                  key = name 
     | 
| 
      
 13 
     | 
    
         
            +
                  key = key(name)
         
     | 
| 
       14 
14 
     | 
    
         
             
                  @container[key]
         
     | 
| 
       15 
15 
     | 
    
         
             
                end
         
     | 
| 
       16 
16 
     | 
    
         | 
| 
      
 17 
     | 
    
         
            +
                def key(name)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  name.to_sym
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
       17 
21 
     | 
    
         
             
                def resource_keys
         
     | 
| 
       18 
22 
     | 
    
         
             
                  @container.keys
         
     | 
| 
       19 
23 
     | 
    
         
             
                end
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
                def merge(other_container)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  for key in other_container.resource_keys
         
     | 
| 
      
 27 
     | 
    
         
            +
                    increment!(key, other_container[key])
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
       20 
30 
     | 
    
         
             
              end
         
     | 
| 
       21 
31 
     | 
    
         
             
            end
         
     | 
| 
         @@ -8,8 +8,9 @@ module Chillout 
     | 
|
| 
       8 
8 
     | 
    
         | 
| 
       9 
9 
     | 
    
         
             
                  def call(env)
         
     | 
| 
       10 
10 
     | 
    
         
             
                    response = @app.call(env)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  ensure
         
     | 
| 
       11 
12 
     | 
    
         
             
                    if Thread.current[:creations]
         
     | 
| 
       12 
     | 
    
         
            -
                      @client. 
     | 
| 
      
 13 
     | 
    
         
            +
                      @client.enqueue(Thread.current[:creations])
         
     | 
| 
       13 
14 
     | 
    
         
             
                      Thread.current[:creations] = nil
         
     | 
| 
       14 
15 
     | 
    
         
             
                    end
         
     | 
| 
       15 
16 
     | 
    
         
             
                    response
         
     | 
    
        data/lib/chillout/railtie.rb
    CHANGED
    
    
    
        data/lib/chillout/version.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,31 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module Chillout
         
     | 
| 
      
 2 
     | 
    
         
            +
              class Worker
         
     | 
| 
      
 3 
     | 
    
         
            +
                attr_reader :dispatcher, :queue, :logger
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                def initialize(dispatcher, queue, logger)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  @dispatcher = dispatcher
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @queue = queue
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @logger = logger
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                def run
         
     | 
| 
      
 12 
     | 
    
         
            +
                  loop do
         
     | 
| 
      
 13 
     | 
    
         
            +
                    containers_to_merge = [queue.pop]
         
     | 
| 
      
 14 
     | 
    
         
            +
                    loop do
         
     | 
| 
      
 15 
     | 
    
         
            +
                      begin
         
     | 
| 
      
 16 
     | 
    
         
            +
                        containers_to_merge << queue.pop(true)
         
     | 
| 
      
 17 
     | 
    
         
            +
                      rescue ThreadError
         
     | 
| 
      
 18 
     | 
    
         
            +
                        break
         
     | 
| 
      
 19 
     | 
    
         
            +
                      end
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end
         
     | 
| 
      
 21 
     | 
    
         
            +
                    creations_container = CreationsContainer.new
         
     | 
| 
      
 22 
     | 
    
         
            +
                    for container in containers_to_merge
         
     | 
| 
      
 23 
     | 
    
         
            +
                      creations_container.merge(container)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
                    dispatcher.send_creations(creations_container)
         
     | 
| 
      
 26 
     | 
    
         
            +
                    logger.info "Sending metrics"
         
     | 
| 
      
 27 
     | 
    
         
            +
                    sleep 5
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
              end
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -3,10 +3,25 @@ require 'chillout/creations_container' 
     | 
|
| 
       3 
3 
     | 
    
         | 
| 
       4 
4 
     | 
    
         
             
            module Chillout
         
     | 
| 
       5 
5 
     | 
    
         
             
              class CreationsContainerTest < ChilloutTestCase
         
     | 
| 
      
 6 
     | 
    
         
            +
                def setup
         
     | 
| 
      
 7 
     | 
    
         
            +
                  @creations_container = CreationsContainer.new
         
     | 
| 
      
 8 
     | 
    
         
            +
                end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
       6 
10 
     | 
    
         
             
                def test_increment_model
         
     | 
| 
       7 
     | 
    
         
            -
                  creations_container 
     | 
| 
       8 
     | 
    
         
            -
                  creations_container 
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
      
 11 
     | 
    
         
            +
                  @creations_container.increment!("User")
         
     | 
| 
      
 12 
     | 
    
         
            +
                  assert_equal 1, @creations_container[:User]
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def test_merge
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @first_to_merge = CreationsContainer.new
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @first_to_merge.increment!("User", 2)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  @second_to_merge = CreationsContainer.new
         
     | 
| 
      
 19 
     | 
    
         
            +
                  @second_to_merge.increment!("User")
         
     | 
| 
      
 20 
     | 
    
         
            +
                  @second_to_merge.increment!("Entity")
         
     | 
| 
      
 21 
     | 
    
         
            +
                  @creations_container.merge(@first_to_merge)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  @creations_container.merge(@second_to_merge)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  assert_equal 3, @creations_container[:User]
         
     | 
| 
      
 24 
     | 
    
         
            +
                  assert_equal 1, @creations_container[:Entity]
         
     | 
| 
       10 
25 
     | 
    
         
             
                end
         
     | 
| 
       11 
26 
     | 
    
         
             
              end
         
     | 
| 
       12 
27 
     | 
    
         
             
            end
         
     | 
| 
         @@ -11,6 +11,7 @@ module Chillout 
     | 
|
| 
       11 
11 
     | 
    
         
             
                  @config = Chillout::Config.new(api_key)
         
     | 
| 
       12 
12 
     | 
    
         
             
                  @config.ssl = false
         
     | 
| 
       13 
13 
     | 
    
         
             
                  @client = Chillout::Client.new(@config)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @client.start_worker
         
     | 
| 
       14 
15 
     | 
    
         
             
                end
         
     | 
| 
       15 
16 
     | 
    
         | 
| 
       16 
17 
     | 
    
         
             
                def app
         
     | 
| 
         @@ -29,6 +30,7 @@ module Chillout 
     | 
|
| 
       29 
30 
     | 
    
         | 
| 
       30 
31 
     | 
    
         
             
                def test_creations_values
         
     | 
| 
       31 
32 
     | 
    
         
             
                  get "/"
         
     | 
| 
      
 33 
     | 
    
         
            +
                  Thread.pass
         
     | 
| 
       32 
34 
     | 
    
         
             
                  assert_equal 2, request_body["content"]["creations"]["User"]
         
     | 
| 
       33 
35 
     | 
    
         
             
                  assert_equal 3, request_body["content"]["creations"]["Cart"]
         
     | 
| 
       34 
36 
     | 
    
         
             
                end
         
     | 
| 
         @@ -18,14 +18,13 @@ module Chillout 
     | 
|
| 
       18 
18 
     | 
    
         
             
                    end
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                    def test_behaves_like_rack_middleware
         
     | 
| 
       21 
     | 
    
         
            -
                      @client.stubs(: 
     | 
| 
      
 21 
     | 
    
         
            +
                      @client.stubs(:enqueue)
         
     | 
| 
       22 
22 
     | 
    
         
             
                      response = @middleware.call(@env)
         
     | 
| 
       23 
     | 
    
         
            -
             
     | 
| 
       24 
23 
     | 
    
         
             
                      assert_equal [200, @env, ['hello']], response
         
     | 
| 
       25 
24 
     | 
    
         
             
                    end
         
     | 
| 
       26 
25 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                    def  
     | 
| 
       28 
     | 
    
         
            -
                      @client.expects(: 
     | 
| 
      
 26 
     | 
    
         
            +
                    def test_clients_queue_receive_creations
         
     | 
| 
      
 27 
     | 
    
         
            +
                      @client.expects(:enqueue).with(:creations)
         
     | 
| 
       29 
28 
     | 
    
         | 
| 
       30 
29 
     | 
    
         
             
                      @middleware.call(@env)
         
     | 
| 
       31 
30 
     | 
    
         
             
                    end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: chillout
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.2. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.2.2
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -10,7 +10,7 @@ authors: 
     | 
|
| 
       10 
10 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       11 
11 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       12 
12 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       13 
     | 
    
         
            -
            date: 2013-03- 
     | 
| 
      
 13 
     | 
    
         
            +
            date: 2013-03-12 00:00:00.000000000 Z
         
     | 
| 
       14 
14 
     | 
    
         
             
            dependencies:
         
     | 
| 
       15 
15 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       16 
16 
     | 
    
         
             
              name: minitest
         
     | 
| 
         @@ -139,6 +139,7 @@ files: 
     | 
|
| 
       139 
139 
     | 
    
         
             
            - lib/chillout/railtie.rb
         
     | 
| 
       140 
140 
     | 
    
         
             
            - lib/chillout/server_side.rb
         
     | 
| 
       141 
141 
     | 
    
         
             
            - lib/chillout/version.rb
         
     | 
| 
      
 142 
     | 
    
         
            +
            - lib/chillout/worker.rb
         
     | 
| 
       142 
143 
     | 
    
         
             
            - test/client_test.rb
         
     | 
| 
       143 
144 
     | 
    
         
             
            - test/config_test.rb
         
     | 
| 
       144 
145 
     | 
    
         
             
            - test/creations_container_test.rb
         
     | 
| 
         @@ -168,7 +169,7 @@ required_ruby_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       168 
169 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       169 
170 
     | 
    
         
             
                  segments:
         
     | 
| 
       170 
171 
     | 
    
         
             
                  - 0
         
     | 
| 
       171 
     | 
    
         
            -
                  hash:  
     | 
| 
      
 172 
     | 
    
         
            +
                  hash: -4082367495555425928
         
     | 
| 
       172 
173 
     | 
    
         
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
       173 
174 
     | 
    
         
             
              none: false
         
     | 
| 
       174 
175 
     | 
    
         
             
              requirements:
         
     | 
| 
         @@ -177,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement 
     | 
|
| 
       177 
178 
     | 
    
         
             
                  version: '0'
         
     | 
| 
       178 
179 
     | 
    
         
             
                  segments:
         
     | 
| 
       179 
180 
     | 
    
         
             
                  - 0
         
     | 
| 
       180 
     | 
    
         
            -
                  hash:  
     | 
| 
      
 181 
     | 
    
         
            +
                  hash: -4082367495555425928
         
     | 
| 
       181 
182 
     | 
    
         
             
            requirements: []
         
     | 
| 
       182 
183 
     | 
    
         
             
            rubyforge_project: 
         
     | 
| 
       183 
184 
     | 
    
         
             
            rubygems_version: 1.8.25
         
     |