riemann-tools 0.0.3 → 0.0.4

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.
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: