harness 0.9.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +2 -0
- data/README.md +108 -323
- data/harness.gemspec +3 -12
- data/lib/harness.rb +69 -68
- data/lib/harness/async_queue.rb +29 -0
- data/lib/harness/fake_collector.rb +40 -0
- data/lib/harness/instrumentation.rb +21 -6
- data/lib/harness/null_collector.rb +23 -0
- data/lib/harness/subscription.rb +7 -0
- data/lib/harness/sync_queue.rb +14 -0
- data/lib/harness/version.rb +1 -1
- data/test/acceptance_test.rb +20 -0
- data/test/active_support_notifications_test.rb +93 -0
- data/test/async_queue_test.rb +14 -0
- data/test/instrumentation_test.rb +54 -0
- data/test/null_collector_test.rb +29 -0
- data/test/test_helper.rb +38 -34
- metadata +21 -196
- data/lib/harness/adapters/librato_adapter.rb +0 -90
- data/lib/harness/adapters/memory_adapter.rb +0 -27
- data/lib/harness/adapters/null_adapter.rb +0 -11
- data/lib/harness/adapters/stathat_adapter.rb +0 -75
- data/lib/harness/adapters/statsd_adapter.rb +0 -50
- data/lib/harness/consumer.rb +0 -35
- data/lib/harness/counter.rb +0 -29
- data/lib/harness/gauge.rb +0 -23
- data/lib/harness/integration/action_controller.rb +0 -9
- data/lib/harness/integration/action_mailer.rb +0 -9
- data/lib/harness/integration/action_view.rb +0 -9
- data/lib/harness/integration/active_model_serializers.rb +0 -9
- data/lib/harness/integration/active_support.rb +0 -9
- data/lib/harness/integration/sidekiq.rb +0 -47
- data/lib/harness/job.rb +0 -23
- data/lib/harness/measurement.rb +0 -43
- data/lib/harness/queues/delayed_job_queue.rb +0 -7
- data/lib/harness/queues/resque_queue.rb +0 -29
- data/lib/harness/queues/sidekiq_queue.rb +0 -31
- data/lib/harness/queues/synchronous_queue.rb +0 -18
- data/lib/harness/railtie.rb +0 -71
- data/lib/harness/tasks.rake +0 -6
- data/test/integration/counters_with_redis_test.rb +0 -67
- data/test/integration/instrumentation_test.rb +0 -50
- data/test/integration/integrations/action_controller_test.rb +0 -51
- data/test/integration/integrations/action_mailer_test.rb +0 -22
- data/test/integration/integrations/action_view_test.rb +0 -32
- data/test/integration/integrations/active_model_serializers_test.rb +0 -22
- data/test/integration/integrations/active_support_test.rb +0 -41
- data/test/integration/integrations/sidekiq_test.rb +0 -54
- data/test/integration/logging_test.rb +0 -17
- data/test/integration/queues/delayed_job_test.rb +0 -59
- data/test/integration/queues/resque_test.rb +0 -24
- data/test/integration/queues/sidekiq_test.rb +0 -34
- data/test/integration/railtie_test.rb +0 -26
- data/test/unit/adapters/librato_adapter_test.rb +0 -169
- data/test/unit/adapters/memory_adapter_test.rb +0 -22
- data/test/unit/adapters/stathat_adapter_test.rb +0 -144
- data/test/unit/adapters/statsd_adapter_test.rb +0 -74
- data/test/unit/counter_test.rb +0 -84
- data/test/unit/gauge_test.rb +0 -93
- data/test/unit/harness_test.rb +0 -39
- data/test/unit/measurement_test.rb +0 -76
data/lib/harness/job.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Harness
|
2
|
-
class Job
|
3
|
-
def log(measurement)
|
4
|
-
logger.debug "[Harness] Processing Measurement: #{measurement.inspect}"
|
5
|
-
|
6
|
-
case measurement.class.to_s.demodulize.underscore.to_sym
|
7
|
-
when :gauge
|
8
|
-
adapter.log_gauge measurement
|
9
|
-
when :counter
|
10
|
-
adapter.log_counter measurement
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
def logger
|
16
|
-
Harness.logger
|
17
|
-
end
|
18
|
-
|
19
|
-
def adapter
|
20
|
-
Harness.config.adapter
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
data/lib/harness/measurement.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Harness
|
2
|
-
class Measurement
|
3
|
-
attr_accessor :id, :name, :source, :time, :value, :units, :period
|
4
|
-
|
5
|
-
def initialize(attributes = {})
|
6
|
-
attributes.each_pair do |name, value|
|
7
|
-
send "#{name}=", value
|
8
|
-
end
|
9
|
-
|
10
|
-
self.time ||= Time.now
|
11
|
-
end
|
12
|
-
|
13
|
-
def time=(value)
|
14
|
-
if value.is_a? String
|
15
|
-
@time = DateTime.parse value
|
16
|
-
elsif value.is_a? Fixnum
|
17
|
-
@time = Time.at value
|
18
|
-
else
|
19
|
-
@time = value
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def log
|
24
|
-
Harness.log self
|
25
|
-
end
|
26
|
-
|
27
|
-
def source
|
28
|
-
@source || Harness.config.source
|
29
|
-
end
|
30
|
-
|
31
|
-
def attributes
|
32
|
-
{
|
33
|
-
:id => id,
|
34
|
-
:name => name,
|
35
|
-
:source => source,
|
36
|
-
:time => time,
|
37
|
-
:units => units,
|
38
|
-
:value => value,
|
39
|
-
:period => period
|
40
|
-
}
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Harness
|
2
|
-
class ResqueQueue
|
3
|
-
class SendGauge < Job
|
4
|
-
@queue = :metrics
|
5
|
-
|
6
|
-
def self.perform(attributes)
|
7
|
-
gauge = Gauge.new attributes
|
8
|
-
new.log gauge
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class SendCounter < Job
|
13
|
-
@queue = :metrics
|
14
|
-
|
15
|
-
def self.perform(attributes)
|
16
|
-
counter = Counter.new attributes
|
17
|
-
new.log counter
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def push(measurement)
|
22
|
-
if measurement.is_a? Gauge
|
23
|
-
Resque.enqueue SendGauge, measurement.attributes
|
24
|
-
elsif measurement.is_a? Counter
|
25
|
-
Resque.enqueue SendCounter, measurement.attributes
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Harness
|
2
|
-
class SidekiqQueue
|
3
|
-
class SendGauge < Job
|
4
|
-
include Sidekiq::Worker
|
5
|
-
sidekiq_options :queue => :metrics
|
6
|
-
|
7
|
-
def perform(attributes)
|
8
|
-
gauge = Gauge.new attributes
|
9
|
-
log gauge
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class SendCounter < Job
|
14
|
-
include Sidekiq::Worker
|
15
|
-
sidekiq_options :queue => :metrics
|
16
|
-
|
17
|
-
def perform(attributes)
|
18
|
-
counter = Counter.new attributes
|
19
|
-
log counter
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def push(measurement)
|
24
|
-
if measurement.is_a? Gauge
|
25
|
-
SendGauge.perform_async measurement.attributes
|
26
|
-
elsif measurement.is_a? Counter
|
27
|
-
SendCounter.perform_async measurement.attributes
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
module Harness
|
2
|
-
class SynchronousQueue
|
3
|
-
def push(measurement)
|
4
|
-
begin
|
5
|
-
Harness::Job.new.log(measurement)
|
6
|
-
rescue LoggingError => ex
|
7
|
-
logger.debug "[Harness] Logging measurement failed! Server Said: #{ex}"
|
8
|
-
logger.debug ex.backtrace.join("\n")
|
9
|
-
logger.warn "[Harness] Could not post measurement! Enable debug logging to see full errors"
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
private
|
14
|
-
def logger
|
15
|
-
Harness.logger
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
data/lib/harness/railtie.rb
DELETED
@@ -1,71 +0,0 @@
|
|
1
|
-
module Harness
|
2
|
-
class Railtie < ::Rails::Railtie
|
3
|
-
config.harness = Harness.config
|
4
|
-
|
5
|
-
# Set default instrumentation
|
6
|
-
config.harness.instrument.action_controller = true
|
7
|
-
config.harness.instrument.action_mailer = true
|
8
|
-
config.harness.instrument.action_view = true
|
9
|
-
|
10
|
-
config.harness.instrument.active_support = false
|
11
|
-
|
12
|
-
# Custom instrumentation can be turned on as follows
|
13
|
-
# See files in lib/harness/integration for available integrations
|
14
|
-
#
|
15
|
-
# config.harness.instrument.sidekiq = true
|
16
|
-
# config.harness.instrument.active_model_serializers = true
|
17
|
-
|
18
|
-
rake_tasks do
|
19
|
-
load "harness/tasks.rake"
|
20
|
-
end
|
21
|
-
|
22
|
-
initializer "harness.adapter" do |app|
|
23
|
-
app.config.harness.adapter ||= case Rails.env
|
24
|
-
when 'development' then :null
|
25
|
-
when 'test' then :null
|
26
|
-
else :librato
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
initializer "harness.logger" do |app|
|
31
|
-
Harness.logger = Rails.logger
|
32
|
-
end
|
33
|
-
|
34
|
-
initializer "harness.source" do |app|
|
35
|
-
Harness.config.source = app.class.name.underscore.dasherize
|
36
|
-
end
|
37
|
-
|
38
|
-
initializer "harness.redis" do
|
39
|
-
if existing_url = ENV['REDISTOGO_URL'] || ENV['REDIS_URL']
|
40
|
-
Harness.redis ||= Redis::Namespace.new('harness', :redis => Redis.connect(:url => existing_url))
|
41
|
-
else
|
42
|
-
Harness.redis ||= Redis::Namespace.new('harness', :redis => Redis.connect(:host => 'localhost', :port => '6379'))
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
initializer "harness.queue" do
|
47
|
-
Harness.config.queue = :synchronous
|
48
|
-
end
|
49
|
-
|
50
|
-
initializer "harness.queue.production" do |app|
|
51
|
-
use_real_queue = Rails.env != 'development' && Rails.env != 'test'
|
52
|
-
|
53
|
-
if defined?(Resque::Job) && use_real_queue
|
54
|
-
require 'harness/queues/resque_queue'
|
55
|
-
Harness.config.queue = :resque
|
56
|
-
elsif defined?(Sidekiq::Worker) && use_real_queue
|
57
|
-
require 'harness/queues/sidekiq_queue'
|
58
|
-
Harness.config.queue = :sidekiq
|
59
|
-
elsif defined?(Delayed::Worker) && use_real_queue
|
60
|
-
require 'harness/queues/delayed_job_queue'
|
61
|
-
Harness.config.queue = :delayed_job
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
initializer "harness.instrumentation" do |app|
|
66
|
-
app.config.harness.instrument.each_pair do |integration, value|
|
67
|
-
require "harness/integration/#{integration}" if value
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
data/lib/harness/tasks.rake
DELETED
@@ -1,67 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class CountersWithRedis < IntegrationTest
|
4
|
-
def test_stores_name_in_redis
|
5
|
-
instrument "event-counter", :counter => true
|
6
|
-
|
7
|
-
assert_equal 1, redis.get('counters/event-counter').to_i
|
8
|
-
|
9
|
-
assert_counter_logged "event-counter"
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_increments_counter_each_instrument
|
13
|
-
instrument "event-counter", :counter => true
|
14
|
-
assert_counter_logged "event-counter"
|
15
|
-
|
16
|
-
counters.clear
|
17
|
-
|
18
|
-
instrument "event-counter", :counter => true
|
19
|
-
assert_counter_logged "event-counter"
|
20
|
-
|
21
|
-
assert_equal 2, counters.first.value
|
22
|
-
end
|
23
|
-
|
24
|
-
def test_sets_given_value_in_redis_with_shortform
|
25
|
-
instrument "event-counter", :counter => 10
|
26
|
-
|
27
|
-
counters.clear
|
28
|
-
|
29
|
-
instrument "event-counter", :counter => true
|
30
|
-
assert_counter_logged 'event-counter'
|
31
|
-
|
32
|
-
assert_equal 11, counters.first.value
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_sets_given_value_in_redis_with_longform
|
36
|
-
instrument "event-counter", :counter => { :value => 10 }
|
37
|
-
|
38
|
-
assert_equal 10, redis.get("counters/event-counter").to_i
|
39
|
-
|
40
|
-
counters.clear
|
41
|
-
|
42
|
-
instrument "event-counter", :counter => true
|
43
|
-
assert_counter_logged 'event-counter'
|
44
|
-
|
45
|
-
assert_equal 11, counters.first.value
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_resets_counters
|
49
|
-
instrument "event-counter", :counter => true
|
50
|
-
instrument "event-counter2", :counter => true
|
51
|
-
|
52
|
-
assert_equal 1, redis.get("counters/event-counter").to_i
|
53
|
-
assert_equal 1, redis.get("counters/event-counter2").to_i
|
54
|
-
|
55
|
-
Harness.reset_counters!
|
56
|
-
|
57
|
-
assert_equal 0, redis.get("counters/event-counter").to_i
|
58
|
-
assert_equal 0, redis.get("counters/event-counter2").to_i
|
59
|
-
|
60
|
-
counters.clear
|
61
|
-
instrument "event-counter", :counter => true
|
62
|
-
assert_counter_logged 'event-counter'
|
63
|
-
|
64
|
-
assert_equal 1, counters.first.value
|
65
|
-
assert_equal 1, redis.get("counters/event-counter").to_i
|
66
|
-
end
|
67
|
-
end
|
@@ -1,50 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ActiveSupportTestCase < IntegrationTest
|
4
|
-
def test_a_gauge_is_logged
|
5
|
-
ActiveSupport::Notifications.instrument "gauge_test.harness", :gauge => true do |args|
|
6
|
-
# do nothing
|
7
|
-
end
|
8
|
-
|
9
|
-
assert_gauge_logged "gauge_test.harness"
|
10
|
-
end
|
11
|
-
|
12
|
-
def test_a_counter_is_logged
|
13
|
-
ActiveSupport::Notifications.instrument "counter_test.harness", :counter => { :value => 5 } do |args|
|
14
|
-
# do nothing
|
15
|
-
end
|
16
|
-
|
17
|
-
assert_counter_logged "counter_test.harness"
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_can_log_both
|
21
|
-
ActiveSupport::Notifications.instrument "test.harness", :gauge => { :id => "test-gauge" }, :counter => {:id => 'test-counter', :value => 5 } do |args|
|
22
|
-
# do nothing
|
23
|
-
end
|
24
|
-
|
25
|
-
assert_counter_logged "test-counter"
|
26
|
-
assert_gauge_logged "test-gauge"
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_does_not_log_counter_on_exception
|
30
|
-
begin
|
31
|
-
ActiveSupport::Notifications.instrument "counter_test.harness", :counter => true do |args|
|
32
|
-
raise
|
33
|
-
end
|
34
|
-
rescue
|
35
|
-
end
|
36
|
-
|
37
|
-
refute_counter_logged "counter_test.harness"
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_does_not_log_gauge_on_exception
|
41
|
-
begin
|
42
|
-
ActiveSupport::Notifications.instrument "gauge_test.harness", :gauge => true do |args|
|
43
|
-
raise
|
44
|
-
end
|
45
|
-
rescue
|
46
|
-
end
|
47
|
-
|
48
|
-
refute_gauge_logged "gauge_test.harness"
|
49
|
-
end
|
50
|
-
end
|
@@ -1,51 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ActionControllerIntegration < IntegrationTest
|
4
|
-
def test_logs_write_fragment
|
5
|
-
instrument "write_fragment"
|
6
|
-
|
7
|
-
assert_gauge_logged "write_fragment.action_controller"
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_logs_read_fragment
|
11
|
-
instrument "read_fragment"
|
12
|
-
|
13
|
-
assert_gauge_logged "read_fragment.action_controller"
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_logs_expire_fragment
|
17
|
-
instrument "expire_fragment"
|
18
|
-
|
19
|
-
assert_gauge_logged "expire_fragment.action_controller"
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_logs_write_page
|
23
|
-
instrument "write_page"
|
24
|
-
|
25
|
-
assert_gauge_logged "write_page.action_controller"
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_logs_expire_page
|
29
|
-
instrument "expire_page"
|
30
|
-
|
31
|
-
assert_gauge_logged "expire_page.action_controller"
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_logs_process_action
|
35
|
-
instrument "process_action"
|
36
|
-
|
37
|
-
assert_gauge_logged "process_action.action_controller"
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_logs_send_file
|
41
|
-
instrument "send_file"
|
42
|
-
|
43
|
-
assert_gauge_logged "send_file.action_controller"
|
44
|
-
end
|
45
|
-
|
46
|
-
def instrument(event)
|
47
|
-
ActiveSupport::Notifications.instrument "#{event}.action_controller" do |*args|
|
48
|
-
# nada
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ActionMailerIntegration < IntegrationTest
|
4
|
-
def test_logs_mail_received
|
5
|
-
instrument "receive"
|
6
|
-
|
7
|
-
assert_gauge_logged "receive.action_mailer"
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_logs_mail_delivered
|
11
|
-
instrument "deliver"
|
12
|
-
|
13
|
-
assert_gauge_logged "deliver.action_mailer"
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
def instrument(event)
|
18
|
-
ActiveSupport::Notifications.instrument "#{event}.action_mailer" do |*args|
|
19
|
-
# nada
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,32 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ActionViewIntegration < IntegrationTest
|
4
|
-
def test_logs_render_template
|
5
|
-
instrument "render_template"
|
6
|
-
|
7
|
-
assert_gauge_logged "render_template.action_view"
|
8
|
-
end
|
9
|
-
|
10
|
-
def test_logs_render_partial
|
11
|
-
instrument "render_partial"
|
12
|
-
|
13
|
-
assert_gauge_logged "render_partial.action_view"
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_skips_internal_partial_events
|
17
|
-
instrument "!render_partial"
|
18
|
-
|
19
|
-
refute_gauge_logged "!render_partial.action_view"
|
20
|
-
end
|
21
|
-
|
22
|
-
def test_skips_internal_template_events
|
23
|
-
instrument "!render_template"
|
24
|
-
|
25
|
-
refute_gauge_logged "!render_template.action_view"
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
def instrument(event)
|
30
|
-
ActiveSupport::Notifications.instrument "#{event}.action_view"
|
31
|
-
end
|
32
|
-
end
|