riemann-tools 0.0.9 → 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.
@@ -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.