harness 0.9.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/README.md +108 -323
  4. data/harness.gemspec +3 -12
  5. data/lib/harness.rb +69 -68
  6. data/lib/harness/async_queue.rb +29 -0
  7. data/lib/harness/fake_collector.rb +40 -0
  8. data/lib/harness/instrumentation.rb +21 -6
  9. data/lib/harness/null_collector.rb +23 -0
  10. data/lib/harness/subscription.rb +7 -0
  11. data/lib/harness/sync_queue.rb +14 -0
  12. data/lib/harness/version.rb +1 -1
  13. data/test/acceptance_test.rb +20 -0
  14. data/test/active_support_notifications_test.rb +93 -0
  15. data/test/async_queue_test.rb +14 -0
  16. data/test/instrumentation_test.rb +54 -0
  17. data/test/null_collector_test.rb +29 -0
  18. data/test/test_helper.rb +38 -34
  19. metadata +21 -196
  20. data/lib/harness/adapters/librato_adapter.rb +0 -90
  21. data/lib/harness/adapters/memory_adapter.rb +0 -27
  22. data/lib/harness/adapters/null_adapter.rb +0 -11
  23. data/lib/harness/adapters/stathat_adapter.rb +0 -75
  24. data/lib/harness/adapters/statsd_adapter.rb +0 -50
  25. data/lib/harness/consumer.rb +0 -35
  26. data/lib/harness/counter.rb +0 -29
  27. data/lib/harness/gauge.rb +0 -23
  28. data/lib/harness/integration/action_controller.rb +0 -9
  29. data/lib/harness/integration/action_mailer.rb +0 -9
  30. data/lib/harness/integration/action_view.rb +0 -9
  31. data/lib/harness/integration/active_model_serializers.rb +0 -9
  32. data/lib/harness/integration/active_support.rb +0 -9
  33. data/lib/harness/integration/sidekiq.rb +0 -47
  34. data/lib/harness/job.rb +0 -23
  35. data/lib/harness/measurement.rb +0 -43
  36. data/lib/harness/queues/delayed_job_queue.rb +0 -7
  37. data/lib/harness/queues/resque_queue.rb +0 -29
  38. data/lib/harness/queues/sidekiq_queue.rb +0 -31
  39. data/lib/harness/queues/synchronous_queue.rb +0 -18
  40. data/lib/harness/railtie.rb +0 -71
  41. data/lib/harness/tasks.rake +0 -6
  42. data/test/integration/counters_with_redis_test.rb +0 -67
  43. data/test/integration/instrumentation_test.rb +0 -50
  44. data/test/integration/integrations/action_controller_test.rb +0 -51
  45. data/test/integration/integrations/action_mailer_test.rb +0 -22
  46. data/test/integration/integrations/action_view_test.rb +0 -32
  47. data/test/integration/integrations/active_model_serializers_test.rb +0 -22
  48. data/test/integration/integrations/active_support_test.rb +0 -41
  49. data/test/integration/integrations/sidekiq_test.rb +0 -54
  50. data/test/integration/logging_test.rb +0 -17
  51. data/test/integration/queues/delayed_job_test.rb +0 -59
  52. data/test/integration/queues/resque_test.rb +0 -24
  53. data/test/integration/queues/sidekiq_test.rb +0 -34
  54. data/test/integration/railtie_test.rb +0 -26
  55. data/test/unit/adapters/librato_adapter_test.rb +0 -169
  56. data/test/unit/adapters/memory_adapter_test.rb +0 -22
  57. data/test/unit/adapters/stathat_adapter_test.rb +0 -144
  58. data/test/unit/adapters/statsd_adapter_test.rb +0 -74
  59. data/test/unit/counter_test.rb +0 -84
  60. data/test/unit/gauge_test.rb +0 -93
  61. data/test/unit/harness_test.rb +0 -39
  62. data/test/unit/measurement_test.rb +0 -76
@@ -0,0 +1,14 @@
1
+ require_relative 'test_helper'
2
+ Thread.abort_on_exception = true
3
+
4
+ class AsyncQueueTest < MiniTest::Unit::TestCase
5
+ def test_uses_consumer_thread_to_not_block_the_main_thread
6
+ queue = Harness::AsyncQueue.new
7
+
8
+ queue.push [:gauge, ['foo', 5]]
9
+
10
+ sleep 0.1
11
+
12
+ assert_gauge 'foo'
13
+ end
14
+ end
@@ -0,0 +1,54 @@
1
+ require_relative 'test_helper'
2
+
3
+ class InstrumentationTest < MiniTest::Unit::TestCase
4
+ class Worker
5
+ include Harness::Instrumentation
6
+ end
7
+
8
+ attr_reader :worker
9
+
10
+ def setup
11
+ @worker = Worker.new
12
+ end
13
+
14
+ def test_can_use_increments
15
+ worker.increment 'foo', 0.5
16
+ assert_increment 'foo'
17
+ end
18
+
19
+ def test_can_use_decrements
20
+ worker.decrement 'foo', 0.5
21
+ assert_decrement 'foo'
22
+ end
23
+
24
+ def test_can_use_gauges
25
+ worker.gauge 'foo', 5, 0.5
26
+ assert_gauge 'foo'
27
+ end
28
+
29
+ def test_can_use_timings
30
+ worker.timing 'foo', 5, 0.5
31
+ assert_timer 'foo'
32
+ end
33
+
34
+ def test_can_be_timed
35
+ result = worker.time 'foo', 0.5 do
36
+ 'bar'
37
+ end
38
+
39
+ assert_equal 'bar', result, "#time did not return block's value"
40
+ assert_timer 'foo'
41
+ end
42
+
43
+ def test_also_works_with_extend
44
+ extended = Class.new do
45
+ extend Harness::Instrumentation
46
+ end
47
+
48
+ assert_respond_to extended, :increment
49
+ assert_respond_to extended, :decrement
50
+ assert_respond_to extended, :time
51
+ assert_respond_to extended, :timing
52
+ assert_respond_to extended, :gauge
53
+ end
54
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'test_helper'
2
+
3
+ class NullCollectorTest < MiniTest::Unit::TestCase
4
+ attr_reader :statsd
5
+
6
+ def setup
7
+ @statsd = Harness::NullCollector.new
8
+ end
9
+
10
+ def test_respond_to_increment
11
+ statsd.increment 'foo', 5, 0.5
12
+ end
13
+
14
+ def test_responds_to_timing
15
+ statsd.timing 'foo', 5, 0.5
16
+ end
17
+
18
+ def test_responds_to_gauge
19
+ statsd.gauge 'foo', 5, 0.5
20
+ end
21
+
22
+ def test_runs_the_block_for_time
23
+ result = statsd.time 'foo', 0.5 do
24
+ 'bar'
25
+ end
26
+
27
+ assert_equal 'bar', result
28
+ end
29
+ end
data/test/test_helper.rb CHANGED
@@ -3,64 +3,68 @@ require 'bundler/setup'
3
3
  require 'simplecov'
4
4
  SimpleCov.start
5
5
 
6
- require 'resque'
7
- require 'sidekiq'
8
- require 'delayed_job_active_record'
9
- require 'sqlite3'
10
-
11
6
  require 'harness'
12
7
 
13
8
  require 'minitest/unit'
14
9
  require 'minitest/autorun'
15
10
 
16
- require 'webmock/minitest'
17
-
18
- WebMock.disable_net_connect!
11
+ Thread.abort_on_exception = true
19
12
 
20
- Harness.logger = Logger.new '/dev/null'
13
+ class MiniTest::Unit::TestCase
14
+ def setup
15
+ Harness.config.collector = Harness::FakeCollector.new
16
+ Harness.config.queue = Harness::SyncQueue.new
17
+ end
21
18
 
22
- Harness.redis = Redis::Namespace.new 'harness-test', :redis => Redis.connect(:host => 'localhost', :port => '6379')
19
+ def assert_timer(name)
20
+ refute_empty timers
21
+ timer = timers.find { |t| t.name == name }
22
+ assert timer, "Timer #{name} not logged!"
23
+ end
23
24
 
24
- class IntegrationTest < MiniTest::Unit::TestCase
25
- def setup
26
- Harness.config.adapter = :memory
27
- Harness.config.queue = :synchronous
25
+ def assert_increment(name)
26
+ refute_empty increments
27
+ increment = increments.find { |i| i.name == name }
28
+ assert increment, "Increment #{name} not logged!"
29
+ end
28
30
 
29
- gauges.clear ; counters.clear
30
- redis.flushall
31
+ def assert_decrement(name)
32
+ refute_empty decrements
33
+ decrement = decrements.find { |i| i.name == name }
34
+ assert decrement, "decrement #{name} not logged!"
31
35
  end
32
36
 
33
- def assert_gauge_logged(name)
34
- refute_empty gauges.select {|g| g.name = name }, "Expected #{gauges.inspect} to contain a #{name} result"
37
+ def assert_gauge(name)
38
+ refute_empty gauges
39
+ gauge = gauges.find { |g| g.name == name }
40
+ assert gauge, "gauge #{name} not logged!"
35
41
  end
36
42
 
37
- def assert_counter_logged(name)
38
- refute_empty counters.select {|c| c.name = name }, "Expected #{counters.inspect} to contain a #{name} result"
43
+ def instrument(name, data = {}, &block)
44
+ ActiveSupport::Notifications.instrument name, data, &block
39
45
  end
40
46
 
41
- def refute_gauge_logged(name)
42
- assert_empty gauges.select {|g| g.name = name }, "No gauge expected to be logged"
47
+ def collector
48
+ Harness.config.collector
43
49
  end
44
50
 
45
- def refute_counter_logged(name)
46
- assert_empty counters.select {|c| c.name = name }, "No counter expected to be logged"
51
+ def timers
52
+ collector.timers
47
53
  end
48
54
 
49
- def gauges
50
- Harness::MemoryAdapter.gauges
55
+ def increments
56
+ collector.increments
51
57
  end
52
58
 
53
- def counters
54
- Harness::MemoryAdapter.counters
59
+ def decrements
60
+ collector.decrements
55
61
  end
56
62
 
57
- def redis
58
- Harness.redis
63
+ def counters
64
+ collector.counters
59
65
  end
60
66
 
61
- def instrument(name, data = {})
62
- ActiveSupport::Notifications.instrument name, data do
63
- # nothing
64
- end
67
+ def gauges
68
+ collector.gauges
65
69
  end
66
70
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: harness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - ahawkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-01 00:00:00.000000000 Z
11
+ date: 2013-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -25,35 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3'
27
27
  - !ruby/object:Gem::Dependency
28
- name: redis
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - '>='
32
- - !ruby/object:Gem::Version
33
- version: '0'
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - '>='
39
- - !ruby/object:Gem::Version
40
- version: '0'
41
- - !ruby/object:Gem::Dependency
42
- name: redis-namespace
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - '>='
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
- - !ruby/object:Gem::Dependency
56
- name: multi_json
28
+ name: statsd-ruby
57
29
  requirement: !ruby/object:Gem::Requirement
58
30
  requirements:
59
31
  - - '>='
@@ -81,105 +53,7 @@ dependencies:
81
53
  - !ruby/object:Gem::Version
82
54
  version: '0'
83
55
  - !ruby/object:Gem::Dependency
84
- name: webmock
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - '>='
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: resque
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - '>='
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - '>='
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: sidekiq
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - '>='
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - '>='
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
- - !ruby/object:Gem::Dependency
126
- name: delayed_job_active_record
127
- requirement: !ruby/object:Gem::Requirement
128
- requirements:
129
- - - '>='
130
- - !ruby/object:Gem::Version
131
- version: '0'
132
- type: :development
133
- prerelease: false
134
- version_requirements: !ruby/object:Gem::Requirement
135
- requirements:
136
- - - '>='
137
- - !ruby/object:Gem::Version
138
- version: '0'
139
- - !ruby/object:Gem::Dependency
140
- name: active_model_serializers
141
- requirement: !ruby/object:Gem::Requirement
142
- requirements:
143
- - - '>='
144
- - !ruby/object:Gem::Version
145
- version: '0'
146
- type: :development
147
- prerelease: false
148
- version_requirements: !ruby/object:Gem::Requirement
149
- requirements:
150
- - - '>='
151
- - !ruby/object:Gem::Version
152
- version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: rails
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - '>='
158
- - !ruby/object:Gem::Version
159
- version: '3'
160
- type: :development
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - '>='
165
- - !ruby/object:Gem::Version
166
- version: '3'
167
- - !ruby/object:Gem::Dependency
168
- name: sqlite3
169
- requirement: !ruby/object:Gem::Requirement
170
- requirements:
171
- - - '>='
172
- - !ruby/object:Gem::Version
173
- version: '0'
174
- type: :development
175
- prerelease: false
176
- version_requirements: !ruby/object:Gem::Requirement
177
- requirements:
178
- - - '>='
179
- - !ruby/object:Gem::Version
180
- version: '0'
181
- - !ruby/object:Gem::Dependency
182
- name: statsd-instrument
56
+ name: rake
183
57
  requirement: !ruby/object:Gem::Requirement
184
58
  requirements:
185
59
  - - '>='
@@ -192,8 +66,8 @@ dependencies:
192
66
  - - '>='
193
67
  - !ruby/object:Gem::Version
194
68
  version: '0'
195
- description: Log ActiveSupport::Notifications to various services like Librato or
196
- StatsD
69
+ description: Collect high level application performance metrics and forward them for
70
+ analysis
197
71
  email:
198
72
  - adam@hawkins.io
199
73
  executables: []
@@ -209,52 +83,19 @@ files:
209
83
  - Rakefile
210
84
  - harness.gemspec
211
85
  - lib/harness.rb
212
- - lib/harness/adapters/librato_adapter.rb
213
- - lib/harness/adapters/memory_adapter.rb
214
- - lib/harness/adapters/null_adapter.rb
215
- - lib/harness/adapters/stathat_adapter.rb
216
- - lib/harness/adapters/statsd_adapter.rb
217
- - lib/harness/consumer.rb
218
- - lib/harness/counter.rb
219
- - lib/harness/gauge.rb
86
+ - lib/harness/async_queue.rb
87
+ - lib/harness/fake_collector.rb
220
88
  - lib/harness/instrumentation.rb
221
- - lib/harness/integration/action_controller.rb
222
- - lib/harness/integration/action_mailer.rb
223
- - lib/harness/integration/action_view.rb
224
- - lib/harness/integration/active_model_serializers.rb
225
- - lib/harness/integration/active_support.rb
226
- - lib/harness/integration/sidekiq.rb
227
- - lib/harness/job.rb
228
- - lib/harness/measurement.rb
229
- - lib/harness/queues/delayed_job_queue.rb
230
- - lib/harness/queues/resque_queue.rb
231
- - lib/harness/queues/sidekiq_queue.rb
232
- - lib/harness/queues/synchronous_queue.rb
233
- - lib/harness/railtie.rb
234
- - lib/harness/tasks.rake
89
+ - lib/harness/null_collector.rb
90
+ - lib/harness/subscription.rb
91
+ - lib/harness/sync_queue.rb
235
92
  - lib/harness/version.rb
236
- - test/integration/counters_with_redis_test.rb
237
- - test/integration/instrumentation_test.rb
238
- - test/integration/integrations/action_controller_test.rb
239
- - test/integration/integrations/action_mailer_test.rb
240
- - test/integration/integrations/action_view_test.rb
241
- - test/integration/integrations/active_model_serializers_test.rb
242
- - test/integration/integrations/active_support_test.rb
243
- - test/integration/integrations/sidekiq_test.rb
244
- - test/integration/logging_test.rb
245
- - test/integration/queues/delayed_job_test.rb
246
- - test/integration/queues/resque_test.rb
247
- - test/integration/queues/sidekiq_test.rb
248
- - test/integration/railtie_test.rb
93
+ - test/acceptance_test.rb
94
+ - test/active_support_notifications_test.rb
95
+ - test/async_queue_test.rb
96
+ - test/instrumentation_test.rb
97
+ - test/null_collector_test.rb
249
98
  - test/test_helper.rb
250
- - test/unit/adapters/librato_adapter_test.rb
251
- - test/unit/adapters/memory_adapter_test.rb
252
- - test/unit/adapters/stathat_adapter_test.rb
253
- - test/unit/adapters/statsd_adapter_test.rb
254
- - test/unit/counter_test.rb
255
- - test/unit/gauge_test.rb
256
- - test/unit/harness_test.rb
257
- - test/unit/measurement_test.rb
258
99
  homepage: https://github.com/ahawkins/harness
259
100
  licenses: []
260
101
  metadata: {}
@@ -279,25 +120,9 @@ signing_key:
279
120
  specification_version: 4
280
121
  summary: ''
281
122
  test_files:
282
- - test/integration/counters_with_redis_test.rb
283
- - test/integration/instrumentation_test.rb
284
- - test/integration/integrations/action_controller_test.rb
285
- - test/integration/integrations/action_mailer_test.rb
286
- - test/integration/integrations/action_view_test.rb
287
- - test/integration/integrations/active_model_serializers_test.rb
288
- - test/integration/integrations/active_support_test.rb
289
- - test/integration/integrations/sidekiq_test.rb
290
- - test/integration/logging_test.rb
291
- - test/integration/queues/delayed_job_test.rb
292
- - test/integration/queues/resque_test.rb
293
- - test/integration/queues/sidekiq_test.rb
294
- - test/integration/railtie_test.rb
123
+ - test/acceptance_test.rb
124
+ - test/active_support_notifications_test.rb
125
+ - test/async_queue_test.rb
126
+ - test/instrumentation_test.rb
127
+ - test/null_collector_test.rb
295
128
  - test/test_helper.rb
296
- - test/unit/adapters/librato_adapter_test.rb
297
- - test/unit/adapters/memory_adapter_test.rb
298
- - test/unit/adapters/stathat_adapter_test.rb
299
- - test/unit/adapters/statsd_adapter_test.rb
300
- - test/unit/counter_test.rb
301
- - test/unit/gauge_test.rb
302
- - test/unit/harness_test.rb
303
- - test/unit/measurement_test.rb