graphiterb 0.0.1 → 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/README.textile ADDED
@@ -0,0 +1,35 @@
1
+ = graphiterb
2
+
3
+ Fast, Ubiquitous dashboard logging with Graphite.
4
+
5
+ <pre>
6
+ # in initialize, perhaps
7
+ self.sender = Graphiterb::GraphiteSender
8
+
9
+ # ... somewhere else ...
10
+ sender.send( ['webserver.pages', pages_this_hour], ['webserver.errors', errors_this_hour] )
11
+ </pre>
12
+
13
+ ... and also see the examples, like bin/loadavg_graphite_sender.rb
14
+
15
+ Uses:
16
+ * "Graphite":http://graphite.wikidot.com
17
+
18
+ Depends on:
19
+ * "Configliere":http://github.com/mrflip/configliere
20
+
21
+ h2. Other
22
+
23
+ h3. Note on Patches/Pull Requests
24
+
25
+ * Fork the project.
26
+ * Make your feature addition or bug fix.
27
+ * Add tests for it. This is important so I don't break it in a
28
+ future version unintentionally.
29
+ * Commit, do not mess with rakefile, version, or history.
30
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
31
+ * Send me a pull request. Bonus points for topic branches.
32
+
33
+ h3. Copyright
34
+
35
+ Copyright (c) 2010 Infochimps (@infochimps). See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.dirname(__FILE__)+'/../lib/'
3
+ require 'graphite'
4
+ require 'graphite/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..)
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 | grep 'GET /soc/net/tw/#{api}' | #{WC_EXEC} -l`
20
+ @current_total[api] = total_calls
21
+ end
22
+
23
+ def errors error_code
24
+ log_cat = `cat /var/www/apeyeye/shared/log/apeyeye-access.log | grep 'GET /soc/net/tw/.*HTTP/1\.[0-1]..#{error_code}' | #{WC_EXEC} -l`
25
+ @current_total[error_code] = log_cat
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 hostname
36
+ @hostname ||= `hostname`.chomp.gsub(".","_")
37
+ end
38
+
39
+ def get_metrics metrics, iter, since
40
+ API_CALLS_TO_MONITOR.each do |api|
41
+ calls(api)
42
+ metrics << [scope_name(hostname, api, 'accesses'), rate(api)]
43
+ end
44
+ ERROR_CODES_TO_MONITOR.each do |code|
45
+ errors(code)
46
+ metrics << [scope_name(hostname, code.gsub('.','x'), 'errors'), rate(code)]
47
+ end
48
+ end
49
+ end
50
+
51
+
52
+ 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
53
+ 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
54
+
55
+ ApiCallMonitor.new('apeyeye', :iters => nil, :time => Settings.update_delay).run!
@@ -0,0 +1,113 @@
1
+ #!/usr/bin/env ruby
2
+ $: << File.dirname(__FILE__)+'/../lib/'
3
+ require 'graphite'
4
+ Settings.define :work_dir, :description => "Base directory where scrapers store files. (Ex: /data/ripd/com.tw)", :required => true
5
+ require 'graphite/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)) < 1.hour
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!
@@ -8,14 +8,19 @@ Settings.read 'graphite.yaml'
8
8
  Settings.resolve!
9
9
  Log = Logger.new($stderr) unless defined?(Log)
10
10
 
11
- class LoadavgGraphiteSender < GraphiteRb::GraphiteSender
11
+ class LoadavgGraphiteSender < Graphiterb::GraphiteSender
12
+ def hostname
13
+ @hostname ||= `hostname`.chomp
14
+ end
15
+
12
16
  def loadavgs
13
- File.open('/proc/loadavg').read.strip.split[0..2]
17
+ # File.open('/proc/loadavg').read.strip.split[0..2]
18
+ `uptime`.chomp.gsub(/.*:\s+/, '').split(/[,\s]+/)
14
19
  end
15
20
 
16
- def loadavgs_metrics
21
+ def loadavgs_metrics
17
22
  %w[1min 5min 15min].zip(loadavgs).map do |duration, avg|
18
- ["system_rb.loadavg_#{duration}", avg]
23
+ ["system.#{hostname}.loadavg_#{duration}", avg]
19
24
  end
20
25
  end
21
26
 
@@ -0,0 +1,2 @@
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 &
@@ -0,0 +1,23 @@
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!
data/bin/toy.rb ADDED
@@ -0,0 +1,26 @@
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
+ monitor = Graphiterb::GraphiteLogger.new(:iters => nil, :time => 5)
12
+
13
+ handle = 'simple_toy'
14
+
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]
21
+ end
22
+ delay = 2
23
+ sleep delay
24
+ print delay.to_s+"\t"
25
+ end
26
+
data/graphiterb.gemspec CHANGED
@@ -5,31 +5,38 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{graphiterb}
8
- s.version = "0.0.1"
8
+ s.version = "0.1.0"
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-03-02}
13
- s.default_executable = %q{example-client.rb}
12
+ s.date = %q{2010-07-19}
14
13
  s.description = %q{Uses http://github.com/mrflip/configliere and http://graphite.wikidot.com}
15
14
  s.email = %q{info@infochimps.org}
16
- s.executables = ["example-client.rb"]
15
+ s.executables = ["run_servers.sh", "storage_monitor.rb", "api_call_monitor.rb", "loadavg_graphite_sender.rb", "toy.rb", "file_monitor.rb"]
17
16
  s.extra_rdoc_files = [
18
17
  "LICENSE",
19
- "README.rdoc"
18
+ "README.textile"
20
19
  ]
21
20
  s.files = [
22
21
  ".document",
23
22
  ".gitignore",
24
23
  "CHANGELOG",
25
24
  "LICENSE",
26
- "README.rdoc",
25
+ "README.textile",
27
26
  "Rakefile",
28
27
  "VERSION",
29
- "bin/example-client.rb",
28
+ "bin/api_call_monitor.rb",
29
+ "bin/file_monitor.rb",
30
+ "bin/loadavg_graphite_sender.rb",
31
+ "bin/run_servers.sh",
32
+ "bin/storage_monitor.rb",
33
+ "bin/toy.rb",
30
34
  "graphiterb.gemspec",
31
35
  "lib/graphiterb.rb",
36
+ "lib/graphiterb/graphite_logger.rb",
37
+ "lib/graphiterb/graphite_script.rb",
32
38
  "lib/graphiterb/graphite_sender.rb",
39
+ "lib/graphiterb/graphite_system_logger.rb",
33
40
  "spec/graphiterb_spec.rb",
34
41
  "spec/spec.opts",
35
42
  "spec/spec_helper.rb"
@@ -37,18 +44,18 @@ Gem::Specification.new do |s|
37
44
  s.homepage = %q{http://github.com/mrflip/graphiterb}
38
45
  s.rdoc_options = ["--charset=UTF-8"]
39
46
  s.require_paths = ["lib"]
40
- s.rubygems_version = %q{1.3.6}
47
+ s.rubygems_version = %q{1.3.7}
41
48
  s.summary = %q{Fast Ubiquitous Dashboard Logs with Graphite (http://graphite.wikidot.com)}
42
49
  s.test_files = [
43
- "spec/spec_helper.rb",
44
- "spec/graphiterb_spec.rb"
50
+ "spec/graphiterb_spec.rb",
51
+ "spec/spec_helper.rb"
45
52
  ]
46
53
 
47
54
  if s.respond_to? :specification_version then
48
55
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
49
56
  s.specification_version = 3
50
57
 
51
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
58
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
59
  s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
53
60
  s.add_development_dependency(%q<yard>, [">= 0"])
54
61
  else
@@ -0,0 +1,42 @@
1
+ require 'monkeyshines/monitor'
2
+
3
+ module Graphiterb
4
+ class GraphiteLogger < Monkeyshines::Monitor::PeriodicMonitor
5
+ # Connection to graphite server
6
+ attr_reader :sender
7
+ # the leading segment for sent metrics -- eg 'scrapers' or 'api_calls'
8
+ attr_reader :main_scope
9
+
10
+ def initialize main_scope, *args
11
+ super *args
12
+ self.time_interval ||= Settings.update_delay
13
+ @sender = GraphiteSender.new
14
+ @main_scope = main_scope
15
+ end
16
+
17
+ def periodically &block
18
+ super do |iter, since|
19
+ metrics = []
20
+ block.call(metrics, iter, since)
21
+ sender.send *metrics
22
+ end
23
+ end
24
+
25
+ def hostname
26
+ @host ||= `hostname`.chomp.gsub(".","_")
27
+ end
28
+
29
+ def scope_name *scope
30
+ [main_scope, scope].flatten.reject(&:blank?).join('.')
31
+ end
32
+
33
+ def run!
34
+ loop do
35
+ periodically do |metrics, iter, since|
36
+ get_metrics metrics, iter, since
37
+ end
38
+ sleep 1
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,9 @@
1
+ require 'rubygems'
2
+ require 'graphiterb'
3
+ require 'wukong/extensions'
4
+ Configliere.use :commandline, :config_file, :define
5
+
6
+ Log = ::Logger.new($stderr) unless defined?(Log)
7
+
8
+ Settings.read 'graphite.yaml'
9
+ Settings.resolve!
@@ -1,4 +1,4 @@
1
- module GraphiteRb
1
+ module Graphiterb
2
2
  #
3
3
  # @example:
4
4
  # # in initialize, perhaps
@@ -8,28 +8,30 @@ module GraphiteRb
8
8
  # sender.send( ['webserver.pages', pages_this_hour], ['webserver.errors', errors_this_hour] )
9
9
  #
10
10
  class GraphiteSender
11
- attr_accessor :socket
12
-
13
11
  def initialize
14
12
  open!
15
13
  end
16
14
 
17
15
  def open!
18
16
  begin
19
- warn "Connecting to server #{Settings.carbon_server} port #{Settings.carbon_port}"
20
- self.socket = TCPSocket.new(Settings.carbon_server, Settings.carbon_port)
17
+ Log.warn "Connecting to server #{Settings.carbon_server} port #{Settings.carbon_port}"
18
+ @socket = TCPSocket.new(Settings.carbon_server, Settings.carbon_port)
21
19
  rescue StandardError => e
22
20
  Log.warn "Couldn't connect to server #{Settings.carbon_server} port #{Settings.carbon_port}: #{e.class} #{e}"
23
- raise e
24
21
  end
25
22
  end
26
23
 
24
+ def socket
25
+ @socket ||= open!
26
+ end
27
+
27
28
  def safely &block
28
29
  begin
29
30
  block.call
30
31
  rescue StandardError => e
31
32
  Log.warn "Sleeping #{Settings.on_error_delay}: #{e.class} #{e}"
32
33
  sleep Settings.on_error_delay
34
+ @socket = nil
33
35
  return nil
34
36
  end
35
37
  end
@@ -40,10 +42,10 @@ module GraphiteRb
40
42
 
41
43
  def send *metrics
42
44
  now = timestamp
43
- message = metrics.map{|metric, val| [metric, val, now].join(" ") }.join("\n")
45
+ message = metrics.map{|metric, val, ts| [metric, val, (ts||now)].join(" ") }.join("\n")
44
46
  safely do
45
47
  socket.puts(message)
46
- Log.debug "Sent:\n#{message}\n#{'-'*80}"
48
+ Log.info message.gsub(/\n+/, "\t")
47
49
  end
48
50
  end
49
51
  end
@@ -0,0 +1,5 @@
1
+ module Graphiterb
2
+ class GraphiteSystemLogger < GraphiteLogger
3
+
4
+ end
5
+ end
data/lib/graphiterb.rb CHANGED
@@ -5,7 +5,11 @@ require 'configliere'
5
5
  Configliere.use :define
6
6
  Settings.define :carbon_server, :default => 'localhost', :description => "Host address for carbon database server", :required => true
7
7
  Settings.define :carbon_port, :default => '2003', :description => "Port for carbon database server", :required => true
8
- Settings.define :update_delay, :default => 60, :description => "How long to wait between updates", :required => true, :type => Integer
9
- Settings.define :on_error_delay, :default => 60, :description => "How long to wait on connect errors", :required => true, :type => Integer
8
+ 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
9
+ Settings.define :on_error_delay, :default => 0.1, :description => "How long to wait on connect errors", :required => true, :type => Float
10
10
 
11
11
  require 'graphiterb/graphite_sender'
12
+ module Graphiterb
13
+ autoload :GraphiteLogger, 'graphiterb/graphite_logger'
14
+ autoload :GraphiteSystemLogger, 'graphiterb/graphite_system_logger'
15
+ end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphiterb
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 27
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
- - 0
8
8
  - 1
9
- version: 0.0.1
9
+ - 0
10
+ version: 0.1.0
10
11
  platform: ruby
11
12
  authors:
12
13
  - Philip (flip) Kromer (@mrflip)
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-03-02 00:00:00 +00:00
18
- default_executable: example-client.rb
18
+ date: 2010-07-19 00:00:00 +00:00
19
+ default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: rspec
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 13
27
30
  segments:
28
31
  - 1
29
32
  - 2
@@ -35,9 +38,11 @@ dependencies:
35
38
  name: yard
36
39
  prerelease: false
37
40
  requirement: &id002 !ruby/object:Gem::Requirement
41
+ none: false
38
42
  requirements:
39
43
  - - ">="
40
44
  - !ruby/object:Gem::Version
45
+ hash: 3
41
46
  segments:
42
47
  - 0
43
48
  version: "0"
@@ -46,24 +51,37 @@ dependencies:
46
51
  description: Uses http://github.com/mrflip/configliere and http://graphite.wikidot.com
47
52
  email: info@infochimps.org
48
53
  executables:
49
- - example-client.rb
54
+ - run_servers.sh
55
+ - storage_monitor.rb
56
+ - api_call_monitor.rb
57
+ - loadavg_graphite_sender.rb
58
+ - toy.rb
59
+ - file_monitor.rb
50
60
  extensions: []
51
61
 
52
62
  extra_rdoc_files:
53
63
  - LICENSE
54
- - README.rdoc
64
+ - README.textile
55
65
  files:
56
66
  - .document
57
67
  - .gitignore
58
68
  - CHANGELOG
59
69
  - LICENSE
60
- - README.rdoc
70
+ - README.textile
61
71
  - Rakefile
62
72
  - VERSION
63
- - bin/example-client.rb
73
+ - bin/api_call_monitor.rb
74
+ - bin/file_monitor.rb
75
+ - bin/loadavg_graphite_sender.rb
76
+ - bin/run_servers.sh
77
+ - bin/storage_monitor.rb
78
+ - bin/toy.rb
64
79
  - graphiterb.gemspec
65
80
  - lib/graphiterb.rb
81
+ - lib/graphiterb/graphite_logger.rb
82
+ - lib/graphiterb/graphite_script.rb
66
83
  - lib/graphiterb/graphite_sender.rb
84
+ - lib/graphiterb/graphite_system_logger.rb
67
85
  - spec/graphiterb_spec.rb
68
86
  - spec/spec.opts
69
87
  - spec/spec_helper.rb
@@ -77,26 +95,30 @@ rdoc_options:
77
95
  require_paths:
78
96
  - lib
79
97
  required_ruby_version: !ruby/object:Gem::Requirement
98
+ none: false
80
99
  requirements:
81
100
  - - ">="
82
101
  - !ruby/object:Gem::Version
102
+ hash: 3
83
103
  segments:
84
104
  - 0
85
105
  version: "0"
86
106
  required_rubygems_version: !ruby/object:Gem::Requirement
107
+ none: false
87
108
  requirements:
88
109
  - - ">="
89
110
  - !ruby/object:Gem::Version
111
+ hash: 3
90
112
  segments:
91
113
  - 0
92
114
  version: "0"
93
115
  requirements: []
94
116
 
95
117
  rubyforge_project:
96
- rubygems_version: 1.3.6
118
+ rubygems_version: 1.3.7
97
119
  signing_key:
98
120
  specification_version: 3
99
121
  summary: Fast Ubiquitous Dashboard Logs with Graphite (http://graphite.wikidot.com)
100
122
  test_files:
101
- - spec/spec_helper.rb
102
123
  - spec/graphiterb_spec.rb
124
+ - spec/spec_helper.rb
data/README.rdoc DELETED
@@ -1,17 +0,0 @@
1
- = graphiterb
2
-
3
- Description goes here.
4
-
5
- == Note on Patches/Pull Requests
6
-
7
- * Fork the project.
8
- * Make your feature addition or bug fix.
9
- * Add tests for it. This is important so I don't break it in a
10
- future version unintentionally.
11
- * Commit, do not mess with rakefile, version, or history.
12
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
- * Send me a pull request. Bonus points for topic branches.
14
-
15
- == Copyright
16
-
17
- Copyright (c) 2010 Philip (flip) Kromer (@mrflip). See LICENSE for details.