harness 0.9.1 → 1.0.0

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.
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