graphiterb 0.2.6 → 0.2.7

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.6
1
+ 0.2.7
data/graphiterb.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{graphiterb}
8
- s.version = "0.2.6"
8
+ s.version = "0.2.7"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Philip (flip) Kromer (@mrflip)"]
12
- s.date = %q{2010-08-18}
12
+ s.date = %q{2010-09-10}
13
13
  s.description = %q{Uses http://github.com/mrflip/configliere and http://graphite.wikidot.com}
14
14
  s.email = %q{info@infochimps.org}
15
15
  s.extra_rdoc_files = [
@@ -32,7 +32,9 @@ Gem::Specification.new do |s|
32
32
  "examples/toy.rb",
33
33
  "graphiterb.gemspec",
34
34
  "lib/graphiterb.rb",
35
+ "lib/graphiterb/accumulator.rb",
35
36
  "lib/graphiterb/monitors.rb",
37
+ "lib/graphiterb/monitors/accumulations_consumer.rb",
36
38
  "lib/graphiterb/monitors/directory_tree.rb",
37
39
  "lib/graphiterb/monitors/disk_space.rb",
38
40
  "lib/graphiterb/monitors/system.rb",
data/lib/graphiterb.rb CHANGED
@@ -3,11 +3,12 @@ require 'graphiterb/utils'
3
3
  module Graphiterb
4
4
  autoload :Monitors, 'graphiterb/monitors'
5
5
  autoload :Sender, 'graphiterb/sender'
6
+ autoload :Accumulator, 'graphiterb/accumulator'
6
7
  end
7
8
 
8
9
  Settings.use :define, :config_file
9
10
 
10
- Settings.define :log, :default => STDOUT, :description => "Log output for Graphiterb"
11
+ Settings.define :log, :description => "Log output for Graphiterb"
11
12
  Settings.define :carbon_server, :default => 'localhost', :description => "Host address for carbon database server", :required => true
12
13
  Settings.define :carbon_port, :default => '2003', :description => "Port for carbon database server", :required => true
13
14
  Settings.define :update_delay, :default => 30, :description => "How long to wait between updates. Must be faster than the value in the graphite/conf/storage-schemas", :required => true, :type => Integer
@@ -0,0 +1,81 @@
1
+ module Graphiterb
2
+
3
+ # An accumulator that uses a Redis database as a fast store.
4
+ #
5
+ # a = Accumulator.new
6
+ # a.increment('my_value')
7
+ #
8
+ # It's assumed that the Redis database is local and on the default
9
+ # port, but pass in :host or :port (or any other options Redis.new
10
+ # understands) to change this.
11
+ #
12
+ # By default incrementing 'my_value' which actually increment a
13
+ # counter stored at the key
14
+ # 'graphiterb_accumulator:my_value:HOSTNAME'.
15
+ #
16
+ # See Graphiterb::Monitors::AccumulationsConsumer for the periodic
17
+ # monitor that will consume the accumulated counts.
18
+ class Accumulator
19
+
20
+ # The Redis database.
21
+ attr_accessor :redis
22
+
23
+ # The Redis namespace used for the accumulators.
24
+ attr_accessor :accumulators
25
+
26
+ # The top-level scope under which to accumulate.
27
+ attr_accessor :main_scope
28
+
29
+ # Provides methods for finding out about the node this code is
30
+ # running on.
31
+ include Graphiterb::Utils::SystemInfo
32
+
33
+ # Initialize a new Accumulator.
34
+ #
35
+ # Takes the same options as Redis.new.
36
+ #
37
+ # @param [String] main_scope
38
+ # @param [Hash] options
39
+ def initialize main_scope, options={}
40
+ require 'redis'
41
+ require 'redis-namespace'
42
+ @main_scope = main_scope
43
+ @redis = Redis.new(options)
44
+ @accumulators = Redis::Namespace.new('graphiterb_accumulators', :redis => redis)
45
+ end
46
+
47
+ # Increment the Graphite target +args+ by the given +amount+.
48
+ #
49
+ # The target will be automatically scoped, see Accumulator#scope.
50
+ #
51
+ # @param [Integer] amount
52
+ # @param [Array<String>, String] args
53
+ def increment_by amount, *args
54
+ accumulators.incrby(scope(*args), amount)
55
+ end
56
+
57
+ # Increment the Graphite target +args+.
58
+ #
59
+ # @param [Array<String>, String] args
60
+ def increment *args
61
+ accumulators.incr(scope(*args))
62
+ end
63
+
64
+ # Return the scoped accumulator name.
65
+ #
66
+ # This will be a valid string target that can be passed directly
67
+ # to Graphite.
68
+ #
69
+ # a = Accumulator.new('scrapers')
70
+ # a.scope('foo.bar', 'baz')
71
+ # #=> 'scrapers.foo.bar.baz.ip-120.112.4.383'
72
+ #
73
+ # @param [Array<String>, String] args
74
+ # @return [String]
75
+ def scope *args
76
+ [main_scope, args, hostname].flatten.compact.map(&:to_s).join('.')
77
+ end
78
+
79
+ end
80
+ end
81
+
@@ -4,6 +4,7 @@ module Graphiterb
4
4
  autoload :DiskSpace, 'graphiterb/monitors/disk_space'
5
5
  autoload :System, 'graphiterb/monitors/system'
6
6
  autoload :DirectoryTree, 'graphiterb/monitors/directory_tree'
7
+ autoload :AccumulationsConsumer, 'graphiterb/monitors/accumulations_consumer'
7
8
 
8
9
  # Accepts a lightweight call every iteration.
9
10
  #
@@ -0,0 +1,51 @@
1
+ module Graphiterb
2
+ module Monitors
3
+
4
+ # A monitor which consumes counts accumulated in a Redis store by
5
+ # Graphiterb::Accumulator.
6
+ class AccumulationsConsumer < Graphiterb::Monitors::PeriodicMonitor
7
+
8
+ # The Redis database.
9
+ attr_accessor :redis
10
+
11
+ # The Redis namespace used for the accumulators.
12
+ attr_accessor :accumulators
13
+
14
+ # A regular expression that must match the Graphite target
15
+ # (defaults to always matching).
16
+ attr_accessor :regexp
17
+
18
+ # Instantiate a new AccumulationsConsumer.
19
+ #
20
+ # Options are passed to Redis.new as well as
21
+ # Graphiterb::Monitors::PeriodicMonitor.
22
+ #
23
+ # Include the :regexp option if you want this monitor to only
24
+ # consume keys corresponding to Graphite targets which match the
25
+ # regexp. This is useful for having multiple
26
+ # AccumulationsConsumer monitors running with different
27
+ # frequencies tracking different Graphite target families.
28
+ def initialize options={}
29
+ require 'redis'
30
+ require 'redis-namespace'
31
+ @redis = Redis.new(options)
32
+ @accumulators = Redis::Namespace.new('graphiterb_accumulators', :redis => @redis)
33
+ @regexp = options[:regexp] || /.*/
34
+ super('fake_scope', options)
35
+ end
36
+
37
+ # Uses Redis' +getset+ call to retrieve total accumulated counts
38
+ # from Redis and reset them to 0 atomically.
39
+ def get_metrics metrics, since
40
+ accumulators.keys.each do |target|
41
+ next unless regexp =~ target
42
+ current_count = accumulators.getset(target, 0) rescue 0.0
43
+ rate = current_count.to_f / since.to_f rescue 0.0
44
+ metrics << [target, rate] # no need to scope as targets are pre-scoped
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+
@@ -34,6 +34,7 @@ module Graphiterb
34
34
  end
35
35
 
36
36
  def send *metrics
37
+ return if metrics.blank?
37
38
  now = timestamp
38
39
  safely do
39
40
  message = metrics.map{|metric, val, ts| [metric, val, (ts||now)].join(" ") }.join("\n")+"\n"
@@ -4,10 +4,8 @@ module Graphiterb
4
4
 
5
5
  class << self; attr_accessor :log end
6
6
 
7
- # Create a Logger and point it at Graphiterb::LOG_FILE_DESTINATION which is
8
- # set in ~/.imwrc and defaults to STDERR.
9
7
  def self.instantiate_logger!
10
- Graphiterb.log ||= Logger.new(Settings[:log])
8
+ Graphiterb.log ||= Logger.new(Settings[:log] || STDOUT)
11
9
  Graphiterb.log.datetime_format = "%Y%m%d-%H:%M:%S "
12
10
  Graphiterb.log.level = Logger::INFO
13
11
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphiterb
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 6
10
- version: 0.2.6
9
+ - 7
10
+ version: 0.2.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Philip (flip) Kromer (@mrflip)
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-18 00:00:00 -05:00
18
+ date: 2010-09-10 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -87,7 +87,9 @@ files:
87
87
  - examples/toy.rb
88
88
  - graphiterb.gemspec
89
89
  - lib/graphiterb.rb
90
+ - lib/graphiterb/accumulator.rb
90
91
  - lib/graphiterb/monitors.rb
92
+ - lib/graphiterb/monitors/accumulations_consumer.rb
91
93
  - lib/graphiterb/monitors/directory_tree.rb
92
94
  - lib/graphiterb/monitors/disk_space.rb
93
95
  - lib/graphiterb/monitors/system.rb