@@ -234,15 +234,20 @@ impl Command {
234234 target : & str ,
235235 version : & str ,
236236 community : & str ,
237- check_format : bool
237+ check_format : bool ,
238238 ) -> Vec < SnmpResult > {
239239 let mut collect: Vec < SnmpResult > = Vec :: new ( ) ;
240240
241241 if check_format {
242- // In check-format mode, don't make SNMP requests and initialize with dummy values
242+ // In check-format mode, don't make SNMP requests and initialize with dummy values.
243+ // Get queries return a single value; Walk queries return multiple values.
243244 for s in self . collect . snmp . iter ( ) {
244245 let mut items = HashMap :: new ( ) ;
245- items. insert ( s. name . clone ( ) , ExprResult :: Vector ( vec ! [ 0.0 , 0.0 ] ) ) ;
246+ let dummy = match s. query {
247+ QueryType :: Get => ExprResult :: Vector ( vec ! [ 0.0 ] ) ,
248+ QueryType :: Walk => ExprResult :: Vector ( vec ! [ 0.0 , 0.0 ] ) ,
249+ } ;
250+ items. insert ( s. name . clone ( ) , dummy) ;
246251 if let Some ( lab) = & s. labels {
247252 for label_val in lab. values ( ) {
248253 let key = format ! ( "{}.{}" , s. name, label_val) ;
@@ -302,7 +307,7 @@ impl Command {
302307 community : & str ,
303308 filter_in : & Vec < String > ,
304309 filter_out : & Vec < String > ,
305- check_format : bool
310+ check_format : bool ,
306311 ) -> Result < CmdResult > {
307312 let mut collect = self . execute_snmp_collect ( target, version, community, check_format) ;
308313
@@ -328,21 +333,25 @@ impl Command {
328333 let value = & metric. value ;
329334 let parser = Parser :: new ( & collect, check_format) ;
330335 let value = parser. eval ( value) . map_err ( |e| error:: Error :: InvalidJSON {
331- message : format ! ( "Metric \" {}\" , field \" value\" : {}" , metric. name, e)
336+ message : format ! ( "Metric \" {}\" , field \" value\" : {}" , metric. name, e) ,
332337 } ) ?;
333338 let min = if let Some ( min_expr) = metric. min_expr . as_ref ( ) {
334- parser. eval ( & min_expr) . map_err ( |e| error:: Error :: InvalidJSON {
335- message : format ! ( "Metric \" {}\" , field \" min_expr\" : {}" , metric. name, e)
336- } ) ?
339+ parser
340+ . eval ( & min_expr)
341+ . map_err ( |e| error:: Error :: InvalidJSON {
342+ message : format ! ( "Metric \" {}\" , field \" min_expr\" : {}" , metric. name, e) ,
343+ } ) ?
337344 } else if let Some ( min_value) = metric. min {
338345 ExprResult :: Number ( min_value)
339346 } else {
340347 ExprResult :: Empty
341348 } ;
342349 let max = if let Some ( max_expr) = metric. max_expr . as_ref ( ) {
343- parser. eval ( & max_expr) . map_err ( |e| error:: Error :: InvalidJSON {
344- message : format ! ( "Metric \" {}\" , field \" max_expr\" : {}" , metric. name, e)
345- } ) ?
350+ parser
351+ . eval ( & max_expr)
352+ . map_err ( |e| error:: Error :: InvalidJSON {
353+ message : format ! ( "Metric \" {}\" , field \" max_expr\" : {}" , metric. name, e) ,
354+ } ) ?
346355 } else if let Some ( max_value) = metric. max {
347356 ExprResult :: Number ( max_value)
348357 } else {
@@ -357,38 +366,44 @@ impl Command {
357366 match & value {
358367 ExprResult :: Vector ( v) => {
359368 let prefix_str = match & metric. prefix {
360- Some ( prefix) => parser. eval_str ( prefix) . map_err ( |e| error:: Error :: InvalidJSON {
361- message : format ! ( "Metric \" {}\" , field \" prefix\" : {}" , metric. name, e)
362- } ) ?,
369+ Some ( prefix) => {
370+ parser
371+ . eval_str ( prefix)
372+ . map_err ( |e| error:: Error :: InvalidJSON {
373+ message : format ! (
374+ "Metric \" {}\" , field \" prefix\" : {}" ,
375+ metric. name, e
376+ ) ,
377+ } ) ?
378+ }
363379 None => ExprResult :: Empty ,
364380 } ;
365381 for ( i, item) in v. iter ( ) . enumerate ( ) {
366- let name = match & prefix_str {
367- ExprResult :: StrVector ( v) => {
368- format ! ( "{:?}#{}" , v[ i] , metric. name)
369- }
370- ExprResult :: Str ( s) => {
371- format ! ( "{}#{}" , s, metric. name)
372- }
382+ // first, compose the instance name
383+ let instance_name = match & prefix_str {
384+ ExprResult :: StrVector ( v) => v[ i] . to_string ( ) ,
385+ ExprResult :: Str ( s) => s. to_string ( ) ,
373386 ExprResult :: Empty => {
374- let res = format ! ( "{}#{}" , idx, metric . name ) ;
387+ let res = idx. to_string ( ) ;
375388 idx += 1 ;
376389 res
377390 }
378391 _ => {
379392 panic ! ( "A label must be a string" ) ;
380393 }
381394 } ;
382- if !re_in . is_empty ( ) {
383- if !re_in . iter ( ) . any ( |re| re. is_match ( & name ) ) {
384- continue ;
385- }
395+ // then apply filters exclusion and inclusion filters
396+ if !re_out . is_empty ( ) && re_out . iter ( ) . any ( |re| re. is_match ( & instance_name ) )
397+ {
398+ continue ;
386399 }
387- if !re_out . is_empty ( ) {
388- if re_out . iter ( ) . any ( |re| re. is_match ( & name ) ) {
389- continue ;
390- }
400+ if ( !re_in . is_empty ( )
401+ && !re_in . iter ( ) . any ( |re| re. is_match ( & instance_name ) ) )
402+ {
403+ continue ;
391404 }
405+ // and now concatenate to form the full perfdata
406+ let name = format ! ( "'{}#{}'" , instance_name, metric. name) ;
392407 let current_status =
393408 compute_status ( item, & metric. warning , & metric. critical ) ?;
394409 status = worst ( status, current_status) ;
@@ -417,7 +432,7 @@ impl Command {
417432 ExprResult :: Number ( s) => {
418433 let name = match & metric. prefix {
419434 Some ( prefix) => {
420- format ! ( "{:? }#{}" , prefix, metric. name)
435+ format ! ( "{}#{}" , prefix, metric. name)
421436 }
422437 None => {
423438 let res = format ! ( "{}#{}" , idx, metric. name) ;
@@ -472,9 +487,14 @@ impl Command {
472487 let value = & metric. value ;
473488 let parser = Parser :: new ( & collect, check_format) ;
474489 let max = if let Some ( max_expr) = metric. max_expr . as_ref ( ) {
475- let res = parser. eval ( & max_expr) . map_err ( |e| error:: Error :: InvalidJSON {
476- message : format ! ( "Aggregation \" {}\" , field \" max_expr\" : {}" , metric. name, e)
477- } ) ?;
490+ let res = parser
491+ . eval ( & max_expr)
492+ . map_err ( |e| error:: Error :: InvalidJSON {
493+ message : format ! (
494+ "Aggregation \" {}\" , field \" max_expr\" : {}" ,
495+ metric. name, e
496+ ) ,
497+ } ) ?;
478498 Some ( match res {
479499 ExprResult :: Number ( v) => v,
480500 ExprResult :: Vector ( v) => {
@@ -489,9 +509,14 @@ impl Command {
489509 None
490510 } ;
491511 let min = if let Some ( min_expr) = metric. min_expr . as_ref ( ) {
492- let res = parser. eval ( & min_expr) . map_err ( |e| error:: Error :: InvalidJSON {
493- message : format ! ( "Aggregation \" {}\" , field \" min_expr\" : {}" , metric. name, e)
494- } ) ?;
512+ let res = parser
513+ . eval ( & min_expr)
514+ . map_err ( |e| error:: Error :: InvalidJSON {
515+ message : format ! (
516+ "Aggregation \" {}\" , field \" min_expr\" : {}" ,
517+ metric. name, e
518+ ) ,
519+ } ) ?;
495520 Some ( match res {
496521 ExprResult :: Number ( v) => v,
497522 ExprResult :: Vector ( v) => {
@@ -506,7 +531,7 @@ impl Command {
506531 None
507532 } ;
508533 let value = parser. eval ( value) . map_err ( |e| error:: Error :: InvalidJSON {
509- message : format ! ( "Aggregation \" {}\" , field \" value\" : {}" , metric. name, e)
534+ message : format ! ( "Aggregation \" {}\" , field \" value\" : {}" , metric. name, e) ,
510535 } ) ?;
511536 match & value {
512537 ExprResult :: Vector ( v) => {
0 commit comments