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.
- data/bin/riemann-memcached +37 -0
- data/bin/riemann-riak +67 -37
- data/lib/riemann/tools.rb +3 -0
- metadata +48 -21
@@ -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
|
-
|
29
|
-
|
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
|
-
|
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
|
-
:
|
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
|
-
|
107
|
-
|
108
|
-
|
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
|
-
|
121
|
-
|
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
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
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
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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:
|
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-
|
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.
|
151
|
+
rubygems_version: 1.8.25
|
125
152
|
signing_key:
|
126
153
|
specification_version: 3
|
127
154
|
summary: Utilities which submit events to Riemann.
|