16
16
@proxies = [ ]
17
17
@errors = [ ]
18
18
@perfdata = [ ]
19
- exit_code = OK
20
19
options = OpenStruct . new
21
20
options . proxies = [ ]
22
21
@@ -138,81 +137,57 @@ def haproxy_response(options)
138
137
end
139
138
end
140
139
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
+
141
148
haproxy_response ( options ) . each do |line |
149
+
142
150
if line =~ /^# /
143
- HAPROXY_COLUMN_NAMES = line [ 2 ..-1 ] . split ( ',' )
151
+ header = line [ 2 ..-1 ] . split ( ',' )
144
152
next
145
- elsif !defined? HAPROXY_COLUMN_NAMES
153
+ elsif !defined? header
146
154
puts "ERROR: CSV header is missing"
147
155
exit UNKNOWN
148
156
end
149
157
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 ] } ) }
151
159
152
160
next unless options . proxies . empty? || options . proxies . include? ( row [ 'pxname' ] )
153
161
next if [ 'statistics' , 'admin_stats' , 'stats' ] . include? row [ 'pxname' ]
162
+ next if row [ 'status' ] == 'no check'
154
163
155
164
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
200
170
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\t sess=%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
203
184
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
216
191
end
217
192
end
218
193
@@ -222,11 +197,11 @@ def haproxy_response(options)
222
197
223
198
if @proxies . length == 0
224
199
@errors << "No proxies listed as up or down"
225
- exit_code = UNKNOWN if exit_code == OK
200
+ exit_code UNKNOWN
226
201
end
227
202
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
230
205
231
206
exit exit_code
232
207
0 commit comments