Skip to content

Commit 67db1dd

Browse files
committed
refactory check_haproxy
1 parent a515a5f commit 67db1dd

File tree

1 file changed

+40
-65
lines changed

1 file changed

+40
-65
lines changed

check_haproxy.rb

+40-65
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
@proxies = []
1717
@errors = []
1818
@perfdata = []
19-
exit_code = OK
2019
options = OpenStruct.new
2120
options.proxies = []
2221

@@ -138,81 +137,57 @@ def haproxy_response(options)
138137
end
139138
end
140139

140+
def exit_code(code=0)
141+
@exit_code ||= OK
142+
@exit_code = code if code > @exit_code
143+
@exit_code
144+
end
145+
146+
header = nil
147+
141148
haproxy_response(options).each do |line|
149+
142150
if line =~ /^# /
143-
HAPROXY_COLUMN_NAMES = line[2..-1].split(',')
151+
header = line[2..-1].split(',')
144152
next
145-
elsif !defined? HAPROXY_COLUMN_NAMES
153+
elsif !defined? header
146154
puts "ERROR: CSV header is missing"
147155
exit UNKNOWN
148156
end
149157

150-
row = HAPROXY_COLUMN_NAMES.zip(CSV.parse(line)[0]).reduce({}) { |hash, val| hash.merge({val[0] => val[1]}) }
158+
row = header.zip(CSV.parse_line(line)).reduce({}) { |hash, val| hash.merge({val[0] => val[1]}) }
151159

152160
next unless options.proxies.empty? || options.proxies.include?(row['pxname'])
153161
next if ['statistics', 'admin_stats', 'stats'].include? row['pxname']
162+
next if row['status'] == 'no check'
154163

155164
role = row['act'].to_i > 0 ? 'active ' : (row['bck'].to_i > 0 ? 'backup ' : '')
156-
message = sprintf("%s: %s %s%s", row['pxname'], row['status'], role, row['svname'])
157-
perf_id = "#{row['pxname']}".downcase
158-
159-
if row['svname'] == 'FRONTEND'
160-
if row['slim'].to_i == 0
161-
session_percent_usage = 0
162-
else
163-
session_percent_usage = row['scur'].to_i * 100 / row['slim'].to_i
164-
end
165-
@perfdata << "#{perf_id}_sessions=#{session_percent_usage}%;#{options.warning ? options.warning : ""};#{options.critical ? options.critical : ""};;"
166-
@perfdata << "#{perf_id}_rate=#{row['rate']};;;;#{row['rate_max']}"
167-
if options.critical && session_percent_usage > options.critical.to_i
168-
@errors << sprintf("%s has way too many sessions (%s/%s) on %s proxy",
169-
row['svname'],
170-
row['scur'],
171-
row['slim'],
172-
row['pxname'])
173-
exit_code = CRITICAL
174-
elsif options.warning && session_percent_usage > options.warning.to_i
175-
@errors << sprintf("%s has too many sessions (%s/%s) on %s proxy",
176-
row['svname'],
177-
row['scur'],
178-
row['slim'],
179-
row['pxname'])
180-
exit_code = WARNING if exit_code == OK || exit_code == UNKNOWN
181-
end
182-
183-
if row['status'] != 'OPEN' && !row['status'].include?('UP')
184-
@errors << message
185-
exit_code = CRITICAL
186-
end
187-
188-
elsif row['svname'] == 'BACKEND'
189-
# It has no point to check sessions number for backends, against the alert limits,
190-
# as the SLIM number is actually coming from the "fullconn" parameter.
191-
# So we just collect perfdata. See the following url for more info:
192-
# http://comments.gmane.org/gmane.comp.web.haproxy/9715
193-
current_sessions = row['scur'].to_i
194-
@perfdata << "#{perf_id}_sessions=#{current_sessions};;;;"
195-
@perfdata << "#{perf_id}_rate=#{row['rate']};;;;#{row['rate_max']}"
196-
if row['status'] != 'OPEN' && !row['status'].include?('UP')
197-
@errors << message
198-
exit_code = CRITICAL
199-
end
165+
if row['slim'].to_i == 0
166+
session_percent_usage = 0
167+
else
168+
session_percent_usage = row['scur'].to_i * 100 / row['slim'].to_i
169+
end
200170

201-
elsif row['status'] != 'no check'
202-
@proxies << message
171+
proxy_name = sprintf("%s %s %s %s", row['pxname'], row['svname'], row['status'], role)
172+
message = sprintf("%s\tsess=%s/%s(%d%%) smax=%s",
173+
proxy_name,
174+
row['scur'],
175+
row['slim'] || '-1',
176+
session_percent_usage,
177+
row['smax'])
178+
@proxies << message
179+
180+
if row['status'].include?('DOWN')
181+
@errors << message
182+
exit_code CRITICAL
183+
end
203184

204-
if !row['status'].include?('UP')
205-
@errors << message
206-
exit_code = WARNING if exit_code == OK || exit_code == UNKNOWN
207-
else
208-
if row['slim'].to_i == 0
209-
session_percent_usage = 0
210-
else
211-
session_percent_usage = row['scur'].to_i * 100 / row['slim'].to_i
212-
end
213-
@perfdata << "#{perf_id}-#{row['svname']}_sessions=#{session_percent_usage}%;;;;"
214-
@perfdata << "#{perf_id}-#{row['svname']}_rate=#{row['rate']};;;;#{row['rate_max']}"
215-
end
185+
if options.critical && session_percent_usage >= options.critical.to_i
186+
@errors << sprintf("%s - too many sessions %s/%s(%d%%)", proxy_name, row['scur'], row['slim'], session_percent_usage)
187+
exit_code CRITICAL
188+
elsif options.warning && session_percent_usage >= options.warning.to_i
189+
@errors << sprintf("%s - too many sessions %s/%s(%d%%)", proxy_name, row['scur'], row['slim'], session_percent_usage)
190+
exit_code WARNING
216191
end
217192
end
218193

@@ -222,11 +197,11 @@ def haproxy_response(options)
222197

223198
if @proxies.length == 0
224199
@errors << "No proxies listed as up or down"
225-
exit_code = UNKNOWN if exit_code == OK
200+
exit_code UNKNOWN
226201
end
227202

228-
puts "HAPROXY " + status[exit_code] + ": " + @errors.join('; ') + "|" + @perfdata.join(" ")
229-
puts @proxies
203+
puts "HAPROXY " + status[exit_code] + ": " + @errors.join('; ')
204+
puts @proxies.sort
230205

231206
exit exit_code
232207

0 commit comments

Comments
 (0)