riemann-tools 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Gathers memcached STATS and submits them to Riemann.
4
+
5
+ require File.expand_path('../../lib/riemann/tools', __FILE__)
6
+
7
+ class Riemann::Tools::Memcached
8
+ include Riemann::Tools
9
+ require 'socket'
10
+
11
+ opt :memcached_host, "Memcached hostname", :default => 'localhost'
12
+ opt :memcached_port, "Memcached port", :default => 11211
13
+
14
+ def tick
15
+ sock = TCPSocket.new(opts[:memcached_host], opts[:memcached_port])
16
+ sock.print("stats\r\n")
17
+ sock.flush
18
+ stats = sock.gets
19
+
20
+ data = {}
21
+ while true
22
+ stats = sock.gets
23
+ break if stats.strip == 'END'
24
+ m = stats.match /STAT (\w+) (\S+)/
25
+ report(
26
+ :host => opts[:memcached_host],
27
+ :service => "memcached #{m[1]}",
28
+ :metric => m[2].to_f,
29
+ :state => 'ok',
30
+ :tags => ['memcached']
31
+ )
32
+ end
33
+ sock.close
34
+ end
35
+ end
36
+
37
+ Riemann::Tools::Memcached.run
data/bin/riemann-riak CHANGED
@@ -15,7 +15,7 @@ class Riemann::Tools::Riak
15
15
  opt :stats_port, "Riak HTTP port for stats", :default => 8098
16
16
  opt :stats_path, "Riak HTTP stats path", :default => '/stats'
17
17
  opt :node_name, "Riak erlang node name", :default => "riak@#{Socket.gethostname}"
18
-
18
+
19
19
  opt :get_50_warning, "FSM 50% get time warning threshold (ms)", :default => 1000
20
20
  opt :put_50_warning, "FSM 50% put time warning threshold (ms)", :default => 1000
21
21
  opt :get_95_warning, "FSM 95% get time warning threshold (ms)", :default => 2000
@@ -24,16 +24,36 @@ class Riemann::Tools::Riak
24
24
  opt :put_99_warning, "FSM 99% put time warning threshold (ms)", :default => 10000
25
25
 
26
26
  def initialize
27
+ @escript = true
28
+ @riakadmin = true
29
+ @httpstats = true
30
+
27
31
  if `which escript` =~ /^\s*$/
28
- puts "No escript; disabling ring/key checks."
29
- @no_escript = true
32
+ @escript = false
33
+ end
34
+
35
+ if `which riak-admin` =~ /^\s*$/
36
+ @riakadmin = false
37
+ end
38
+
39
+ if
40
+ begin
41
+ Net::HTTP.start(opts[:riak_host], opts[:stats_port]) do |http|
42
+ http.get opts[:stats_path]
43
+ end
44
+ rescue => e
45
+ @httpstatus = false
46
+ end
30
47
  end
31
48
  end
32
49
 
33
50
  def check_ring
34
- return if @no_escript
51
+ if @escript
52
+ str = `#{File.expand_path(File.dirname(__FILE__))}/riemann-riak-ring #{opts[:node_name]}`.chomp
53
+ elsif @riakadmin
54
+ str = `riak-admin ringready`
55
+ end
35
56
 
36
- str = `#{File.expand_path(File.dirname(__FILE__))}/riemann-riak-ring #{opts[:node_name]}`.chomp
37
57
  if str =~ /^TRUE/
38
58
  report(
39
59
  :host => opts[:riak_host],
@@ -52,8 +72,6 @@ class Riemann::Tools::Riak
52
72
  end
53
73
 
54
74
  def check_keys
55
- return if @no_escript
56
-
57
75
  keys = `#{File.expand_path(File.dirname(__FILE__))}/riemann-riak-keys #{opts[:node_name]}`.chomp
58
76
  if keys =~ /^\d+$/
59
77
  report(
@@ -66,7 +84,7 @@ class Riemann::Tools::Riak
66
84
  else
67
85
  report(
68
86
  :host => opts[:riak_host],
69
- :servie => 'riak keys',
87
+ :service => 'riak keys',
70
88
  :state => 'unknown',
71
89
  :description => keys
72
90
  )
@@ -103,30 +121,42 @@ class Riemann::Tools::Riak
103
121
  end
104
122
 
105
123
  def check_stats
106
- begin
107
- res = Net::HTTP.start(opts[:riak_host], opts[:stats_port]) do |http|
108
- http.get opts[:stats_path]
124
+ if @httpstatus
125
+ begin
126
+ res = Net::HTTP.start(opts[:riak_host], opts[:stats_port]) do |http|
127
+ http.get opts[:stats_path]
128
+ end
129
+ rescue => e
130
+ report(
131
+ :host => opts[:riak_host],
132
+ :service => 'riak',
133
+ :state => 'critical',
134
+ :description => "error fetching #{opts[:riak_host]}:#{opts[:stats_port]} #{e.class}, #{e.message}"
135
+ )
136
+ return
109
137
  end
110
- rescue => e
111
- report(
112
- :host => opts[:riak_host],
113
- :service => 'riak',
114
- :state => 'critical',
115
- :description => "error fetching #{opts[:riak_host]}:#{opts[:stats_port]} #{e.class}, #{e.message}"
116
- )
117
- return
118
- end
119
138
 
120
- if res.code.to_i == 200
121
- stats = JSON.parse(res.body)
139
+ if res.code.to_i == 200
140
+ stats = JSON.parse(res.body)
141
+ else
142
+ report(
143
+ :host => opts[:riak_host],
144
+ :service => 'riak',
145
+ :state => 'critical',
146
+ :description => "stats returned HTTP #{res.code}:\n\n#{res.body}"
147
+ )
148
+ return
149
+ end
150
+ elsif @riakadmin
151
+ stats = Hash[`riak-admin status`.split(/\n/).map{|i| i.split(/ : /)}]
122
152
  else
123
- report(
124
- :host => opts[:riak_host],
125
- :service => 'riak',
126
- :state => 'critical',
127
- :description => "stats returned HTTP #{res.code}:\n\n#{res.body}"
128
- )
129
- return
153
+ report(
154
+ :host => opts[:riak_host],
155
+ :service => 'riak',
156
+ :state => 'critical',
157
+ :description => "error fetching Riak stats"
158
+ )
159
+ return
130
160
  end
131
161
 
132
162
  report(
@@ -137,25 +167,25 @@ class Riemann::Tools::Riak
137
167
 
138
168
  # Gets/puts/rr
139
169
  [
140
- 'vnode_gets',
141
- 'vnode_puts',
142
- 'node_gets',
143
- 'node_puts',
144
- 'read_repairs'
170
+ 'vnode_gets',
171
+ 'vnode_puts',
172
+ 'node_gets',
173
+ 'node_puts',
174
+ 'read_repairs'
145
175
  ].each do |s|
146
176
  report(
147
177
  :host => opts[:riak_host],
148
178
  :service => "riak #{s}",
149
179
  :state => 'ok',
150
- :metric => stats[s]/60.0,
151
- :description => "#{stats[s]/60.0}/sec"
180
+ :metric => stats[s].to_i/60.0,
181
+ :description => "#{stats[s].to_i/60.0}/sec"
152
182
  )
153
183
  end
154
184
 
155
185
  # FSMs
156
186
  ['get', 'put'].each do |type|
157
187
  [50, 95, 99].each do |percentile|
158
- val = stats[fsm_stat(type, percentile)] || 0
188
+ val = stats[fsm_stat(type, percentile)].to_i || 0
159
189
  val = 0 if val == 'undefined'
160
190
  val /= 1000.0 # Convert us to ms
161
191
  state = fsm_state(type, percentile, val)
data/lib/riemann/tools.rb CHANGED
@@ -28,6 +28,7 @@ module Riemann
28
28
 
29
29
  opt :host, "Riemann host", :default => '127.0.0.1'
30
30
  opt :port, "Riemann port", :default => 5555
31
+ opt :event_host, "Event hostname", :type => String
31
32
  opt :interval, "Seconds between updates", :default => 5
32
33
  opt :tag, "Tag to add to events", :type => String, :multi => true
33
34
  opt :ttl, "TTL for events", :type => Integer
@@ -62,6 +63,8 @@ module Riemann
62
63
  event[:ttl] = options[:ttl]
63
64
  end
64
65
 
66
+ event[:host] ||= options[:event_host]
67
+
65
68
  riemann << event
66
69
  end
67
70
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riemann-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-08 00:00:00.000000000 Z
12
+ date: 2013-02-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: riemann-client
16
- requirement: &10179640 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,15 @@ dependencies:
21
21
  version: 0.0.8
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *10179640
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.0.8
25
30
  - !ruby/object:Gem::Dependency
26
31
  name: trollop
27
- requirement: &10178820 !ruby/object:Gem::Requirement
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
@@ -32,10 +37,15 @@ dependencies:
32
37
  version: 1.16.2
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *10178820
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 1.16.2
36
46
  - !ruby/object:Gem::Dependency
37
47
  name: munin-ruby
38
- requirement: &10177620 !ruby/object:Gem::Requirement
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
@@ -43,10 +53,15 @@ dependencies:
43
53
  version: 0.2.1
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *10177620
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.1
47
62
  - !ruby/object:Gem::Dependency
48
63
  name: yajl-ruby
49
- requirement: &10176660 !ruby/object:Gem::Requirement
64
+ requirement: !ruby/object:Gem::Requirement
50
65
  none: false
51
66
  requirements:
52
67
  - - ! '>='
@@ -54,10 +69,15 @@ dependencies:
54
69
  version: 1.1.0
55
70
  type: :runtime
56
71
  prerelease: false
57
- version_requirements: *10176660
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 1.1.0
58
78
  - !ruby/object:Gem::Dependency
59
79
  name: redis
60
- requirement: &10606920 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
61
81
  none: false
62
82
  requirements:
63
83
  - - ! '>='
@@ -65,7 +85,12 @@ dependencies:
65
85
  version: 3.0.2
66
86
  type: :runtime
67
87
  prerelease: false
68
- version_requirements: *10606920
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: 3.0.2
69
94
  description:
70
95
  email: aphyr@aphyr.com
71
96
  executables:
@@ -73,6 +98,7 @@ executables:
73
98
  - riemann-bench
74
99
  - riemann-riak
75
100
  - riemann-health
101
+ - riemann-memcached
76
102
  - riemann-haproxy
77
103
  - riemann-riak-keys
78
104
  - riemann-diskstats
@@ -86,19 +112,20 @@ extensions: []
86
112
  extra_rdoc_files: []
87
113
  files:
88
114
  - lib/riemann/tools.rb
89
- - bin/riemann-munin
90
115
  - bin/riemann-bench
91
- - bin/riemann-riak
92
- - bin/riemann-health
93
- - bin/riemann-haproxy
94
- - bin/riemann-riak-keys
95
- - bin/riemann-diskstats
96
- - bin/riemann-riak-ring
97
116
  - bin/riemann-cloudant
98
- - bin/riemann-kvminstances
117
+ - bin/riemann-diskstats
118
+ - bin/riemann-haproxy
119
+ - bin/riemann-health
99
120
  - bin/riemann-kvminstance
121
+ - bin/riemann-kvminstances
122
+ - bin/riemann-memcached
123
+ - bin/riemann-munin
100
124
  - bin/riemann-net
101
125
  - bin/riemann-redis
126
+ - bin/riemann-riak
127
+ - bin/riemann-riak-keys
128
+ - bin/riemann-riak-ring
102
129
  - LICENSE
103
130
  - README.markdown
104
131
  homepage: https://github.com/aphyr/riemann-tools
@@ -121,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
148
  version: '0'
122
149
  requirements: []
123
150
  rubyforge_project: riemann-tools
124
- rubygems_version: 1.8.10
151
+ rubygems_version: 1.8.25
125
152
  signing_key:
126
153
  specification_version: 3
127
154
  summary: Utilities which submit events to Riemann.