chillout 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|