nagios-zfs 0.1.1 → 0.2.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/README.md +9 -6
- data/features/check_zpool_capacity.feature +2 -2
- data/features/check_zpool_health.feature +19 -0
- data/features/step_definitions/dev_steps.rb +9 -0
- data/lib/nagios/zfs/version.rb +1 -1
- data/lib/nagios/zfs/zpool.rb +10 -1
- data/lib/nagios/zfs/zpool_plugin.rb +11 -3
- data/spec/nagios/zfs/zpool_plugin_spec.rb +85 -20
- data/spec/nagios/zfs/zpool_spec.rb +15 -0
- metadata +7 -5
data/README.md
CHANGED
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
Check ZFS Zpool health and capacity via Nagios.
|
4
4
|
|
5
|
-
**NOTE: This is an early prototype!**
|
6
|
-
|
7
5
|
## Installation
|
8
6
|
|
9
7
|
Install it via RubyGems:
|
@@ -18,11 +16,16 @@ Zpools.
|
|
18
16
|
$ check_zpool --help
|
19
17
|
|
20
18
|
A Zpool is in a critical state if the pool capacity jumps over a certain
|
21
|
-
rate (performance usually starts to suck
|
19
|
+
rate (performance usually starts to suck at 80%) or when the pool is
|
22
20
|
faulted.
|
23
|
-
The status will be warning if your Zpool is degraded
|
24
|
-
|
25
|
-
Take a look at the
|
21
|
+
The status will be warning if your Zpool is degraded or if the capacity
|
22
|
+
breaks your warning threshold.
|
23
|
+
Take a look at the
|
24
|
+
[features](https://github.com/bjoernalbers/nagios-zfs/tree/master/features)
|
25
|
+
...
|
26
|
+
|
27
|
+
This plugin works successfully under Oracle Solaris 11 (ZFS VERSION:
|
28
|
+
11.11,REV=2009.11.11).
|
26
29
|
|
27
30
|
## Contributing
|
28
31
|
|
@@ -20,8 +20,8 @@ Feature: Check zpool capacity
|
|
20
20
|
Then the status should be ok
|
21
21
|
|
22
22
|
Scenario: Display actual capacity
|
23
|
-
When I run `check_zpool -p tank -w
|
24
|
-
Then the stdout should contain "
|
23
|
+
When I run `check_zpool -p tank -w 81 -c 82`
|
24
|
+
Then the stdout should contain "80%"
|
25
25
|
|
26
26
|
#NOTE: This currently does not work!
|
27
27
|
#Scenario: Unknown zpool name
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Feature: Check zpool health
|
2
|
+
|
3
|
+
In order to sleep well
|
4
|
+
As the "data storage guy"
|
5
|
+
I want to check the health of my ZFS storage pools.
|
6
|
+
|
7
|
+
Scenario Outline:
|
8
|
+
Given the zpool "tank" has a capacity of 80%
|
9
|
+
And the health from zpool "tank" is "<health>"
|
10
|
+
When I run `check_zpool -p tank -w 81 -c 82`
|
11
|
+
Then the status should be <status>
|
12
|
+
And the stdout should contain "<health>"
|
13
|
+
|
14
|
+
Examples:
|
15
|
+
| health | status |
|
16
|
+
| FAULTED | critical |
|
17
|
+
| DEGRADED | warning |
|
18
|
+
| ONLINE | ok |
|
19
|
+
| SICK | unknown |
|
@@ -1,9 +1,18 @@
|
|
1
|
+
Before do
|
2
|
+
@aruba_timeout_seconds = 10
|
3
|
+
end
|
4
|
+
|
1
5
|
Given(/^the zpool "(.*?)" has a capacity of (\d+)%$/) do |name, capacity|
|
2
6
|
cmd = "zpool list -H -o name,cap #{name}"
|
3
7
|
out = "#{name}\t#{capacity}%\n"
|
4
8
|
double_cmd(cmd, :puts => out)
|
5
9
|
end
|
6
10
|
|
11
|
+
Given(/^the health from zpool "(.*?)" is "(.*?)"$/) do |name, health|
|
12
|
+
cmd = "zpool list -H -o health #{name}"
|
13
|
+
double_cmd(cmd, :puts => "#{health}\n")
|
14
|
+
end
|
15
|
+
|
7
16
|
Then(/^the status should be (unknown|critical|warning|ok)$/) do |status|
|
8
17
|
exit_status =
|
9
18
|
case status
|
data/lib/nagios/zfs/version.rb
CHANGED
data/lib/nagios/zfs/zpool.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Nagios
|
2
2
|
module ZFS
|
3
3
|
class Zpool
|
4
|
+
KNOWN_POOL_HEALTHS = %(ONLINE DEGRADED FAULTED)
|
5
|
+
|
4
6
|
attr_reader :name
|
5
7
|
|
6
8
|
def initialize(name)
|
@@ -13,7 +15,14 @@ module Nagios
|
|
13
15
|
end
|
14
16
|
|
15
17
|
def query
|
16
|
-
@query ||= `zpool list -H -o name,cap #{
|
18
|
+
@query ||= `zpool list -H -o name,cap #{name}`
|
19
|
+
end
|
20
|
+
|
21
|
+
def health
|
22
|
+
@health ||= `zpool list -H -o health #{name}`.strip
|
23
|
+
raise "unknown health: #{@health}" unless
|
24
|
+
KNOWN_POOL_HEALTHS.include?(@health)
|
25
|
+
@health
|
17
26
|
end
|
18
27
|
end
|
19
28
|
end
|
@@ -24,11 +24,11 @@ module Nagios
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def critical?
|
27
|
-
critical_capacity?
|
27
|
+
critical_capacity? || critical_health?
|
28
28
|
end
|
29
29
|
|
30
30
|
def warning?
|
31
|
-
warning_capacity?
|
31
|
+
warning_capacity? || warning_health?
|
32
32
|
end
|
33
33
|
|
34
34
|
# No explicite ok check.
|
@@ -37,7 +37,7 @@ module Nagios
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def message
|
40
|
-
"#{zpool.name} #{zpool.capacity}%"
|
40
|
+
"#{zpool.name} #{zpool.health} (#{zpool.capacity}%)"
|
41
41
|
end
|
42
42
|
|
43
43
|
private
|
@@ -50,6 +50,14 @@ module Nagios
|
|
50
50
|
zpool.capacity >= config[:warning]
|
51
51
|
end
|
52
52
|
|
53
|
+
def critical_health?
|
54
|
+
zpool.health == 'FAULTED'
|
55
|
+
end
|
56
|
+
|
57
|
+
def warning_health?
|
58
|
+
zpool.health == 'DEGRADED'
|
59
|
+
end
|
60
|
+
|
53
61
|
def zpool
|
54
62
|
@zpool ||= Zpool.new(config[:zpool])
|
55
63
|
end
|
@@ -14,20 +14,64 @@ module Nagios
|
|
14
14
|
let(:argv) { [] }
|
15
15
|
|
16
16
|
it 'raises an error without pool name' do
|
17
|
+
ZpoolPlugin.any_instance.stub(:puts) # Don't mess up our spec output.
|
17
18
|
expect { plugin }.to raise_error(SystemExit)
|
18
19
|
end
|
19
20
|
end
|
20
21
|
|
21
22
|
describe '#critical?' do
|
22
|
-
|
23
|
+
before do
|
24
|
+
plugin.stub(:critical_capacity?).and_return(false)
|
25
|
+
plugin.stub(:critical_health?).and_return(false)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'is true when capacity is critical' do
|
23
29
|
plugin.should_receive(:critical_capacity?).and_return(true)
|
24
30
|
expect(plugin.critical?).to be(true)
|
25
31
|
end
|
26
32
|
|
27
|
-
it '
|
33
|
+
it 'is true when health is critical' do
|
34
|
+
plugin.should_receive(:critical_health?).and_return(true)
|
35
|
+
expect(plugin.critical?).to be(true)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'is false when capacity is not critical' do
|
28
39
|
plugin.should_receive(:critical_capacity?).and_return(false)
|
29
40
|
expect(plugin.critical?).to be(false)
|
30
41
|
end
|
42
|
+
|
43
|
+
it 'is false when health is not critical' do
|
44
|
+
plugin.should_receive(:critical_health?).and_return(false)
|
45
|
+
expect(plugin.critical?).to be(false)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#warning?' do
|
51
|
+
before do
|
52
|
+
plugin.stub(:warning_capacity?).and_return(false)
|
53
|
+
plugin.stub(:warning_health?).and_return(false)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'is true when capacity is warning' do
|
57
|
+
plugin.should_receive(:warning_capacity?).and_return(true)
|
58
|
+
expect(plugin.warning?).to be(true)
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'is true when health is warning' do
|
62
|
+
plugin.should_receive(:warning_health?).and_return(true)
|
63
|
+
expect(plugin.warning?).to be(true)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'is false when capacity is not warning' do
|
67
|
+
plugin.should_receive(:warning_capacity?).and_return(false)
|
68
|
+
expect(plugin.warning?).to be(false)
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'is false when health is not warning' do
|
72
|
+
plugin.should_receive(:warning_health?).and_return(false)
|
73
|
+
expect(plugin.warning?).to be(false)
|
74
|
+
end
|
31
75
|
end
|
32
76
|
|
33
77
|
describe '#critical_capacity?' do
|
@@ -38,29 +82,17 @@ module Nagios
|
|
38
82
|
plugin.stub(:config).and_return({:critical => 80})
|
39
83
|
end
|
40
84
|
|
41
|
-
it '
|
85
|
+
it 'is true when capacity exceeds critical threshold' do
|
42
86
|
zpool.should_receive(:capacity).and_return(80)
|
43
87
|
expect(plugin.send(:critical_capacity?)).to be(true)
|
44
88
|
end
|
45
89
|
|
46
|
-
it '
|
90
|
+
it 'is false when capacity does not exceed critical threshold' do
|
47
91
|
zpool.should_receive(:capacity).and_return(79)
|
48
92
|
expect(plugin.send(:critical_capacity?)).to be(false)
|
49
93
|
end
|
50
94
|
end
|
51
95
|
|
52
|
-
describe '#warning?' do
|
53
|
-
it 'returns true when capacity is warning' do
|
54
|
-
plugin.should_receive(:warning_capacity?).and_return(true)
|
55
|
-
expect(plugin.warning?).to be(true)
|
56
|
-
end
|
57
|
-
|
58
|
-
it 'returns false when capacity is not warning' do
|
59
|
-
plugin.should_receive(:warning_capacity?).and_return(false)
|
60
|
-
expect(plugin.warning?).to be(false)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
96
|
describe '#warning_capacity?' do
|
65
97
|
let(:zpool) { double('zpool') }
|
66
98
|
|
@@ -69,17 +101,49 @@ module Nagios
|
|
69
101
|
plugin.stub(:config).and_return({:warning => 80})
|
70
102
|
end
|
71
103
|
|
72
|
-
it '
|
104
|
+
it 'is true when capacity exceeds warning threshold' do
|
73
105
|
zpool.should_receive(:capacity).and_return(80)
|
74
106
|
expect(plugin.send(:warning_capacity?)).to be(true)
|
75
107
|
end
|
76
108
|
|
77
|
-
it '
|
109
|
+
it 'is false when capacity does not exceed warning threshold' do
|
78
110
|
zpool.should_receive(:capacity).and_return(79)
|
79
111
|
expect(plugin.send(:warning_capacity?)).to be(false)
|
80
112
|
end
|
81
113
|
end
|
82
114
|
|
115
|
+
describe '#critical_health?' do
|
116
|
+
let(:zpool) { double('zpool') }
|
117
|
+
|
118
|
+
before { plugin.stub(:zpool).and_return(zpool) }
|
119
|
+
|
120
|
+
it 'is true with a faulted pool' do
|
121
|
+
zpool.should_receive(:health).and_return('FAULTED')
|
122
|
+
expect(plugin.send(:critical_health?)).to be(true)
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'is false without a faulted pool' do
|
126
|
+
zpool.should_receive(:health).and_return('DEGRADED')
|
127
|
+
expect(plugin.send(:critical_health?)).to be(false)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#warning_health?' do
|
132
|
+
let(:zpool) { double('zpool') }
|
133
|
+
|
134
|
+
before { plugin.stub(:zpool).and_return(zpool) }
|
135
|
+
|
136
|
+
it 'is true with a degraded pool' do
|
137
|
+
zpool.should_receive(:health).and_return('DEGRADED')
|
138
|
+
expect(plugin.send(:warning_health?)).to be(true)
|
139
|
+
end
|
140
|
+
|
141
|
+
it 'is false without a degraded pool' do
|
142
|
+
zpool.should_receive(:health).and_return('ONLINE')
|
143
|
+
expect(plugin.send(:warning_health?)).to be(false)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
83
147
|
describe '#ok?' do
|
84
148
|
it 'always returns true' do
|
85
149
|
expect(plugin.ok?).to eq(true)
|
@@ -87,12 +151,13 @@ module Nagios
|
|
87
151
|
end
|
88
152
|
|
89
153
|
describe '#message' do
|
90
|
-
it 'includes the pool name and capcity' do
|
154
|
+
it 'includes the pool name, health and capcity' do
|
91
155
|
zpool = double('zpool')
|
92
156
|
zpool.should_receive(:name).and_return('tank')
|
157
|
+
zpool.should_receive(:health).and_return('ONLINE')
|
93
158
|
zpool.should_receive(:capacity).and_return(42)
|
94
159
|
plugin.stub(:zpool).and_return(zpool)
|
95
|
-
expect(plugin.message).to eq('tank 42%')
|
160
|
+
expect(plugin.message).to eq('tank ONLINE (42%)')
|
96
161
|
end
|
97
162
|
end
|
98
163
|
|
@@ -35,6 +35,21 @@ module Nagios
|
|
35
35
|
2.times { expect(zpool.send(:query)).to eq('chunky bacon') }
|
36
36
|
end
|
37
37
|
end
|
38
|
+
|
39
|
+
describe '#health' do
|
40
|
+
it 'returns and caches the health by command-line' do
|
41
|
+
zpool.should_receive(:`).with('zpool list -H -o health tank').
|
42
|
+
once.and_return("ONLINE\n")
|
43
|
+
2.times { expect(zpool.health).to eq('ONLINE') }
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'raises an error with an unknown health' do
|
47
|
+
zpool.stub(:`).and_return("SICK\n")
|
48
|
+
expect { zpool.health }.to raise_error /unknown health: SICK/
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'raises an error when the command returns a non-zero exit code'
|
52
|
+
end
|
38
53
|
end
|
39
54
|
end
|
40
55
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nagios-zfs
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
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: 2013-10-
|
12
|
+
date: 2013-10-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nagiosplugin
|
@@ -157,6 +157,7 @@ files:
|
|
157
157
|
- Rakefile
|
158
158
|
- bin/check_zpool
|
159
159
|
- features/check_zpool_capacity.feature
|
160
|
+
- features/check_zpool_health.feature
|
160
161
|
- features/step_definitions/dev_steps.rb
|
161
162
|
- features/support/env.rb
|
162
163
|
- lib/nagios/zfs.rb
|
@@ -182,7 +183,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
183
|
version: '0'
|
183
184
|
segments:
|
184
185
|
- 0
|
185
|
-
hash: -
|
186
|
+
hash: -1902865877853825615
|
186
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
188
|
none: false
|
188
189
|
requirements:
|
@@ -191,15 +192,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
192
|
version: '0'
|
192
193
|
segments:
|
193
194
|
- 0
|
194
|
-
hash: -
|
195
|
+
hash: -1902865877853825615
|
195
196
|
requirements: []
|
196
197
|
rubyforge_project:
|
197
198
|
rubygems_version: 1.8.23
|
198
199
|
signing_key:
|
199
200
|
specification_version: 3
|
200
|
-
summary: nagios-zfs-0.
|
201
|
+
summary: nagios-zfs-0.2.0
|
201
202
|
test_files:
|
202
203
|
- features/check_zpool_capacity.feature
|
204
|
+
- features/check_zpool_health.feature
|
203
205
|
- features/step_definitions/dev_steps.rb
|
204
206
|
- features/support/env.rb
|
205
207
|
- spec/nagios/zfs/zpool_plugin_spec.rb
|