mongodb-graphite-agent 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -15,4 +15,5 @@ spec/reports
15
15
  test/tmp
16
16
  test/version_tmp
17
17
  tmp
18
- .idea/*
18
+ .idea/*
19
+ lastsample
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source 'https://rubygems.org'
2
-
1
+ source 'https://rubygems.org'
2
+
3
3
  gemspec
@@ -1,7 +1,27 @@
1
- #!/usr/bin/env ruby
2
- $:.unshift File.absolute_path("#{File.dirname(__FILE__)}/../lib")
3
- puts $LOAD_PATH
4
- require "mongodb/graphite/agent"
5
-
6
- Mongodb::Graphite::Agent.run()
7
- #Agent.run()
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.expand_path("#{File.dirname(__FILE__)}/../lib")
4
+
5
+ require 'trollop'
6
+ require 'mongodb/graphite/agent'
7
+ require 'mongodb/graphite/agent/graphite_writer'
8
+
9
+ opts = Trollop::options do
10
+ opt :mongodb_username, "MongoDB username", :type => :string
11
+ opt :mongodb_host, "MongoDB host", :type => :string, :default => "localhost"
12
+ opt :mongodb_post, "MongoDB host", :type => :int, :default => 27017
13
+ opt :mongodb_password, "MongoDB password", :type => :string
14
+ opt :graphite_host, "Graphite host", :type => :string
15
+ opt :graphite_port, "Graphite port", :type => :string
16
+ opt :dry_run, "Dry run", :type => :boolean, :default => false
17
+ opt :verbose, "Verbose", :type => :boolean, :default => false
18
+ end
19
+
20
+ if opts[:dry_run]
21
+ puts "\n\nWARNING!!! This is a dry run\n\n\n"
22
+ sleep 1
23
+ end
24
+
25
+ #@writer = Mongodb::Graphite::Agent::GraphiteWriter.new("localhost", 12)
26
+ #@writer.write ({ "antani" => 5, "boh" => 1 })
27
+ Mongodb::Graphite::Agent.run(opts)
@@ -0,0 +1,33 @@
1
+
2
+
3
+ class Hash
4
+ def hash_map
5
+ self.inject({}) do |newhash, (k,v)|
6
+ newhash[k] = yield(k, v)
7
+ newhash
8
+ end
9
+ end
10
+ end
11
+
12
+ module Mongodb
13
+ module Graphite
14
+ module Agent
15
+ class GraphiteWriter
16
+ def initialize(host, port, verbose)
17
+ @graphite = ::Graphite.new({:host => host, :port => port})
18
+ @verbose = verbose
19
+ end
20
+
21
+ def write(metric_hash)
22
+ puts "Sending data to graphite" if @verbose
23
+ ap metric_hash if @verbose
24
+ @metric_hash_with_hostname = metric_hash.map { |k, v| { "#{Socket.gethostname}.#{k}" => v } }.reduce Hash.new(), :merge
25
+ @graphite.send_metrics @metric_hash_with_hostname
26
+ #ap metric_hash.hash_map { |k, v| { "#{Socket.gethostname}.#{k}" => v }}
27
+
28
+ #@graphite.send_metrics({"#{Socket.gethostname}.#{metric}" => value})
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,26 +1,26 @@
1
- require 'date'
2
-
3
- module Mongodb
4
- module Graphite
5
- module Agent
6
-
7
- class OpCountersSample
8
- attr_reader :values, :sample_time
9
-
10
- def initialize(values, sample_time = DateTime.now.to_s)
11
- @values = values
12
- @sample_time = sample_time
13
- end
14
-
15
- def marshal_dump
16
- [@sample_time, @values]
17
- end
18
-
19
- def marshal_load array
20
- @sample_time, @values = array
21
- end
22
-
23
- end
24
- end
25
- end
1
+ require 'date'
2
+
3
+ module Mongodb
4
+ module Graphite
5
+ module Agent
6
+
7
+ class OpCountersSample
8
+ attr_reader :values, :sample_time
9
+
10
+ def initialize(values, sample_time = DateTime.now.to_s)
11
+ @values = values
12
+ @sample_time = sample_time
13
+ end
14
+
15
+ def marshal_dump
16
+ [@sample_time, @values]
17
+ end
18
+
19
+ def marshal_load array
20
+ @sample_time, @values = array
21
+ end
22
+
23
+ end
24
+ end
25
+ end
26
26
  end
@@ -21,7 +21,7 @@ module Mongodb
21
21
  end
22
22
 
23
23
  def self.to_hash(s)
24
- json_descent([], s).flatten
24
+ json_descent([], s).flatten.reduce Hash.new, :merge
25
25
  end
26
26
  end
27
27
  end
@@ -1,7 +1,7 @@
1
1
  module Mongodb
2
2
  module Graphite
3
3
  module Agent
4
- VERSION = "0.0.3"
4
+ VERSION = "0.0.4"
5
5
  end
6
6
  end
7
7
  end
@@ -12,13 +12,15 @@ require 'mongodb/graphite/agent/op_counters_sample'
12
12
  module Mongodb
13
13
  module Graphite
14
14
  module Agent
15
- def self.run
16
- @connection = Mongo::MongoClient.new("localhost", 27017, :slave_ok => true)
15
+ def self.run(opts)
16
+ @connection = Mongo::MongoClient.new(opts.mongodb_host, opts.mongodb_port, :slave_ok => true)
17
+ unless(opts[:mongodb_username].blank? && opts[:mongodb_password].blank?)
18
+ @connection["admin"].authenticate(opts.mongodb_username, opts.mongodb_password)
19
+ end
17
20
 
18
21
  @hash = @connection["local"].command('serverStatus' => 1)
19
22
 
20
-
21
- @g = ::Graphite.new({:host => "localhost", :port => 2003})
23
+ @graphite_writer = GraphiteWriter.new(opts[:graphite_host], opts[:graphite_port], opts[:verbose])
22
24
 
23
25
  #puts @hash["connections"]["current"]
24
26
  #puts @hash["connections"]["available"]
@@ -37,9 +39,6 @@ module Mongodb
37
39
  @asd = Utils.to_hash(@hash) #all metrics
38
40
 
39
41
 
40
- #ap(@asd)
41
-
42
-
43
42
  @current_sample = OpCountersSample.new Hash[@hash["opcounters"]]
44
43
  @previous_sample = @current_sample.dup
45
44
 
@@ -51,23 +50,26 @@ module Mongodb
51
50
  end
52
51
  end
53
52
 
54
- puts "Delta: "
55
53
  @delta = TimeDifference.between(Time.parse(@current_sample.sample_time), Time.parse(@previous_sample.sample_time))
56
- puts @delta.in_seconds
54
+ puts "Last sample was taken #{@delta.in_seconds.round(0)} seconds ago" if opts[:verbose]
57
55
 
58
56
  @previous_sample.values.keys.sort.each do |k|
59
57
  previous_sample_value = @previous_sample.values[k]
60
58
  current_sample_value = @current_sample.values[k]
61
59
  value_per_seconds = ((current_sample_value - previous_sample_value) / @delta.in_seconds).round(2)
62
- puts "#{k}: #{previous_sample_value} / #{current_sample_value}: #{value_per_seconds}/s"
60
+ puts "#{k}: #{previous_sample_value} / #{current_sample_value}: #{value_per_seconds}/s" if opts[:verbose]
63
61
  end
64
62
 
65
63
  File.open('lastsample', 'w') do |file|
66
64
  Marshal.dump(@current_sample, file)
67
65
  end
68
66
 
69
- #@g.send_metrics({"#{Socket.gethostname}.connections.current" => @hash["connections"]["current"]})
67
+ @graphite_writer.write( @asd.select {|k| k.match('^connection|^network\.|^cursors|^mem\.mapped|^indexCounters|^repl.oplog') } )
68
+ #@graphite_writer.write("connections.current" => @hash["connections"]["current"]) unless(opts[:dry_run])
70
69
  end
71
70
  end
72
71
  end
73
72
  end
73
+ class GraphiteWriter
74
+
75
+ end
@@ -27,4 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency 'bson_ext'
28
28
  spec.add_dependency 'awesome_print'
29
29
  spec.add_dependency 'time_difference'
30
+ spec.add_dependency 'trollop'
30
31
  end
@@ -1,27 +1,28 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="RUBY_MODULE" version="4">
3
- <component name="NewModuleRootManager" inherit-compiler-output="true">
4
- <exclude-output />
5
- <content url="file://$MODULE_DIR$">
6
- <sourceFolder url="file://$MODULE_DIR$/lib" isTestSource="false" />
7
- </content>
8
- <orderEntry type="inheritedJdk" />
9
- <orderEntry type="sourceFolder" forTests="false" />
10
- <orderEntry type="library" scope="PROVIDED" name="activesupport (v4.0.0, ruby-1.9.3-p429) [gem]" level="application" />
11
- <orderEntry type="library" scope="PROVIDED" name="atomic (v1.1.10, ruby-1.9.3-p429) [gem]" level="application" />
12
- <orderEntry type="library" scope="PROVIDED" name="awesome_print (v1.1.0, ruby-1.9.3-p429) [gem]" level="application" />
13
- <orderEntry type="library" scope="PROVIDED" name="bson (v1.9.0, ruby-1.9.3-p429) [gem]" level="application" />
14
- <orderEntry type="library" scope="PROVIDED" name="bson_ext (v1.9.0, ruby-1.9.3-p429) [gem]" level="application" />
15
- <orderEntry type="library" scope="PROVIDED" name="bundler (v1.3.5, ruby-1.9.3-p429) [gem]" level="application" />
16
- <orderEntry type="library" scope="PROVIDED" name="i18n (v0.6.4, ruby-1.9.3-p429) [gem]" level="application" />
17
- <orderEntry type="library" scope="PROVIDED" name="minitest (v4.7.5, ruby-1.9.3-p429) [gem]" level="application" />
18
- <orderEntry type="library" scope="PROVIDED" name="mongo (v1.9.0, ruby-1.9.3-p429) [gem]" level="application" />
19
- <orderEntry type="library" scope="PROVIDED" name="multi_json (v1.7.7, ruby-1.9.3-p429) [gem]" level="application" />
20
- <orderEntry type="library" scope="PROVIDED" name="rake (v0.9.2.2, ruby-1.9.3-p429) [gem]" level="application" />
21
- <orderEntry type="library" scope="PROVIDED" name="simple-graphite (v2.1.0, ruby-1.9.3-p429) [gem]" level="application" />
22
- <orderEntry type="library" scope="PROVIDED" name="thread_safe (v0.1.0, ruby-1.9.3-p429) [gem]" level="application" />
23
- <orderEntry type="library" scope="PROVIDED" name="time_difference (v0.2.0, ruby-1.9.3-p429) [gem]" level="application" />
24
- <orderEntry type="library" scope="PROVIDED" name="tzinfo (v0.3.37, ruby-1.9.3-p429) [gem]" level="application" />
25
- </component>
26
- </module>
27
-
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="RUBY_MODULE" version="4">
3
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
4
+ <exclude-output />
5
+ <content url="file://$MODULE_DIR$">
6
+ <sourceFolder url="file://$MODULE_DIR$/lib" isTestSource="false" />
7
+ </content>
8
+ <orderEntry type="inheritedJdk" />
9
+ <orderEntry type="sourceFolder" forTests="false" />
10
+ <orderEntry type="library" scope="PROVIDED" name="activesupport (v4.0.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
11
+ <orderEntry type="library" scope="PROVIDED" name="atomic (v1.1.10, RVM: ruby-1.9.3-p448) [gem]" level="application" />
12
+ <orderEntry type="library" scope="PROVIDED" name="awesome_print (v1.1.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
13
+ <orderEntry type="library" scope="PROVIDED" name="bson (v1.9.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
14
+ <orderEntry type="library" scope="PROVIDED" name="bson_ext (v1.9.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
15
+ <orderEntry type="library" scope="PROVIDED" name="bundler (v1.3.5, RVM: ruby-1.9.3-p448) [gem]" level="application" />
16
+ <orderEntry type="library" scope="PROVIDED" name="i18n (v0.6.4, RVM: ruby-1.9.3-p448) [gem]" level="application" />
17
+ <orderEntry type="library" scope="PROVIDED" name="minitest (v4.7.5, RVM: ruby-1.9.3-p448) [gem]" level="application" />
18
+ <orderEntry type="library" scope="PROVIDED" name="mongo (v1.9.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
19
+ <orderEntry type="library" scope="PROVIDED" name="multi_json (v1.7.7, RVM: ruby-1.9.3-p448) [gem]" level="application" />
20
+ <orderEntry type="library" scope="PROVIDED" name="rake (v10.1.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
21
+ <orderEntry type="library" scope="PROVIDED" name="simple-graphite (v2.1.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
22
+ <orderEntry type="library" scope="PROVIDED" name="thread_safe (v0.1.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
23
+ <orderEntry type="library" scope="PROVIDED" name="time_difference (v0.2.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
24
+ <orderEntry type="library" scope="PROVIDED" name="trollop (v2.0, RVM: ruby-1.9.3-p448) [gem]" level="application" />
25
+ <orderEntry type="library" scope="PROVIDED" name="tzinfo (v0.3.37, RVM: ruby-1.9.3-p448) [gem]" level="application" />
26
+ </component>
27
+ </module>
28
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongodb-graphite-agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -139,6 +139,22 @@ dependencies:
139
139
  - - ! '>='
140
140
  - !ruby/object:Gem::Version
141
141
  version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: trollop
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
142
158
  description: ''
143
159
  email:
144
160
  - michele.cantelli@jobrapido.com
@@ -154,6 +170,7 @@ files:
154
170
  - Rakefile
155
171
  - bin/mongodb-graphite-agent.rb
156
172
  - lib/mongodb/graphite/agent.rb
173
+ - lib/mongodb/graphite/agent/graphite_writer.rb
157
174
  - lib/mongodb/graphite/agent/op_counters_sample.rb
158
175
  - lib/mongodb/graphite/agent/utils.rb
159
176
  - lib/mongodb/graphite/agent/version.rb
@@ -172,15 +189,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
172
189
  - - ! '>='
173
190
  - !ruby/object:Gem::Version
174
191
  version: '0'
192
+ segments:
193
+ - 0
194
+ hash: 461905061788265084
175
195
  required_rubygems_version: !ruby/object:Gem::Requirement
176
196
  none: false
177
197
  requirements:
178
198
  - - ! '>='
179
199
  - !ruby/object:Gem::Version
180
200
  version: '0'
201
+ segments:
202
+ - 0
203
+ hash: 461905061788265084
181
204
  requirements: []
182
205
  rubyforge_project:
183
- rubygems_version: 1.8.24
206
+ rubygems_version: 1.8.25
184
207
  signing_key:
185
208
  specification_version: 3
186
209
  summary: ''