riemann-tools 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Binary file
data/bin/riemann-riak ADDED
@@ -0,0 +1,181 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Forwards information on a Riak node to Riemann.
4
+
5
+ require File.expand_path('../../lib/riemann/tools', __FILE__)
6
+
7
+ require 'net/http'
8
+ require 'yajl/json_gem'
9
+
10
+ class Riemann::Tools::Riak
11
+ include Riemann::Tools
12
+
13
+ opt :riak_host, "Riak host", :default => "localhost"
14
+ opt :stats_port, "Riak HTTP port for stats", :default => 8098
15
+ opt :stats_path, "Riak HTTP stats path", :default => '/stats'
16
+ opt :node_name, "Riak erlang node name", :default => "riak@#{Socket.gethostname}"
17
+
18
+ opt :get_50_warning, "FSM 50% get time warning threshold (ms)", :default => 1000
19
+ opt :put_50_warning, "FSM 50% put time warning threshold (ms)", :default => 1000
20
+ opt :get_95_warning, "FSM 95% get time warning threshold (ms)", :default => 2000
21
+ opt :put_95_warning, "FSM 95% put time warning threshold (ms)", :default => 2000
22
+ opt :get_99_warning, "FSM 99% get time warning threshold (ms)", :default => 10000
23
+ opt :put_99_warning, "FSM 99% put time warning threshold (ms)", :default => 10000
24
+
25
+ def initialize
26
+ if `which escript` =~ /^\s*$/
27
+ puts "No escript; disabling ring/key checks."
28
+ @no_escript = true
29
+ end
30
+ end
31
+
32
+ def check_ring
33
+ return if @no_escript
34
+
35
+ str = `#{File.expand_path(File.dirname(__FILE__))}/riemann-riak-ring #{opts[:node_name]}`.chomp
36
+ if str =~ /^TRUE/
37
+ report(
38
+ :host => opts[:riak_host],
39
+ :service => 'riak ring',
40
+ :state => 'ok',
41
+ :description => str
42
+ )
43
+ else
44
+ report(
45
+ :host => opts[:riak_host],
46
+ :service => 'riak ring',
47
+ :state => 'warning',
48
+ :description => str
49
+ )
50
+ end
51
+ end
52
+
53
+ def check_keys
54
+ return if @no_escript
55
+
56
+ keys = `#{File.expand_path(File.dirname(__FILE__))}/riemann-riak-keys #{opts[:node_name]}`.chomp
57
+ if keys =~ /^\d+$/
58
+ report(
59
+ :host => opts[:riak_host],
60
+ :service => 'riak keys',
61
+ :state => 'ok',
62
+ :metric => keys.to_i,
63
+ :description => keys
64
+ )
65
+ else
66
+ report(
67
+ :host => opts[:riak_host],
68
+ :servie => 'riak keys',
69
+ :state => 'unknown',
70
+ :description => keys
71
+ )
72
+ end
73
+ end
74
+
75
+ def check_disk
76
+ gb = `du -s /var/lib/riak`.split(/\s+/).first.to_i / (1024.0**2)
77
+ report(
78
+ :host => opts[:riak_host],
79
+ :service => 'riak disk',
80
+ :state => 'ok',
81
+ :metric => gb,
82
+ :description => "#{gb} GB in /var/lib/riak/"
83
+ )
84
+ end
85
+
86
+ # Returns the riak stat for the given fsm type and percentile.
87
+ def fsm_stat(type, percentile)
88
+ "node_#{type}_fsm_time_#{percentile == 50 ? 'median' : percentile}"
89
+ end
90
+
91
+ # Returns the alerts state for the given fsm.
92
+ def fsm_state(type, percentile, val)
93
+ limit = opts["#{type}_#{percentile}_warning".to_sym]
94
+ case val
95
+ when 0 .. limit
96
+ 'ok'
97
+ when limit .. limit * 2
98
+ 'warning'
99
+ else
100
+ 'critical'
101
+ end
102
+ end
103
+
104
+ def check_stats
105
+ begin
106
+ res = Net::HTTP.start(opts[:riak_host], opts[:stats_port]) do |http|
107
+ http.get opts[:stats_path]
108
+ end
109
+ rescue => e
110
+ report(
111
+ :host => opts[:riak_host],
112
+ :service => 'riak',
113
+ :state => 'critical',
114
+ :description => "error fetching #{opts[:riak_host]}:#{opts[:stats_port]} #{e.class}, #{e.message}"
115
+ )
116
+ return
117
+ end
118
+
119
+ if res.code.to_i == 200
120
+ stats = JSON.parse(res.body)
121
+ else
122
+ report(
123
+ :host => opts[:riak_host],
124
+ :service => 'riak',
125
+ :state => 'critical',
126
+ :description => "stats returned HTTP #{res.code}:\n\n#{res.body}"
127
+ )
128
+ return
129
+ end
130
+
131
+ report(
132
+ :host => opts[:riak_host],
133
+ :service => 'riak',
134
+ :state => 'ok'
135
+ )
136
+
137
+ # Gets/puts/rr
138
+ [
139
+ 'vnode_gets',
140
+ 'vnode_puts',
141
+ 'node_gets',
142
+ 'node_puts',
143
+ 'read_repairs'
144
+ ].each do |s|
145
+ report(
146
+ :host => opts[:riak_host],
147
+ :service => s,
148
+ :state => 'ok',
149
+ :metric => stats[s]/60.0,
150
+ :description => "#{stats[s]/60.0}/sec"
151
+ )
152
+ end
153
+
154
+ # FSMs
155
+ ['get', 'put'].each do |type|
156
+ [50, 95, 99].each do |percentile|
157
+ val = stats[fsm_stat(type, percentile)] || 0
158
+ val = 0 if val == 'undefined'
159
+ val /= 1000.0 # Convert us to ms
160
+ state = fsm_state(type, percentile, val)
161
+ report(
162
+ :host => opts[:riak_host],
163
+ :service => "riak #{type} #{percentile}",
164
+ :state => state,
165
+ :metric => val,
166
+ :description => "#{val} ms"
167
+ )
168
+ end
169
+ end
170
+ end
171
+
172
+ def tick
173
+ # This can utterly destroy a cluster, so we disable
174
+ # check_keys
175
+ check_stats
176
+ check_ring
177
+ check_disk
178
+ end
179
+ end
180
+
181
+ Riemann::Tools::Riak.run
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env escript
2
+ %%! -name riakstatuscheck@127.0.0.1 -setcookie riak -hidden
3
+
4
+ main([]) -> main(["riak@127.0.0.1"]);
5
+ main([Node]) ->
6
+ io:format("~w\n", [
7
+ lists:foldl(
8
+ fun({_VNode, Count}, Sum) -> Sum + Count end,
9
+ 0,
10
+ rpc:call(list_to_atom(Node), riak_kv_bitcask_backend, key_counts, [])
11
+ )
12
+ ]).
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env escript
2
+ %%! -name riakstatuscheck@127.0.0.1 -setcookie riak -hidden
3
+
4
+ main([]) -> main(["riak@127.0.0.1"]);
5
+ main([Node]) ->
6
+ io:format("~p\n", [
7
+ rpc:call(list_to_atom(Node), riak_kv_console, ringready, [[]])
8
+ ]).
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.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-17 00:00:00.000000000 Z
12
+ date: 2012-04-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: riemann-client
@@ -59,23 +59,48 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: 0.2.1
62
+ - !ruby/object:Gem::Dependency
63
+ name: yajl-ruby >= 1.1.0
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
62
78
  description:
63
79
  email: aphyr@aphyr.com
64
80
  executables:
65
81
  - riemann-net
82
+ - riemann-riak-ring
83
+ - riemann-riak-keys
66
84
  - riemann-munin
85
+ - riemann-riak
67
86
  - riemann-bench
68
87
  - riemann-health
88
+ - .riemann-net.swp
69
89
  extensions: []
70
90
  extra_rdoc_files: []
71
91
  files:
72
92
  - lib/riemann/tools.rb
73
93
  - bin/riemann-net
94
+ - bin/riemann-riak-ring
95
+ - bin/riemann-riak-keys
74
96
  - bin/riemann-munin
97
+ - bin/riemann-riak
75
98
  - bin/riemann-bench
76
99
  - bin/riemann-health
77
100
  - LICENSE
78
101
  - README.markdown
102
+ - !binary |-
103
+ YmluLy5yaWVtYW5uLW5ldC5zd3A=
79
104
  homepage: https://github.com/aphyr/riemann-tools
80
105
  licenses: []
81
106
  post_install_message: