forked from sensu-plugins/sensu-plugins-zookeeper
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcheck-zookeeper-mode.rb
executable file
·83 lines (74 loc) · 2.09 KB
/
check-zookeeper-mode.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/env ruby
#
# check-zookeeper-mode
#
# DESCRIPTION:
# Check if Zookeeper node is in expected mode.
#
# 'mode' is ZooKeeper's mode which can be standalone or in a cluster.
# In cluster mode a Zookeeper node can be either leader or follower.
# We use stat command to get the mode and check if zookeeper node is a
# standalone or leader or follower.
#
# PLATFORMS:
# All
#
# DEPENDENCIES:
# gem: sensu-plugin
#
# USAGE:
# Check if a node has Zookeeper running and responds with imok.
# ./check-zookeeeper-mode.rb -m 'leader follower'
# ./check-zookeeeper-mode.rb -s localhost -p 2181 -m 'leader follower'
# ./check-zookeeeper-mode.rb --server localhost --port 2181 --mode 'leader follower'
#
require 'sensu-plugin/check/cli'
require 'socket'
class CheckZookeeperMode < Sensu::Plugin::Check::CLI
option :server,
description: 'Zookeeper hostname to connect to.',
short: '-s HOSTNAME',
long: '--server HOSTNAME',
default: 'localhost'
option :port,
description: 'Zookeeper port to connect to.',
short: '-p PORT',
long: '--port PORT',
default: 2181
option :timeout,
description: 'How long to wait for a reply in seconds.',
short: '-t SECS',
long: '--timeout SECS',
proc: proc(&:to_i),
default: 5
option :mode,
description: 'Space separated expected modes.',
short: '-m MODE',
long: '--mode MODE',
required: true
def zk_command(four_letter_word)
Socket.tcp(config[:server], config[:port]) do |sock|
sock.print "#{four_letter_word}\r\n"
sock.close_write
sock.read
end
end
def run
response = zk_command(:stat)
mode = get_mode(response)
expected_modes = config[:mode].split
if expected_modes.include?(mode)
ok(mode)
else
critical("Zookeeper mode is #{mode} and it does not match #{expected_modes.join(', ')}")
end
end
private
def get_mode(response)
response.each_line do |line|
line = line.chomp
k, v = line.split(': ')
return v if k == 'Mode'
end
end
end