graphiterb 0.2.11 → 0.2.12

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/.gitignore CHANGED
@@ -1,21 +1,22 @@
1
- ## MAC OS
2
- .DS_Store
3
1
 
4
- ## TEXTMATE
5
- *.tmproj
6
- tmtags
7
2
 
8
- ## EMACS
9
- *~
10
- \#*
11
- .\#*
12
3
 
13
- ## VIM
14
- *.swp
15
4
 
5
+
6
+ ## EMACS
7
+ ## MAC OS
16
8
  ## PROJECT::GENERAL
9
+ ## PROJECT::SPECIFIC
10
+ ## TEXTMATE
11
+ ## VIM
12
+ *.swp
13
+ *.tmproj
14
+ *~
15
+ .DS_Store
16
+ .\#*
17
+ /TAGS
18
+ \#*
17
19
  coverage
18
- rdoc
19
20
  pkg
20
-
21
- ## PROJECT::SPECIFIC
21
+ rdoc
22
+ tmtags
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.11
1
+ 0.2.12
@@ -3,24 +3,12 @@ require 'rubygems'
3
3
  $: << File.dirname(__FILE__)+'/../lib'
4
4
  require 'graphiterb'
5
5
  Configliere.use :commandline, :config_file
6
-
7
- Settings.read 'graphite.yaml'
8
6
  Settings.resolve!
9
- Log = Logger.new($stderr) unless defined?(Log)
10
-
11
- monitor = Graphiterb::GraphiteLogger.new(:iters => nil, :time => 5)
12
-
13
- handle = 'simple_toy'
14
7
 
15
- loop do
16
- monitor.periodically do |metrics, iter, since|
17
- metrics << ["scraper.toy.#{handle}.iter", iter]
18
- metrics << ["scraper.toy.#{handle}.iter", iter]
19
- metrics << ["scraper.toy.#{handle}.iter", iter]
20
- metrics << ["scraper.toy.#{handle}.iter", iter]
8
+ class ToyMonitor < Graphiterb::Monitors::PeriodicMonitor
9
+ def get_metrics metrics, since
10
+ metrics << [scope('random', graphite_identifier), rand]
21
11
  end
22
- delay = 2
23
- sleep delay
24
- print delay.to_s+"\t"
25
12
  end
26
13
 
14
+ ToyMonitor.new('toy').run! if $0 == __FILE__
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{graphiterb}
8
- s.version = "0.2.11"
8
+ s.version = "0.2.12"
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-09-22}
12
+ s.date = %q{2010-09-28}
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 = [
@@ -24,11 +24,6 @@ Gem::Specification.new do |s|
24
24
  "README.textile",
25
25
  "Rakefile",
26
26
  "VERSION",
27
- "examples/api_call_monitor.rb",
28
- "examples/file_monitor.rb",
29
- "examples/loadavg_graphite_sender.rb",
30
- "examples/run_servers.sh",
31
- "examples/storage_monitor.rb",
32
27
  "examples/toy.rb",
33
28
  "graphiterb.gemspec",
34
29
  "lib/graphiterb.rb",
@@ -55,11 +50,7 @@ Gem::Specification.new do |s|
55
50
  s.test_files = [
56
51
  "spec/graphiterb_spec.rb",
57
52
  "spec/spec_helper.rb",
58
- "examples/toy.rb",
59
- "examples/storage_monitor.rb",
60
- "examples/loadavg_graphite_sender.rb",
61
- "examples/file_monitor.rb",
62
- "examples/api_call_monitor.rb"
53
+ "examples/toy.rb"
63
54
  ]
64
55
 
65
56
  if s.respond_to? :specification_version then
@@ -13,5 +13,6 @@ Settings.define :carbon_server, :default => 'localhost', :description => "Host
13
13
  Settings.define :carbon_port, :default => '2003', :description => "Port for carbon database server", :required => true
14
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
15
15
  Settings.define :on_error_delay, :default => 0.1, :description => "How long to wait on connect errors", :required => true, :type => Float
16
-
16
+ Settings.define :node_name_file, :default => '/etc/node_name', :description => "Path to a file which contains the name of this node", :type => String
17
17
  Settings.read '/etc/graphiterb/graphiterb.yaml' if File.exist? '/etc/graphiterb/graphiterb.yaml'
18
+ Settings.resolve!
@@ -8,9 +8,16 @@ module Graphiterb
8
8
  module SystemInfo
9
9
 
10
10
  def hostname
11
- @hostname ||= `hostname`.chomp.gsub(".","_")
11
+ @hostname ||= `hostname`.chomp.gsub(/\./,"_")
12
+ end
13
+
14
+ def node_name
15
+ @node_name ||= Settings[:node_name_file] && File.exist?(Settings[:node_name_file]) && File.read(Settings[:node_name_file]).chomp.strip.gsub(/\./, '_')
16
+ end
17
+
18
+ def graphite_identifier
19
+ node_name || hostname
12
20
  end
13
-
14
21
  end
15
22
  end
16
23
  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: 1
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 11
10
- version: 0.2.11
9
+ - 12
10
+ version: 0.2.12
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-09-22 00:00:00 -05:00
18
+ date: 2010-09-28 00:00:00 -05:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -79,11 +79,6 @@ files:
79
79
  - README.textile
80
80
  - Rakefile
81
81
  - VERSION
82
- - examples/api_call_monitor.rb
83
- - examples/file_monitor.rb
84
- - examples/loadavg_graphite_sender.rb
85
- - examples/run_servers.sh
86
- - examples/storage_monitor.rb
87
82
  - examples/toy.rb
88
83
  - graphiterb.gemspec
89
84
  - lib/graphiterb.rb
@@ -139,7 +134,3 @@ test_files:
139
134
  - spec/graphiterb_spec.rb
140
135
  - spec/spec_helper.rb
141
136
  - examples/toy.rb
142
- - examples/storage_monitor.rb
143
- - examples/loadavg_graphite_sender.rb
144
- - examples/file_monitor.rb
145
- - examples/api_call_monitor.rb
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $: << File.dirname(__FILE__)+'/../lib/'
3
- require 'graphiterb'
4
- require 'graphiterb/graphite_script'
5
-
6
- WC_EXEC = '/usr/bin/wc'
7
-
8
- class ApiCallMonitor < Graphiterb::GraphiteLogger
9
- API_CALLS_TO_MONITOR = %w[trstrank wordbag influence conversation]
10
- ERROR_CODES_TO_MONITOR = %w[4.. 5.. 200]
11
-
12
- def initialize *args
13
- super *args
14
- @current_total = Hash.new
15
- @prev_total = Hash.new
16
- end
17
-
18
- def calls api
19
- total_calls = `cat /var/www/apeyeye/shared/log/apeyeye-access.log | egrep 'GET /soc/net/tw/#{api}' | #{WC_EXEC} -l` rescue 0
20
- @current_total[api] = total_calls.to_i
21
- end
22
-
23
- def errors error_code
24
- log_cat = `cat /var/www/apeyeye/shared/log/apeyeye-access.log | egrep 'GET /soc/net/tw/.*HTTP/1\.[0-1]..#{error_code}' | #{WC_EXEC} -l` rescue 0
25
- @current_total[error_code] = log_cat.to_i
26
- end
27
-
28
- def rate item
29
- @prev_total[item] ||= @current_total[item]
30
- rate = @current_total[item].to_i - @prev_total[item].to_i
31
- @prev_total[item] = @current_total[item]
32
- [0, rate].max
33
- end
34
-
35
- def get_metrics metrics, iter, since
36
- API_CALLS_TO_MONITOR.each do |api|
37
- metrics << [scope_name(hostname, api, 'total_accesses'), calls(api)]
38
- metrics << [scope_name(hostname, api, 'accesses'), rate(api)]
39
- end
40
- ERROR_CODES_TO_MONITOR.each do |code|
41
- metrics << [scope_name(hostname, code.gsub('.','x'), 'total_errors'), errors(code)]
42
- metrics << [scope_name(hostname, code.gsub('.','x'), 'errors'), rate(code)]
43
- end
44
- end
45
- end
46
-
47
-
48
- warn "Update delay is #{Settings.update_delay} seconds. You probably want something larger: some of these checks are data-intensive" if Settings.update_delay < 60
49
- Settings.die "Update delay is #{Settings.update_delay} seconds. You need to radio in at least as often as /usr/local/share/graphite/conf/storage-schemas says -- this is typically 5 minutes." if Settings.update_delay >= 300
50
-
51
- ApiCallMonitor.new('apeyeye', :iters => nil, :time => Settings.update_delay).run!
@@ -1,113 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $: << File.dirname(__FILE__)+'/../lib/'
3
- require 'graphiterb'
4
- Settings.define :work_dir, :description => "Base directory where scrapers store files. (Ex: /data/ripd/com.tw)", :required => true
5
- require 'graphiterb/graphite_script'
6
-
7
- #
8
- # Usage:
9
- #
10
- # nohup ~/ics/backend/graphiterb/bin/file_monitor.rb --work_dir=/data/ripd/com.tw --carbon_server=whatever --update_delay=120 > /data/log/file_monitor.log 2>&1 &
11
- #
12
-
13
- WC_EXEC = '/usr/bin/wc'
14
-
15
- class FilePool
16
- # Path to sample for files
17
- attr_accessor :path
18
- # wildcard sequence for files under the current directory
19
- attr_accessor :filter_re
20
- # A recent file was modified within this window
21
- attr_accessor :recent_window
22
- # Only consider the last this-many files
23
- MAX_FILES = 30
24
-
25
- def initialize path, filter_re=/.*/, options={}
26
- self.path = path
27
- self.filter_re = filter_re
28
- end
29
-
30
- # Name for this pool, suitable for inclusion in a metrics handle
31
- def name
32
- path.gsub(/\./,'_').gsub(%r{/}, '.').gsub(%r{(^\.|\.$)},'')
33
- end
34
-
35
- #
36
- # Lists all files in the pool
37
- # @param filter_block files only keeps filenames that pass this filter
38
- #
39
- def files &filter_block
40
- Dir[File.join(path, '**/*')].
41
- reject{|f| File.directory?(f) }.
42
- select{|f| f =~ filter_re }.
43
- sort.reverse[0..MAX_FILES].
44
- select(&filter_block)
45
- end
46
-
47
- def num_files &filter_block
48
- files(&filter_block).count
49
- end
50
-
51
- def sizes &filter_block
52
- files(&filter_block).map{|f| File.size(f) rescue nil }.compact
53
- end
54
- def size &filter_block
55
- sizes(&filter_block).sum
56
- end
57
- def avg_size &filter_block
58
- sizes(&filter_block).sum.to_f / num_files(&filter_block).to_f
59
- end
60
-
61
- def lines_in_result_of command, *args
62
- begin
63
- escaped_args = args.map{|f| "'#{f}'" }
64
- result = `#{command} #{escaped_args.join(" ")}`.chomp
65
- result.split(/[\r\n]+/)
66
- rescue StandardError => e ; warn(e.backtrace, e) ; return nil ; end
67
- end
68
-
69
- def line_counts &filter_block
70
- files = files(&filter_block) ; return 0 if files.blank?
71
- result = lines_in_result_of(WC_EXEC, '-l', *files) or return 0
72
- counts = result.map{|wc| wc =~ /^\s*(\d+)\s+/ and $1 }.compact
73
- counts.map(&:to_i).sum
74
- end
75
-
76
- def self.recent? file
77
- (Time.now - File.mtime(file)) < 3600
78
- end
79
- def self.recency_filter
80
- Proc.new{|file| recent?(file) }
81
- end
82
- end
83
-
84
- class FileMonitor < Graphiterb::GraphiteSystemLogger
85
- attr_accessor :path
86
- attr_accessor :pools
87
-
88
- def initialize *args
89
- super *args
90
- self.path = Settings.work_dir
91
- self.pools = {}
92
- populate_pools!
93
- end
94
-
95
- def populate_pools!
96
- Dir[File.join(path, '*')].select{|d| File.directory?(d) }.each do |dir|
97
- self.pools[dir] ||= FilePool.new(dir, %r{20\d*/.*\.(?:tsv|json|xml)})
98
- end
99
- end
100
-
101
- def get_metrics metrics, iter, since
102
- recent = FilePool.recency_filter
103
- pools.each do |pool_path, pool|
104
- metrics << [scope_name(pool.name, hostname, 'active_files'), pool.num_files(&recent) ]
105
- metrics << [scope_name(pool.name, hostname, 'active_file_size'), pool.size(&recent) ]
106
- metrics << [scope_name(pool.name, hostname, 'line_counts'), pool.line_counts(&recent) ]
107
- end
108
- end
109
- end
110
-
111
- warn "Update delay is #{Settings.update_delay} seconds. You probably want something larger: some of the metrics are expensive." if Settings.update_delay < 60
112
- warn "Update delay is #{Settings.update_delay} seconds. You probably want something smaller: need to report in faster than the value in the graphite/conf/storage-schemas." if Settings.update_delay >= 300
113
- FileMonitor.new('scraper', :iters => nil, :time => Settings.update_delay).run!
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'rubygems'
3
- $: << File.dirname(__FILE__)+'/../lib'
4
- require 'graphiterb'
5
- Configliere.use :commandline, :config_file
6
-
7
- Settings.read 'graphite.yaml'
8
- Settings.resolve!
9
- Log = Logger.new($stderr) unless defined?(Log)
10
-
11
- class LoadavgGraphiteSender < Graphiterb::GraphiteSender
12
- def hostname
13
- @hostname ||= `hostname`.chomp
14
- end
15
-
16
- def loadavgs
17
- # File.open('/proc/loadavg').read.strip.split[0..2]
18
- `uptime`.chomp.gsub(/.*:\s+/, '').split(/[,\s]+/)
19
- end
20
-
21
- def loadavgs_metrics
22
- %w[1min 5min 15min].zip(loadavgs).map do |duration, avg|
23
- ["system.#{hostname}.loadavg_#{duration}", avg]
24
- end
25
- end
26
-
27
- def send_loop
28
- loop do
29
- send *loadavgs_metrics
30
- Log.info "Sleeping #{Settings.update_delay}"
31
- sleep Settings.update_delay.to_i
32
- end
33
- end
34
- end
35
-
36
- LoadavgGraphiteSender.new.send_loop
@@ -1,2 +0,0 @@
1
- PYTHONPATH=$pwd/whisper nohup ./bin/run-graphite-devel-server.py --libs=$pwd/webapp/ /usr/local/share/graphite/ >> ./storage/log/webapp/server.log 2>&1 &
2
- PYTHONPATH=$pwd/whisper nohup ./carbon/bin/carbon-cache.py --debug start >> ./storage/log/carbon-cache/console.log 2>&1 &
@@ -1,23 +0,0 @@
1
- #!/usr/bin/env ruby
2
- $: << File.dirname(__FILE__)+'/../lib/'
3
- require 'rubygems'
4
- require 'graphiterb/graphite_script'
5
-
6
- class AvailSpaceMonitor < Graphiterb::GraphiteLogger
7
- def diskfree
8
- `/bin/df`.chomp.split("\n").
9
- grep(%r{^/dev/}).
10
- map{|line| line.split(/\s+/) } rescue []
11
- end
12
-
13
- def get_metrics metrics, iter, since
14
- diskfree.each do |handle, size, spaceused, spacefree, percentfree, location|
15
- metrics << ["system.#{hostname}#{handle.gsub(/\//,'.')}.available", spacefree.to_i]
16
- end
17
- end
18
- end
19
-
20
- warn "Update delay is #{Settings.update_delay} seconds. You probably want something larger: some of the metrics are expensive." if Settings.update_delay < 30
21
- warn "Update delay is #{Settings.update_delay} seconds. You probably want something smaller: need to report in faster than the value in the graphite/conf/storage-schemas." if Settings.update_delay >= 60
22
-
23
- AvailSpaceMonitor.new('system').run!