collective-metrics 0.0.2 → 0.1.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.
data/Collectfile CHANGED
@@ -1 +1,2 @@
1
- require 'collective/services/sidekiq'
1
+ use Collective::Collectors::Sidekiq
2
+ use Collective::Collectors::Redis
data/collective.gemspec CHANGED
@@ -6,21 +6,21 @@ require 'collective/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'collective-metrics'
8
8
  spec.version = Collective::VERSION
9
- spec.authors = ["Eric J. Holmes"]
10
- spec.email = ["eric@ejholmes.net"]
9
+ spec.authors = ['Eric J. Holmes']
10
+ spec.email = ['eric@ejholmes.net']
11
11
  spec.description = %q{Collect and output metrics}
12
12
  spec.summary = %q{Collect and output metrics}
13
- spec.homepage = "https://github.com/remind101/collective-metrics"
14
- spec.license = "MIT"
13
+ spec.homepage = 'https://github.com/remind101/collective-metrics'
14
+ spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'rufus-scheduler'
22
- spec.add_dependency 'thor'
23
- spec.add_dependency 'formatted-metrics'
21
+ spec.add_dependency 'rufus-scheduler', '~> 2.0'
22
+ spec.add_dependency 'thor', '~> 0.18'
23
+ spec.add_dependency 'formatted-metrics', '~> 0.1'
24
24
 
25
25
  spec.add_development_dependency 'bundler', '~> 1.3'
26
26
  spec.add_development_dependency 'rake'
@@ -0,0 +1,30 @@
1
+ module Collective
2
+ class Builder
3
+ DEFAULT_RESOLUTION = '5s'.freeze
4
+
5
+ def use(klass, *args)
6
+ collectors << [klass, args]
7
+ end
8
+
9
+ def run
10
+ collectors.each do |(klass, args)|
11
+ collector = klass.new(*args)
12
+ scheduler.every klass.resolution || DEFAULT_RESOLUTION do
13
+ collector.collect
14
+ end
15
+ end
16
+
17
+ scheduler.join
18
+ end
19
+
20
+ private
21
+
22
+ def collectors
23
+ @collectors ||= []
24
+ end
25
+
26
+ def scheduler
27
+ @scheduler ||= Rufus::Scheduler.new
28
+ end
29
+ end
30
+ end
@@ -7,7 +7,6 @@ module Collective
7
7
  desc 'start', 'Run the collector'
8
8
 
9
9
  def start
10
- load 'Collectfile'
11
10
  Collective.run
12
11
  end
13
12
  end
@@ -0,0 +1,18 @@
1
+ module Collective
2
+ class Collector
3
+ module DSL
4
+ def requires(libs)
5
+ Array(libs).each { |lib| require lib.to_s }
6
+ end
7
+
8
+ def collect(&block)
9
+ define_method :collect, &block
10
+ end
11
+
12
+ def resolution(resolution = nil)
13
+ @resolution = resolution if resolution
14
+ @resolution
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,6 +1,6 @@
1
1
  module Collective
2
- class Service
3
- autoload :DSL, 'collective/service/dsl'
2
+ class Collector
3
+ autoload :DSL, 'collective/collector/dsl'
4
4
  extend DSL
5
5
 
6
6
  attr_reader :options
@@ -9,8 +9,8 @@ module Collective
9
9
  @options = options
10
10
  end
11
11
 
12
- def collect
13
- _instrument
12
+ def collect!
13
+ collect
14
14
  end
15
15
 
16
16
  def instrument(*args, &block)
@@ -0,0 +1,28 @@
1
+ module Collective::Collectors
2
+ class Redis < Collective::Collector
3
+ MEGABYTE = 1024 * 1024
4
+
5
+ requires :redis
6
+
7
+ collect do
8
+ instrument 'redis.used_memory', (info['used_memory'].to_f / MEGABYTE).round(2)
9
+ instrument 'redis.connected_clients', info['connected_clients']
10
+ instrument 'redis.blocked_clients', info['blocked_clients']
11
+ instrument 'redis.connected_slaves', info['connected_slaves']
12
+ end
13
+
14
+ private
15
+
16
+ def info
17
+ redis.info
18
+ end
19
+
20
+ def redis
21
+ @redis ||= url ? ::Redis.new(url: url) : ::Redis.new
22
+ end
23
+
24
+ def url
25
+ options[:url]
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,35 @@
1
+ module Collective::Collectors
2
+ class Sidekiq < Collective::Collector
3
+ requires :sidekiq
4
+
5
+ collect do
6
+ instrument 'sidekiq.queues.processed', stats.processed
7
+ instrument 'sidekiq.queues.failed', stats.failed
8
+ instrument 'sidekiq.queues.enqueued', stats.enqueued
9
+ instrument 'sidekiq.workers.busy', workers
10
+
11
+ queues.each do |queue, depth|
12
+ instrument 'sidekiq.queue.enqueued', depth, source: queue
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def stats
19
+ ::Sidekiq::Stats.new
20
+ end
21
+
22
+ def queues
23
+ stats.queues
24
+ end
25
+
26
+ def workers
27
+ ::Sidekiq.redis { |conn|
28
+ conn
29
+ .smembers('workers')
30
+ .map { |w| conn.get("worker:#{w}") }
31
+ .compact
32
+ }.length
33
+ end
34
+ end
35
+ end
@@ -1,3 +1,3 @@
1
1
  module Collective
2
- VERSION = "0.0.2"
2
+ VERSION = '0.1.0'
3
3
  end
data/lib/collective.rb CHANGED
@@ -4,35 +4,21 @@ require 'formatted-metrics'
4
4
  require 'collective/version'
5
5
 
6
6
  module Collective
7
- autoload :Service, 'collective/service'
7
+ autoload :Collector, 'collective/collector'
8
+ autoload :Builder, 'collective/builder'
8
9
 
9
- module Services
10
- autoload :Sidekiq, 'collective/services/sidekiq'
10
+ module Collectors
11
+ autoload :Sidekiq, 'collective/collectors/sidekiq'
12
+ autoload :Redis, 'collective/collectors/redis'
11
13
  end
12
14
 
13
15
  class << self
14
- def services
15
- @services ||= []
16
- end
17
-
18
- def register(service)
19
- services << service
20
- end
21
-
22
16
  def run
23
17
  Metrics.subscribe
24
18
 
25
- services.map(&:new).each do |service|
26
- scheduler.every '1s' do
27
- service.collect
28
- end
29
- end
30
-
31
- scheduler.join
32
- end
33
-
34
- def scheduler
35
- @scheduler ||= Rufus::Scheduler.new
19
+ builder = Builder.new
20
+ builder.instance_eval File.read('Collectfile')
21
+ builder.run
36
22
  end
37
23
  end
38
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: collective-metrics
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,56 +9,56 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-02 00:00:00.000000000 Z
12
+ date: 2013-08-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rufus-scheduler
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
- - - ! '>='
19
+ - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: '0'
21
+ version: '2.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  none: false
26
26
  requirements:
27
- - - ! '>='
27
+ - - ~>
28
28
  - !ruby/object:Gem::Version
29
- version: '0'
29
+ version: '2.0'
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: thor
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  none: false
34
34
  requirements:
35
- - - ! '>='
35
+ - - ~>
36
36
  - !ruby/object:Gem::Version
37
- version: '0'
37
+ version: '0.18'
38
38
  type: :runtime
39
39
  prerelease: false
40
40
  version_requirements: !ruby/object:Gem::Requirement
41
41
  none: false
42
42
  requirements:
43
- - - ! '>='
43
+ - - ~>
44
44
  - !ruby/object:Gem::Version
45
- version: '0'
45
+ version: '0.18'
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: formatted-metrics
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
- - - ! '>='
51
+ - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: '0.1'
54
54
  type: :runtime
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - ! '>='
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '0.1'
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: bundler
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -125,10 +125,12 @@ files:
125
125
  - collective.gemspec
126
126
  - lib/collective-metrics.rb
127
127
  - lib/collective.rb
128
+ - lib/collective/builder.rb
128
129
  - lib/collective/cli.rb
129
- - lib/collective/service.rb
130
- - lib/collective/service/dsl.rb
131
- - lib/collective/services/sidekiq.rb
130
+ - lib/collective/collector.rb
131
+ - lib/collective/collector/dsl.rb
132
+ - lib/collective/collectors/redis.rb
133
+ - lib/collective/collectors/sidekiq.rb
132
134
  - lib/collective/version.rb
133
135
  homepage: https://github.com/remind101/collective-metrics
134
136
  licenses:
@@ -145,7 +147,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
145
147
  version: '0'
146
148
  segments:
147
149
  - 0
148
- hash: -603082660073454949
150
+ hash: 386385479699394327
149
151
  required_rubygems_version: !ruby/object:Gem::Requirement
150
152
  none: false
151
153
  requirements:
@@ -154,7 +156,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
154
156
  version: '0'
155
157
  segments:
156
158
  - 0
157
- hash: -603082660073454949
159
+ hash: 386385479699394327
158
160
  requirements: []
159
161
  rubyforge_project:
160
162
  rubygems_version: 1.8.23
@@ -1,17 +0,0 @@
1
- module Collective
2
- class Service
3
- module DSL
4
- def inherited(base)
5
- Collective.register(base)
6
- end
7
-
8
- def requires(libs)
9
- Array(libs).each { |lib| require lib.to_s }
10
- end
11
-
12
- def instrument(&block)
13
- define_method :_instrument, &block
14
- end
15
- end
16
- end
17
- end
@@ -1,39 +0,0 @@
1
- module Collective::Services
2
- class Sidekiq < Collective::Service
3
- MEGABYTE = 1024 * 1024
4
-
5
- requires :sidekiq
6
-
7
- instrument do
8
- instrument 'queues.processed', stats.processed
9
- instrument 'queues.failed', stats.failed
10
- instrument 'queues.enqueued', stats.enqueued
11
- instrument 'workers.busy', workers
12
-
13
- stats.queues.each do |queue, depth|
14
- instrument 'queue.enqueued', depth, queue
15
- end
16
-
17
- # General redis metrics
18
- info = ::Sidekiq.redis { |conn| conn.info }
19
- instrument 'redis.used_memory', ( info['used_memory'].to_f / MEGABYTE ).round(2)
20
- instrument 'redis.connected_clients', info['connected_clients']
21
- instrument 'redis.blocked_clients', info['blocked_clients']
22
- instrument 'redis.connected_slaves', info['connected_slaves']
23
- instrument 'redis.ops_per_sec', info['instantaneous_ops_per_sec']
24
- end
25
-
26
- def stats
27
- ::Sidekiq::Stats.new
28
- end
29
-
30
- def workers
31
- ::Sidekiq.redis { |conn|
32
- conn
33
- .smembers('workers')
34
- .map { |w| conn.get("worker:#{w}") }
35
- .compact
36
- }.length
37
- end
38
- end
39
- end