sensu-plugins-consul 2.0.1 → 2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c42f06da46292439afdd1dc4fd8a8b8e332d9e405df5675b414fd9d1cd617c6d
4
- data.tar.gz: 19fc38700fc27fe665acc2f1e292273482b77791f3825cd8215998a3827d31c1
3
+ metadata.gz: c7c1ef8f95efae49bd9e72c798be02494c70fb337c8494b874e95a746d3f3208
4
+ data.tar.gz: e17a0003846a9a8d0369c787c02c708a81d99e3e9cb1006be03dd39cdf15bee7
5
5
  SHA512:
6
- metadata.gz: 7ace706ab7e8fc0a4d7ee396b00602004d067a868190afae22eca72651967b44046bc9a7ffd004cfc206a410ec01b779e9b8f945f756329101e3ffbd2607af63
7
- data.tar.gz: e63d2a3fe6bc2cbeab4d02036148474ac8375ea1199026675ee110dfbf8023fd6eb4699af27d8108a92d72b56be21f6e7b46937019faa6cfd880c5819a981dd4
6
+ metadata.gz: 054f69b81bd27515f83eca13b9ad4bf6b4b937801e4593219eaf38ddd77100464b49ecfa55ce6507bedff57e423423e5d95ae91cc41a74d09ef35fc38562f909
7
+ data.tar.gz: 11c947c6fb23a653d124e8486e0d0860dc24f0895e8fe556643bc7c129b13006d1e867fa45493605844277096440fc731753cb84c4e023a288af3d9ddd9ac5f0
@@ -5,6 +5,11 @@ This CHANGELOG follows the format listed [here](https://github.com/sensu-plugins
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [2.1.0] - 2018-03-29
9
+ ### Added
10
+ - `check-consul-quorum.rb`: Check how many servers can be lost while maintaining quorum (@roboticcheese)
11
+ - `check-consul-stale-peers.rb`: Check for stale peers in the raft configuration (@roboticcheese)
12
+
8
13
  ## [2.0.1] - 2018-03-27
9
14
  ### Security
10
15
  - updated yard dependency to `~> 0.9.11` per: https://nvd.nist.gov/vuln/detail/CVE-2017-17042 (@majormoses)
@@ -119,7 +124,8 @@ This CHANGELOG follows the format listed [here](https://github.com/sensu-plugins
119
124
  ### Added
120
125
  - initial release
121
126
 
122
- [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-consul/compare/2.0.1...HEAD
127
+ [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-consul/compare/2.1.0...HEAD
128
+ [2.1.0]: https://github.com/sensu-plugins/sensu-plugins-consul/compare/2.0.1...2.1.0
123
129
  [2.0.1]: https://github.com/sensu-plugins/sensu-plugins-consul/compare/2.0.0...2.0.1
124
130
  [2.0.0]: https://github.com/sensu-plugins/sensu-plugins-consul/compare/1.6.1...2.0.0
125
131
  [1.6.1]: https://github.com/sensu-plugins/sensu-plugins-consul/compare/1.6.0...1.6.1
data/README.md CHANGED
@@ -17,6 +17,8 @@
17
17
  * bin/check-consul-members.rb
18
18
  * bin/check-service-consul.rb
19
19
  * bin/check-consul-maintenance.rb
20
+ * bin/check-consul-quorum.rb
21
+ * bin/check-consul-stale-peers.rb
20
22
 
21
23
  ## Usage
22
24
 
@@ -0,0 +1,91 @@
1
+ #! /usr/bin/env ruby
2
+ # frozen_string_literal: false
3
+
4
+ #
5
+ # check-consul-quorum
6
+ #
7
+ # DESCRIPTION:
8
+ # This plugin checks how many nodes the cluster will be able to lose while
9
+ # still maintaining quorum.
10
+ #
11
+ # OUTPUT:
12
+ # plain text
13
+ #
14
+ # PLATFORMS:
15
+ # Linux
16
+ #
17
+ # DEPENDENCIES:
18
+ # gem: sensu-plugin
19
+ # gem: rest-client
20
+ #
21
+ # USAGE:
22
+ # Connect to localhost, go critical when the cluster is at its minimum for
23
+ # quorum:
24
+ # ./check-consul-quorum
25
+ #
26
+ # Connect to a remote Consul server over HTTPS:
27
+ # ./check-consul-quorum -s 192.168.42.42 -p 4443 -P https
28
+ #
29
+ # Go critical when the cluster can lose one more server and keep quorum:
30
+ # ./check-consul-quorum -W 2 -C 1
31
+ #
32
+ # NOTES:
33
+ #
34
+ # LICENSE:
35
+ # Copyright 2018, Jonathan Hartman <j@hartman.io>
36
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
37
+ # for details.
38
+ #
39
+
40
+ require 'sensu-plugins-consul/check/base'
41
+
42
+ #
43
+ # Consul quorum status
44
+ #
45
+ class ConsulQuorumStatus < SensuPluginsConsul::Check::Base
46
+ option :warning,
47
+ description: 'Warn when the cluster has this many spare servers ' \
48
+ 'beyond the minimum for quorum',
49
+ short: '-W NUMBER_OF_SPARE_SERVERS',
50
+ long: '--warning NUMBER_OF_SPARE_SERVERS',
51
+ proc: proc(&:to_i),
52
+ default: 1
53
+
54
+ option :critical,
55
+ description: 'Go critical when the cluster has this many spare ' \
56
+ 'servers beyond the minimum for quorum',
57
+ short: '-C NUMBER_OF_SPARE_SERVERS',
58
+ long: '--critical NUMBER_OF_SPARE_SERVERS',
59
+ proc: proc(&:to_i),
60
+ default: 0
61
+
62
+ def run
63
+ raft = consul_get('operator/raft/configuration')
64
+ members = consul_get('agent/members')
65
+
66
+ total = raft['Servers'].select { |s| s['Voter'] == true }.length
67
+ required = total / 2 + 1
68
+ alive = members.select do |m|
69
+ m.key?('Tags') && m['Tags']['role'] == 'consul' && m['Status'] == 1
70
+ end.length
71
+
72
+ spares = alive - required
73
+
74
+ msg = "Cluster has #{alive}/#{total} servers alive and"
75
+ msg = if spares < 0
76
+ "#{msg} has lost quorum"
77
+ elsif spares.zero?
78
+ "#{msg} has the minimum required for quorum"
79
+ else
80
+ "#{msg} can lose #{spares} more without losing quorum"
81
+ end
82
+
83
+ if spares < 0 || spares <= config[:critical]
84
+ critical msg
85
+ elsif spares <= config[:warning]
86
+ warning msg
87
+ else
88
+ ok msg
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,73 @@
1
+ #! /usr/bin/env ruby
2
+ # frozen_string_literal: false
3
+
4
+ #
5
+ # check-consul-stale-peers
6
+ #
7
+ # DESCRIPTION:
8
+ # This plugin checks the raft configuration for stale ("unknown") peers.
9
+ #
10
+ # OUTPUT:
11
+ # plain text
12
+ #
13
+ # PLATFORMS:
14
+ # Linux
15
+ #
16
+ # DEPENDENCIES:
17
+ # gem: sensu-plugin
18
+ # gem: rest-client
19
+ #
20
+ # USAGE:
21
+ # Connect to localhost, go critical when there are any stale peers:
22
+ # ./check-consul-stale-peers
23
+ #
24
+ # Connect to a remote Consul server over HTTPS:
25
+ # ./check-consul-stale-peers -s 192.168.42.42 -p 4443 -P https
26
+ #
27
+ # Go critical when the cluster has two or more stale peers:
28
+ # ./check-consul-stale-peers -W 1 -C 2
29
+ #
30
+ # NOTES:
31
+ #
32
+ # LICENSE:
33
+ # Copyright 2018, Jonathan Hartman <j@hartman.io>
34
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
35
+ # for details.
36
+ #
37
+
38
+ require 'sensu-plugins-consul/check/base'
39
+
40
+ #
41
+ # Consul stale peers
42
+ #
43
+ class ConsulStalePeers < SensuPluginsConsul::Check::Base
44
+ option :warning,
45
+ description: 'Warn when there are this many stale peers',
46
+ short: '-W NUMBER_OF_PEERS',
47
+ long: '--warning NUMBER_OF_PEERS',
48
+ proc: proc(&:to_i),
49
+ default: 1
50
+
51
+ option :critical,
52
+ description: 'Go critical when there are this many stale peers',
53
+ short: '-C NUMBER_OF_PEERS',
54
+ long: '--critical NUMBER_OF_PEERS',
55
+ proc: proc(&:to_i),
56
+ default: 1
57
+
58
+ def run
59
+ raft = consul_get('operator/raft/configuration')
60
+
61
+ res = raft['Servers'].select { |s| s['Node'] == '(unknown)' }.length
62
+
63
+ msg = "Cluster contains #{res} stale peer#{'s' unless res == 1}"
64
+
65
+ if res >= config[:critical]
66
+ critical msg
67
+ elsif res >= config[:warning]
68
+ warning msg
69
+ else
70
+ ok msg
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: false
2
+
3
+ #
4
+ # sensu-plugins-consul/check/base
5
+ #
6
+ # DESCRIPTION:
7
+ # This class defines some of the common config options and helper methods for
8
+ # other Consul plugins to use.
9
+ #
10
+ # OUTPUT:
11
+ # N/A
12
+ #
13
+ # PLATFORMS:
14
+ # Linux
15
+ #
16
+ # DEPENDENCIES:
17
+ # gem: sensu-plugin
18
+ # gem: rest-client
19
+ #
20
+ # USAGE:
21
+ # Import this file and create subclasses of the included plugin class.
22
+ # require 'sensu-plugins-consul/check/base'
23
+ # class ConsulTestStatus < SensuPluginsConsul::Check::Base
24
+ # ...
25
+ #
26
+ # NOTES:
27
+ #
28
+ # LICENSE:
29
+ # Copyright 2018, Jonathan Hartman <j@hartman.io>
30
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
31
+ # for details.
32
+ #
33
+
34
+ require 'json'
35
+ require 'rest-client'
36
+ require 'sensu-plugin/check/cli'
37
+
38
+ #
39
+ # Consul shared base plugin
40
+ #
41
+ module SensuPluginsConsul
42
+ class Check
43
+ class Base < Sensu::Plugin::Check::CLI
44
+ option :server,
45
+ description: 'Consul server',
46
+ short: '-s SERVER',
47
+ long: '--server SERVER',
48
+ default: '127.0.0.1'
49
+
50
+ option :port,
51
+ description: 'Consul HTTP port',
52
+ short: '-p PORT',
53
+ long: '--port PORT',
54
+ proc: proc(&:to_i),
55
+ default: 8500
56
+
57
+ option :protocol,
58
+ description: 'Consul listener protocol',
59
+ short: '-P PROTOCOL',
60
+ long: '--protocol PROTOCOL',
61
+ in: %w[http https],
62
+ default: 'http'
63
+
64
+ option :insecure,
65
+ description: 'Set this flag to disable SSL verification',
66
+ short: '-k',
67
+ long: '--insecure',
68
+ boolean: true,
69
+ default: false
70
+
71
+ option :capath,
72
+ description: 'Absolute path to an alternative CA file',
73
+ short: '-c CAPATH',
74
+ long: '--capath CAPATH'
75
+
76
+ option :timeout,
77
+ description: 'Connection will time out after this many seconds',
78
+ short: '-t TIMEOUT_IN_SECONDS',
79
+ long: '--timeout TIMEOUT_IN_SECONDS',
80
+ proc: proc(&:to_i),
81
+ default: 5
82
+
83
+ #
84
+ # Fetch and return the parsed JSON data from a specified Consul API endpoint.
85
+ #
86
+ def consul_get(endpoint)
87
+ url = "#{config[:protocol]}://#{config[:server]}:#{config[:port]}/" \
88
+ "v1/#{endpoint}"
89
+ options = { timeout: config[:timeout],
90
+ verify_ssl: !config[:insecure],
91
+ ssl_ca_file: config[:capath] }
92
+
93
+ JSON.parse(RestClient::Resource.new(url, options).get)
94
+ rescue Errno::ECONNREFUSED
95
+ critical 'Consul is not responding'
96
+ rescue RestClient::RequestTimeout
97
+ critical 'Consul connection timed out'
98
+ rescue RestClient::Exception => e
99
+ unknown "Consul returned: #{e}"
100
+ end
101
+ end
102
+ end
103
+ end
@@ -3,8 +3,8 @@
3
3
  module SensuPluginsConsul
4
4
  module Version
5
5
  MAJOR = 2
6
- MINOR = 0
7
- PATCH = 1
6
+ MINOR = 1
7
+ PATCH = 0
8
8
 
9
9
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-consul
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sensu Plugins and contributors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-27 00:00:00.000000000 Z
11
+ date: 2018-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sensu-plugin
@@ -189,8 +189,10 @@ executables:
189
189
  - check-consul-leader.rb
190
190
  - check-consul-maintenance.rb
191
191
  - check-consul-members.rb
192
+ - check-consul-quorum.rb
192
193
  - check-consul-servers.rb
193
194
  - check-consul-service-health.rb
195
+ - check-consul-stale-peers.rb
194
196
  - check-service-consul.rb
195
197
  extensions: []
196
198
  extra_rdoc_files: []
@@ -203,10 +205,13 @@ files:
203
205
  - bin/check-consul-leader.rb
204
206
  - bin/check-consul-maintenance.rb
205
207
  - bin/check-consul-members.rb
208
+ - bin/check-consul-quorum.rb
206
209
  - bin/check-consul-servers.rb
207
210
  - bin/check-consul-service-health.rb
211
+ - bin/check-consul-stale-peers.rb
208
212
  - bin/check-service-consul.rb
209
213
  - lib/sensu-plugins-consul.rb
214
+ - lib/sensu-plugins-consul/check/base.rb
210
215
  - lib/sensu-plugins-consul/version.rb
211
216
  homepage: https://github.com/sensu-plugins/sensu-plugins-consul
212
217
  licenses: