chillout 0.8.2 → 0.8.3
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.
- checksums.yaml +4 -4
- data/.travis.yml +5 -5
- data/CHANGELOG.md +7 -0
- data/lib/chillout/client.rb +12 -9
- data/lib/chillout/config.rb +21 -3
- data/lib/chillout/creations_container.rb +26 -0
- data/lib/chillout/job.rb +3 -3
- data/lib/chillout/railtie.rb +21 -4
- data/lib/chillout/server_side/dispatcher.rb +2 -2
- data/lib/chillout/server_side/server_side.rb +12 -11
- data/lib/chillout/subscribers/action_controller_notifications.rb +49 -0
- data/lib/chillout/version.rb +1 -1
- data/lib/chillout/worker.rb +13 -10
- data/lib/chillout.rb +1 -0
- data/test/acceptance/client_sends_controller_performance_test.rb +33 -0
- data/test/acceptance/client_sends_metrics_test.rb +5 -3
- data/test/client_test.rb +14 -1
- data/test/config_test.rb +14 -0
- data/test/creations_container_test.rb +48 -1
- data/test/dispatcher_test.rb +4 -4
- data/test/integration/creations_monitor_rack_test.rb +3 -3
- data/test/server_side_test.rb +0 -12
- data/test/subscribers/action_controller_notifications_test.rb +48 -0
- data/test/support/rails_4_0_0/config/environments/production.rb +7 -1
- data/test/support/rails_4_0_13/config/environments/production.rb +7 -1
- data/test/support/rails_4_1_0/config/environments/production.rb +7 -1
- data/test/support/rails_4_1_16/config/environments/production.rb +7 -1
- data/test/support/rails_4_2_0/config/environments/production.rb +1 -0
- data/test/test_helper.rb +18 -2
- data/test/worker_test.rb +43 -18
- metadata +7 -77
- data/lib/chillout/event_data_builder.rb +0 -34
- data/test/event_data_builder_test.rb +0 -90
- data/test/support/rails_3_2_13/Gemfile +0 -5
- data/test/support/rails_3_2_13/Rakefile +0 -7
- data/test/support/rails_3_2_13/app/controllers/application_controller.rb +0 -3
- data/test/support/rails_3_2_13/app/controllers/entities_controller.rb +0 -70
- data/test/support/rails_3_2_13/app/helpers/application_helper.rb +0 -2
- data/test/support/rails_3_2_13/app/models/entity.rb +0 -3
- data/test/support/rails_3_2_13/app/views/entities/_form.html.erb +0 -21
- data/test/support/rails_3_2_13/app/views/entities/edit.html.erb +0 -6
- data/test/support/rails_3_2_13/app/views/entities/index.html.erb +0 -23
- data/test/support/rails_3_2_13/app/views/entities/new.html.erb +0 -5
- data/test/support/rails_3_2_13/app/views/entities/show.html.erb +0 -10
- data/test/support/rails_3_2_13/app/views/layouts/application.html.erb +0 -14
- data/test/support/rails_3_2_13/config/application.rb +0 -63
- data/test/support/rails_3_2_13/config/boot.rb +0 -6
- data/test/support/rails_3_2_13/config/database.yml +0 -11
- data/test/support/rails_3_2_13/config/environment.rb +0 -5
- data/test/support/rails_3_2_13/config/environments/development.rb +0 -32
- data/test/support/rails_3_2_13/config/environments/production.rb +0 -56
- data/test/support/rails_3_2_13/config/environments/test.rb +0 -37
- data/test/support/rails_3_2_13/config/initializers/backtrace_silencers.rb +0 -7
- data/test/support/rails_3_2_13/config/initializers/inflections.rb +0 -15
- data/test/support/rails_3_2_13/config/initializers/load_schema.rb +0 -4
- data/test/support/rails_3_2_13/config/initializers/mime_types.rb +0 -5
- data/test/support/rails_3_2_13/config/initializers/secret_token.rb +0 -7
- data/test/support/rails_3_2_13/config/initializers/session_store.rb +0 -8
- data/test/support/rails_3_2_13/config/initializers/wrap_parameters.rb +0 -14
- data/test/support/rails_3_2_13/config/locales/en.yml +0 -5
- data/test/support/rails_3_2_13/config/routes.rb +0 -3
- data/test/support/rails_3_2_13/config.ru +0 -4
- data/test/support/rails_3_2_13/db/schema.rb +0 -22
- data/test/support/rails_3_2_13/public/404.html +0 -26
- data/test/support/rails_3_2_13/public/422.html +0 -26
- data/test/support/rails_3_2_13/public/500.html +0 -25
- data/test/support/rails_3_2_13/public/favicon.ico +0 -0
- data/test/support/rails_3_2_13/public/robots.txt +0 -5
- data/test/support/rails_3_2_13/script/rails +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8423a0fd777360d79146e8270eeb5536f6132e4f
|
4
|
+
data.tar.gz: 1a2b4337e6ab9d2b62a13a111788f33b192d23a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 952cbad057b400710e7af9ed61e3f012476f673a3f5d6b4733b09f30d50a950517d42d1c24154a4c8cce1746a19cc63f623e23bdd2b7a54a5a5a594ce12a4d4f
|
7
|
+
data.tar.gz: edde4d6c71087cc05108310b764aedc3bed7e10b390f87f49506b7a9698955b2c0ebad3c642d2d120de7f596dc46b2439a90a5344bf780b4c11b76937d3daab1
|
data/.travis.yml
CHANGED
@@ -26,18 +26,18 @@ matrix:
|
|
26
26
|
- rvm: 2.4.1
|
27
27
|
env: SAMPLE_APP=rails_4_1_16
|
28
28
|
- rvm: 2.4.1
|
29
|
-
env: SAMPLE_APP=rails_4_2_0
|
29
|
+
env: SAMPLE_APP=rails_4_2_0 SIDEKIQ_SUPPORTED=true
|
30
30
|
- rvm: 2.1.10
|
31
|
-
env: SAMPLE_APP=rails_4_2_8
|
31
|
+
env: SAMPLE_APP=rails_4_2_8 SIDEKIQ_SUPPORTED=true
|
32
32
|
- rvm: 2.1.10
|
33
|
-
env: SAMPLE_APP=rails_5_0_3
|
33
|
+
env: SAMPLE_APP=rails_5_0_3 SIDEKIQ_SUPPORTED=true
|
34
34
|
- rvm: 2.1.10
|
35
35
|
env: SAMPLE_APP=rails_5_1_1 SIDEKIQ_SUPPORTED=true
|
36
36
|
include:
|
37
37
|
- rvm: 2.4.1
|
38
|
-
env: SAMPLE_APP=rails_4_2_8 STRATEGY=active_job
|
38
|
+
env: SAMPLE_APP=rails_4_2_8 STRATEGY=active_job SIDEKIQ_SUPPORTED=true
|
39
39
|
- rvm: 2.4.1
|
40
|
-
env: SAMPLE_APP=rails_5_0_3 STRATEGY=active_job
|
40
|
+
env: SAMPLE_APP=rails_5_0_3 STRATEGY=active_job SIDEKIQ_SUPPORTED=true
|
41
41
|
- rvm: 2.4.1
|
42
42
|
env: SAMPLE_APP=rails_5_1_1 STRATEGY=active_job SIDEKIQ_SUPPORTED=true
|
43
43
|
notifications:
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# chillout gem changes
|
2
2
|
|
3
|
+
0.8.3
|
4
|
+
-----
|
5
|
+
|
6
|
+
- Introduced ActionController performance tracking.
|
7
|
+
- Added ability to disabled automatic ActiveRecord creations tracking by passing `creations_tracking: false` via config.
|
8
|
+
- Added ability to disabled automatic ActionController performance tracking by passing `requests_tracking: false` via config.
|
9
|
+
|
3
10
|
0.8.2
|
4
11
|
-----
|
5
12
|
|
data/lib/chillout/client.rb
CHANGED
@@ -3,7 +3,6 @@ require 'chillout/server_side/server_side'
|
|
3
3
|
require 'chillout/server_side/http_client'
|
4
4
|
require 'chillout/server_side/dispatcher'
|
5
5
|
require 'chillout/config'
|
6
|
-
require 'chillout/event_data_builder'
|
7
6
|
require 'chillout/prefixed_logger'
|
8
7
|
require 'chillout/worker'
|
9
8
|
require 'chillout/check_result'
|
@@ -27,14 +26,14 @@ module Chillout
|
|
27
26
|
@logger = PrefixedLogger.new("Chillout", @config.logger)
|
28
27
|
|
29
28
|
@http_client = HttpClient.new(@config, logger).freeze
|
30
|
-
@
|
31
|
-
@server_side = ServerSide.new(@event_data_builder, @http_client).freeze
|
29
|
+
@server_side = ServerSide.new(@config, @http_client).freeze
|
32
30
|
@dispatcher = Dispatcher.new(@server_side).freeze
|
33
31
|
case @config.strategy
|
34
32
|
when :thread
|
35
33
|
@queue = Queue.new
|
36
34
|
@worker_mutex = Mutex.new
|
37
35
|
@worker_thread = nil
|
36
|
+
@max_queue = config.max_queue
|
38
37
|
when :active_job
|
39
38
|
require 'chillout/job'
|
40
39
|
Chillout::Job.dispatcher = @dispatcher
|
@@ -49,15 +48,19 @@ module Chillout
|
|
49
48
|
end
|
50
49
|
end
|
51
50
|
|
52
|
-
def enqueue(
|
51
|
+
def enqueue(metrics)
|
53
52
|
case @config.strategy
|
54
53
|
when :thread
|
55
54
|
start_worker
|
56
|
-
@
|
57
|
-
|
55
|
+
if @queue.size < @max_queue
|
56
|
+
@queue << metrics
|
57
|
+
@logger.debug "Metrics were enqueued."
|
58
|
+
else
|
59
|
+
@logger.error "Metrics buffer overflow. Skipping enqueue."
|
60
|
+
end
|
58
61
|
when :active_job
|
59
|
-
|
60
|
-
|
62
|
+
Chillout::Job.perform_later(YAML.dump(metrics))
|
63
|
+
@logger.debug "Metrics were enqueued."
|
61
64
|
end
|
62
65
|
end
|
63
66
|
|
@@ -70,7 +73,7 @@ module Chillout
|
|
70
73
|
@worker_mutex.synchronize do
|
71
74
|
return if worker_running?
|
72
75
|
@worker_thread = Thread.new do
|
73
|
-
worker = Worker.new(@dispatcher, @queue, @logger)
|
76
|
+
worker = Worker.new(@max_queue, @dispatcher, @queue, @logger)
|
74
77
|
worker.run
|
75
78
|
end
|
76
79
|
end
|
data/lib/chillout/config.rb
CHANGED
@@ -17,15 +17,18 @@ module Chillout
|
|
17
17
|
attr_accessor :platform
|
18
18
|
attr_accessor :hostname
|
19
19
|
attr_accessor :port
|
20
|
-
|
20
|
+
attr_reader :api_key
|
21
21
|
attr_writer :authentication_user
|
22
22
|
attr_writer :authentication_password
|
23
23
|
attr_accessor :logger
|
24
24
|
attr_accessor :ssl
|
25
25
|
attr_reader :strategy
|
26
|
+
attr_accessor :max_queue
|
27
|
+
attr_accessor :creations_tracking
|
28
|
+
attr_accessor :requests_tracking
|
26
29
|
|
27
|
-
def initialize(api_key =
|
28
|
-
|
30
|
+
def initialize(api_key = '')
|
31
|
+
self.api_key = api_key
|
29
32
|
@hostname = DEFAULT_HOSTNAME
|
30
33
|
@port = DEFAULT_PORT
|
31
34
|
@notifier_name = DEFAULT_NOTIFIER_NAME
|
@@ -34,6 +37,9 @@ module Chillout
|
|
34
37
|
@logger = Logger.new(STDOUT)
|
35
38
|
@ssl = true
|
36
39
|
@strategy = :thread
|
40
|
+
@max_queue = 5_000
|
41
|
+
@creations_tracking = true
|
42
|
+
@requests_tracking = true
|
37
43
|
|
38
44
|
@authentication_user = nil
|
39
45
|
@authentication_password = nil
|
@@ -45,6 +51,18 @@ module Chillout
|
|
45
51
|
end
|
46
52
|
end
|
47
53
|
|
54
|
+
def api_key=(value)
|
55
|
+
if String === value
|
56
|
+
@api_key = value
|
57
|
+
else
|
58
|
+
raise ArgumentError.new("Invalid config passed")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def secret=(value)
|
63
|
+
self.api_key = value
|
64
|
+
end
|
65
|
+
|
48
66
|
def strategy=(name)
|
49
67
|
name = name.to_sym
|
50
68
|
precondition = {
|
@@ -18,6 +18,10 @@ module Chillout
|
|
18
18
|
name.to_sym
|
19
19
|
end
|
20
20
|
|
21
|
+
def each(&proc)
|
22
|
+
@container.each(&proc)
|
23
|
+
end
|
24
|
+
|
21
25
|
def resource_keys
|
22
26
|
@container.keys
|
23
27
|
end
|
@@ -27,5 +31,27 @@ module Chillout
|
|
27
31
|
increment!(key, other_container[key])
|
28
32
|
end
|
29
33
|
end
|
34
|
+
|
35
|
+
def ==(other)
|
36
|
+
self.class == other.class &&
|
37
|
+
@container == other.instance_variable_get(:@container)
|
38
|
+
end
|
39
|
+
|
40
|
+
def empty?
|
41
|
+
@container.empty?
|
42
|
+
end
|
43
|
+
|
44
|
+
def as_measurements(timestamp = Time.now)
|
45
|
+
iso_timestamp = timestamp.iso8601
|
46
|
+
@container.each.map do |model_name, value|
|
47
|
+
{
|
48
|
+
series: model_name.to_s,
|
49
|
+
tags: {},
|
50
|
+
timestamp: iso_timestamp,
|
51
|
+
values: { creations: value },
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
30
56
|
end
|
31
57
|
end
|
data/lib/chillout/job.rb
CHANGED
@@ -5,8 +5,8 @@ class Chillout::Job < ActiveJob::Base
|
|
5
5
|
attr_accessor :dispatcher
|
6
6
|
end
|
7
7
|
|
8
|
-
def perform(
|
9
|
-
|
10
|
-
self.class.dispatcher.
|
8
|
+
def perform(serialized_metric)
|
9
|
+
measurement = YAML.load(serialized_metric)
|
10
|
+
self.class.dispatcher.send_measurements([measurement])
|
11
11
|
end
|
12
12
|
end
|
data/lib/chillout/railtie.rb
CHANGED
@@ -34,17 +34,34 @@ module Chillout
|
|
34
34
|
listeners_injector.logger = @rails_logger
|
35
35
|
|
36
36
|
@rails_logger.info "[Chillout] Railtie initializing"
|
37
|
-
|
38
|
-
|
37
|
+
config = build_config(options)
|
38
|
+
client = Client.new(config)
|
39
|
+
if config.creations_tracking
|
40
|
+
listeners_injector.inject!
|
41
|
+
@rails_logger.info "[Chillout] Creation monitor enabled"
|
42
|
+
end
|
39
43
|
@rails_app.middleware.use Middleware::CreationsMonitor, client
|
40
|
-
|
44
|
+
|
41
45
|
sidekiq = Integrations::Sidekiq.new
|
42
46
|
sidekiq.enable(client) if sidekiq.available?
|
47
|
+
|
48
|
+
if config.requests_tracking
|
49
|
+
@rails_logger.info "[Chillout] Requests monitor enabled"
|
50
|
+
Subscribers::ActionControllerNotifications.new.enable(client)
|
51
|
+
end
|
43
52
|
client.start
|
44
53
|
end
|
45
54
|
|
55
|
+
private
|
56
|
+
|
46
57
|
def options
|
47
|
-
{logger: @rails_logger}.merge(@chillout_config)
|
58
|
+
{logger: @rails_logger}.merge(@chillout_config)
|
59
|
+
end
|
60
|
+
|
61
|
+
def build_config(options)
|
62
|
+
config = Config.new
|
63
|
+
config.update(options)
|
64
|
+
config
|
48
65
|
end
|
49
66
|
|
50
67
|
end
|
@@ -7,8 +7,8 @@ module Chillout
|
|
7
7
|
@server_side = server_side
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
11
|
-
@server_side.
|
10
|
+
def send_measurements(measurements)
|
11
|
+
@server_side.send_measurements(measurements)
|
12
12
|
rescue HttpClient::NotSent
|
13
13
|
raise SendCreationsFailed.new
|
14
14
|
end
|
@@ -1,17 +1,22 @@
|
|
1
1
|
require 'time'
|
2
|
-
require 'chillout/event_data_builder'
|
3
2
|
|
4
3
|
module Chillout
|
5
4
|
class ServerSide
|
6
5
|
|
7
|
-
def initialize(
|
6
|
+
def initialize(config, http_client)
|
8
7
|
@http_client = http_client
|
9
|
-
@
|
8
|
+
@config = config
|
10
9
|
end
|
11
10
|
|
12
|
-
def
|
13
|
-
|
14
|
-
|
11
|
+
def send_measurements(measurements)
|
12
|
+
send_metric(
|
13
|
+
:measurements => measurements.map(&:as_measurements).flatten,
|
14
|
+
:notifier => {
|
15
|
+
name: @config.notifier_name,
|
16
|
+
version: @config.version,
|
17
|
+
url: @config.notifier_url,
|
18
|
+
}
|
19
|
+
)
|
15
20
|
end
|
16
21
|
|
17
22
|
def send_metric(data)
|
@@ -28,9 +33,5 @@ module Chillout
|
|
28
33
|
})
|
29
34
|
end
|
30
35
|
|
31
|
-
private
|
32
|
-
def timestamp
|
33
|
-
Time.now.iso8601
|
34
|
-
end
|
35
36
|
end
|
36
|
-
end
|
37
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module Chillout
|
2
|
+
module Subscribers
|
3
|
+
class ActionControllerNotifications
|
4
|
+
|
5
|
+
class RequestMetric
|
6
|
+
def initialize(event)
|
7
|
+
@end = event.end
|
8
|
+
@duration = event.duration
|
9
|
+
@payload = event.payload.except(:headers)
|
10
|
+
end
|
11
|
+
|
12
|
+
def as_measurements()
|
13
|
+
format = (payload[:format] || "all").to_s
|
14
|
+
format = "all" if format == "*/*"
|
15
|
+
|
16
|
+
[{
|
17
|
+
series: "request",
|
18
|
+
tags: {
|
19
|
+
controller: payload[:controller],
|
20
|
+
action: payload[:action],
|
21
|
+
format: format,
|
22
|
+
method: payload[:method],
|
23
|
+
status: payload[:status],
|
24
|
+
},
|
25
|
+
timestamp: self.end.iso8601,
|
26
|
+
values: {
|
27
|
+
finished: 1,
|
28
|
+
duration: duration,
|
29
|
+
db: payload[:db_runtime] || 0,
|
30
|
+
view: payload[:view_runtime] || 0,
|
31
|
+
},
|
32
|
+
}]
|
33
|
+
end
|
34
|
+
|
35
|
+
attr_reader :end, :duration, :payload
|
36
|
+
end
|
37
|
+
|
38
|
+
def enable(client)
|
39
|
+
name = "process_action.action_controller"
|
40
|
+
ActiveSupport::Notifications.subscribe(name) do |*args|
|
41
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
42
|
+
metric = RequestMetric.new(event)
|
43
|
+
client.enqueue(metric)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/chillout/version.rb
CHANGED
data/lib/chillout/worker.rb
CHANGED
@@ -2,7 +2,8 @@ module Chillout
|
|
2
2
|
class Worker
|
3
3
|
attr_reader :dispatcher, :queue, :logger
|
4
4
|
|
5
|
-
def initialize(dispatcher, queue, logger, container_class=CreationsContainer)
|
5
|
+
def initialize(max_queue, dispatcher, queue, logger, container_class=CreationsContainer)
|
6
|
+
@max_queue = max_queue
|
6
7
|
@dispatcher = dispatcher
|
7
8
|
@queue = queue
|
8
9
|
@logger = logger
|
@@ -13,7 +14,7 @@ module Chillout
|
|
13
14
|
logger.debug "Waiting for at least one container."
|
14
15
|
all_containers = [queue.pop]
|
15
16
|
logger.debug "Received at least one container."
|
16
|
-
|
17
|
+
(@max_queue-1).times do
|
17
18
|
begin
|
18
19
|
all_containers << queue.pop(true)
|
19
20
|
rescue ThreadError
|
@@ -25,19 +26,20 @@ module Chillout
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def merge_containers(containers_to_merge)
|
29
|
+
mergable, unmergable = containers_to_merge.partition{|cont| @container_class === cont }
|
28
30
|
creations_container = @container_class.new
|
29
|
-
|
31
|
+
mergable.each do |container|
|
30
32
|
creations_container.merge(container)
|
31
33
|
end
|
32
|
-
creations_container
|
34
|
+
unmergable.unshift(creations_container) unless creations_container.empty?
|
35
|
+
unmergable
|
33
36
|
end
|
34
37
|
|
35
|
-
def
|
38
|
+
def send_measurements(measurements)
|
36
39
|
logger.debug "Trying to send creations"
|
37
|
-
dispatcher.
|
40
|
+
dispatcher.send_measurements(measurements)
|
38
41
|
logger.info "Metrics sent"
|
39
42
|
rescue Dispatcher::SendCreationsFailed
|
40
|
-
queue << creations_container
|
41
43
|
logger.error "Sending metrics failed"
|
42
44
|
end
|
43
45
|
|
@@ -51,10 +53,11 @@ module Chillout
|
|
51
53
|
send_startup_message
|
52
54
|
loop do
|
53
55
|
containers_to_merge = get_all_containers_to_process
|
54
|
-
|
55
|
-
|
56
|
+
measurements = merge_containers(containers_to_merge)
|
57
|
+
send_measurements(measurements)
|
56
58
|
sleep 5
|
57
59
|
end
|
58
60
|
end
|
61
|
+
|
59
62
|
end
|
60
|
-
end
|
63
|
+
end
|
data/lib/chillout.rb
CHANGED
@@ -2,6 +2,7 @@ require "chillout/version"
|
|
2
2
|
require "chillout/config"
|
3
3
|
require "chillout/middleware/creations_monitor"
|
4
4
|
require "chillout/integrations/sidekiq"
|
5
|
+
require "chillout/subscribers/action_controller_notifications"
|
5
6
|
require "chillout/server_side/dispatcher"
|
6
7
|
require "chillout/server_side/server_side"
|
7
8
|
require "chillout/server_side/http_client"
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ClientSendsControllerPerformanceTest < AcceptanceTestCase
|
4
|
+
|
5
|
+
def test_client_sends_controller_metrics
|
6
|
+
test_app = TestApp.new
|
7
|
+
test_endpoint = TestEndpoint.new(port: 8082)
|
8
|
+
test_user = TestUser.new
|
9
|
+
|
10
|
+
test_endpoint.listen
|
11
|
+
test_app.boot(chillout_port: 8082)
|
12
|
+
if ENV['STRATEGY'] != 'active_job'
|
13
|
+
assert test_endpoint.has_received_information_about_startup
|
14
|
+
end
|
15
|
+
test_user.create_entity('Myrmecophagidae')
|
16
|
+
assert request = test_endpoint.has_one_controller_metric
|
17
|
+
|
18
|
+
assert_equal "request", request["series"]
|
19
|
+
assert_equal "EntitiesController", request["tags"]["controller"]
|
20
|
+
assert_equal "create", request["tags"]["action"]
|
21
|
+
assert_equal "all", request["tags"]["format"]
|
22
|
+
assert_equal "POST", request["tags"]["method"]
|
23
|
+
assert_equal 302, request["tags"]["status"]
|
24
|
+
|
25
|
+
assert_equal 1, request["values"]["finished"]
|
26
|
+
assert_operator 0, :<, request["values"]["duration"]
|
27
|
+
assert_operator 0, :<, request["values"]["db"]
|
28
|
+
assert_equal 0, request["values"]["view"]
|
29
|
+
ensure
|
30
|
+
test_app.shutdown if test_app
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -4,16 +4,18 @@ class ClientSendsMetricsTest < AcceptanceTestCase
|
|
4
4
|
|
5
5
|
def test_client_sends_metrics
|
6
6
|
test_app = TestApp.new
|
7
|
-
test_endpoint = TestEndpoint.new
|
7
|
+
test_endpoint = TestEndpoint.new(port: 8080)
|
8
8
|
test_user = TestUser.new
|
9
9
|
|
10
10
|
test_endpoint.listen
|
11
|
-
test_app.boot
|
11
|
+
test_app.boot(chillout_port: 8080)
|
12
12
|
if ENV['STRATEGY'] != 'active_job'
|
13
13
|
assert test_endpoint.has_received_information_about_startup
|
14
14
|
end
|
15
15
|
test_user.create_entity('Myrmecophagidae')
|
16
|
-
assert test_endpoint.has_one_creation_for_entity_resource
|
16
|
+
assert creation = test_endpoint.has_one_creation_for_entity_resource
|
17
|
+
assert_equal "Entity", creation["series"]
|
18
|
+
assert_equal 1, creation["values"]["creations"]
|
17
19
|
ensure
|
18
20
|
test_app.shutdown if test_app
|
19
21
|
end
|
data/test/client_test.rb
CHANGED
@@ -37,4 +37,17 @@ class ClientTest < ChilloutTestCase
|
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
40
|
-
|
40
|
+
def test_enqueues_up_to_5K_metrics
|
41
|
+
client = Chillout::Client.new("xyz")
|
42
|
+
client.queue.expects(:size).returns(4999)
|
43
|
+
client.queue.expects(:<<).returns(nil)
|
44
|
+
client.enqueue(Object.new)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_does_not_enqueue_more_than_5K_metrics
|
48
|
+
client = Chillout::Client.new("xyz")
|
49
|
+
client.queue.expects(:size).returns(5000)
|
50
|
+
client.queue.expects(:<<).never
|
51
|
+
client.enqueue(Object.new)
|
52
|
+
end
|
53
|
+
end
|
data/test/config_test.rb
CHANGED
@@ -11,6 +11,20 @@ class ConfigTest < ChilloutTestCase
|
|
11
11
|
assert_equal "xyz123", @config.api_key
|
12
12
|
end
|
13
13
|
|
14
|
+
def test_cannot_assing_wrong_api_key
|
15
|
+
assert_raises(ArgumentError) do
|
16
|
+
@config.api_key = Object.new
|
17
|
+
end
|
18
|
+
assert_raises(ArgumentError) do
|
19
|
+
Chillout::Config.new(Object.new)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_secret_setter
|
24
|
+
@config.secret = "SsEeCret"
|
25
|
+
assert_equal "SsEeCret", @config.api_key
|
26
|
+
end
|
27
|
+
|
14
28
|
def test_update_with_options_hash
|
15
29
|
@config.update(:platform => 'rack')
|
16
30
|
assert_equal 'rack', @config.platform
|
@@ -23,5 +23,52 @@ module Chillout
|
|
23
23
|
assert_equal 3, @creations_container[:User]
|
24
24
|
assert_equal 1, @creations_container[:Entity]
|
25
25
|
end
|
26
|
+
|
27
|
+
def test_equality
|
28
|
+
assert_equal CreationsContainer.new, CreationsContainer.new
|
29
|
+
assert_equal(
|
30
|
+
CreationsContainer.new.tap{|one| one.increment!("User") },
|
31
|
+
CreationsContainer.new.tap{|one| one.increment!("User") },
|
32
|
+
)
|
33
|
+
assert_equal(
|
34
|
+
CreationsContainer.new.tap{|one| one.increment!("User", 2) },
|
35
|
+
CreationsContainer.new.tap{|one| one.increment!("User", 2) },
|
36
|
+
)
|
37
|
+
refute_equal(
|
38
|
+
CreationsContainer.new.tap{|one| one.increment!("User", 3) },
|
39
|
+
CreationsContainer.new.tap{|one| one.increment!("User", 2) },
|
40
|
+
)
|
41
|
+
refute_equal(
|
42
|
+
CreationsContainer.new.tap{|one| one.increment!("User", 3) },
|
43
|
+
CreationsContainer.new.tap{|one| one.increment!("Post", 3) },
|
44
|
+
)
|
45
|
+
refute_equal(
|
46
|
+
Object.new,
|
47
|
+
CreationsContainer.new.tap{|one| one.increment!("Post", 3) },
|
48
|
+
)
|
49
|
+
refute_equal(
|
50
|
+
CreationsContainer.new.tap{|one| one.increment!("User", 3) },
|
51
|
+
Object.new,
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_build_measurements_from_creations_container
|
56
|
+
creations_container = CreationsContainer.new
|
57
|
+
5.times { creations_container.increment!("User") }
|
58
|
+
3.times { creations_container.increment!("Cart") }
|
59
|
+
timestamp = Time.utc(2017, 6, 26, 15, 57, 10)
|
60
|
+
|
61
|
+
assert_equal [{
|
62
|
+
series: "User",
|
63
|
+
tags: {},
|
64
|
+
timestamp: "2017-06-26T15:57:10Z",
|
65
|
+
values: { creations: 5 },
|
66
|
+
},{
|
67
|
+
series: "Cart",
|
68
|
+
tags: {},
|
69
|
+
timestamp: "2017-06-26T15:57:10Z",
|
70
|
+
values: { creations: 3 },
|
71
|
+
}], creations_container.as_measurements(timestamp)
|
72
|
+
end
|
26
73
|
end
|
27
|
-
end
|
74
|
+
end
|
data/test/dispatcher_test.rb
CHANGED
@@ -3,20 +3,20 @@ require 'test_helper'
|
|
3
3
|
class DispatcherTest < ChilloutTestCase
|
4
4
|
def test_send_creations
|
5
5
|
server_side = mock("ServerSide")
|
6
|
-
server_side.expects(:
|
6
|
+
server_side.expects(:send_measurements).with(:creations)
|
7
7
|
|
8
8
|
dispatcher = Chillout::Dispatcher.new(server_side)
|
9
|
-
dispatcher.
|
9
|
+
dispatcher.send_measurements(:creations)
|
10
10
|
end
|
11
11
|
|
12
12
|
def test_send_creations_raise_exception_if_server_side_failed_to_send_request
|
13
13
|
server_side = stub()
|
14
|
-
server_side.stubs(:
|
14
|
+
server_side.stubs(:send_measurements).raises(Chillout::HttpClient::NotSent.new(:http_error))
|
15
15
|
|
16
16
|
dispatcher = Chillout::Dispatcher.new(server_side)
|
17
17
|
|
18
18
|
assert_raises Chillout::Dispatcher::SendCreationsFailed do
|
19
|
-
dispatcher.
|
19
|
+
dispatcher.send_measurements(:creations)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -30,9 +30,9 @@ module Chillout
|
|
30
30
|
def test_creations_values
|
31
31
|
get "/"
|
32
32
|
Thread.pass
|
33
|
-
sleep
|
34
|
-
assert_equal 2, request_body["
|
35
|
-
assert_equal 3, request_body["
|
33
|
+
sleep 3
|
34
|
+
assert_equal 2, request_body["measurements"].find{|m| m["series"] == "User" }.fetch("values").fetch("creations")
|
35
|
+
assert_equal 3, request_body["measurements"].find{|m| m["series"] == "Cart" }.fetch("values").fetch("creations")
|
36
36
|
end
|
37
37
|
|
38
38
|
private
|
data/test/server_side_test.rb
CHANGED
@@ -8,16 +8,4 @@ class ServerSideTest < ChilloutTestCase
|
|
8
8
|
@http_client = mock("HttpClient")
|
9
9
|
@server_side = Chillout::ServerSide.new(@event_data_builder, @http_client)
|
10
10
|
end
|
11
|
-
|
12
|
-
def test_send_creations_use_event_data_builder
|
13
|
-
@event_data_builder.expects(:build_from_creations_container).with(:creations_container, anything).returns(:event_data_from_builder)
|
14
|
-
@http_client.stubs(:post)
|
15
|
-
@server_side.send_creations(:creations_container)
|
16
|
-
end
|
17
|
-
|
18
|
-
def test_send_creations_use_http_client
|
19
|
-
@event_data_builder.stubs(:build_from_creations_container).returns(:event_data_from_builder)
|
20
|
-
@http_client.expects(:post).with('/metrics', :event_data_from_builder)
|
21
|
-
@server_side.send_creations(:creations_container)
|
22
|
-
end
|
23
11
|
end
|