Revision: 1975
http://nagiosplug.svn.sourceforge.net/nagiosplug/?rev=1975&view=rev
Author: tonvoon
Date: 2008-04-02 16:05:27 -0700 (Wed, 02 Apr 2008)
Log Message:
-----------
Show which thresholds were breached if total number
of filtered processes = 1
Modified Paths:
--------------
nagiosplug/branches/new_threshold_syntax/plugins/check_procs.c
Modified: nagiosplug/branches/new_threshold_syntax/plugins/check_procs.c
===================================================================
--- nagiosplug/branches/new_threshold_syntax/plugins/check_procs.c 2008-04-02 09:19:26 UTC (rev 1974)
+++ nagiosplug/branches/new_threshold_syntax/plugins/check_procs.c 2008-04-02 23:05:27 UTC (rev 1975)
@@ -108,6 +108,7 @@
thresholds *vsz_threshold = NULL;
thresholds *rss_threshold = NULL;
thresholds *cpu_threshold = NULL;
+int new_style_thresholds = 0;
int warn = 0; /* number of processes in warn state */
int crit = 0; /* number of processes in crit state */
@@ -119,6 +120,9 @@
char *input_buffer;
char *input_line;
char *procprog;
+ char *last_critical = NULL;
+ char *last_warning = NULL;
+ char *last_failed_process = NULL;
pid_t mypid = 0;
int procuid = 0;
@@ -147,6 +151,8 @@
double vsz_max = 0;
double rss_max = 0;
double cpu_max = 0;
+ int multiple_process_output_flag = 0;
+ int number_threshold_failure_flag = 0;
setlocale (LC_ALL, "");
@@ -158,6 +164,7 @@
procprog = malloc (MAX_INPUT_BUFFER);
asprintf (&metric_name, "PROCS");
+ asprintf (&last_failed_process, "");
if (process_arguments (argc, argv) == ERROR)
usage4 (_("Could not parse arguments"));
@@ -171,7 +178,7 @@
}
alarm (timeout_interval);
- if (verbose >= 2)
+ if (verbose >= 3)
printf (_("CMD: %s\n"), PS_COMMAND);
if (input_filename == NULL) {
@@ -280,10 +287,18 @@
actions_on_failed_state( check_thresholds (procseconds), procprog );
}
+ asprintf( &last_critical, "" );
+ asprintf( &last_warning, "" );
/* Check against all new style thresholds */
if (vsz_threshold != NULL) {
if ((i = get_status( procvsz, vsz_threshold )) != STATE_OK ) {
actions_on_failed_state(i, procprog);
+ asprintf( &last_failed_process, "%s", procprog );
+ if (i == STATE_CRITICAL) {
+ asprintf( &last_critical, "vsz=%d", procvsz );
+ } else if (i == STATE_WARNING) {
+ asprintf( &last_warning, "vsz=%d", procvsz );
+ }
if (verbose >= 2) {
printf("VSZ state %d: proc=%s vsz=%d ", i, procprog, procvsz);
print_thresholds( vsz_threshold );
@@ -293,6 +308,12 @@
if (rss_threshold != NULL) {
if ((i = get_status( procrss, rss_threshold )) != STATE_OK ) {
actions_on_failed_state(i, procprog);
+ asprintf( &last_failed_process, "%s", procprog );
+ if (i == STATE_CRITICAL) {
+ asprintf( &last_critical, "%s%srss=%d", last_critical, (strcmp(last_critical,"") ? ", " : ""), procrss );
+ } else if (i == STATE_WARNING) {
+ asprintf( &last_warning, "%s%srss=%d", last_warning, (strcmp(last_warning,"") ? ", " : ""), procrss );
+ }
if (verbose >= 2) {
printf("RSS: proc=%s rss=%d ", procprog, procrss);
print_thresholds( rss_threshold );
@@ -302,6 +323,12 @@
if (cpu_threshold != NULL) {
if (( i = get_status( procpcpu, cpu_threshold )) != STATE_OK ) {
actions_on_failed_state(i, procprog);
+ asprintf( &last_failed_process, "%s", procprog );
+ if (i == STATE_CRITICAL) {
+ asprintf( &last_critical, "%s%scpu=%.2f%%", last_critical, (strcmp(last_critical,"") ? ", " : ""), procpcpu );
+ } else if (i == STATE_WARNING) {
+ asprintf( &last_warning, "%s%scpu=%.2f%%", last_warning, (strcmp(last_warning,"") ? ", " : ""), procpcpu );
+ }
if (verbose >= 2) {
printf("CPU: proc=%s cpu=%f ", procprog, procpcpu);
print_thresholds( cpu_threshold );
@@ -358,32 +385,55 @@
}
if (number_threshold != NULL) {
- i = get_status( procs, number_threshold );
- actions_on_failed_state(i, "NUMBER_OF_PROCESSES");
+ if (i = get_status( procs, number_threshold ) != STATE_OK) {
+ actions_on_failed_state(i, "NUMBER_OF_PROCESSES");
+ if (verbose >= 2) {
+ printf("NUMBER: total_procs=%d ", procs);
+ print_thresholds( number_threshold );
+ }
+ number_threshold_failure_flag = 1;
+ }
}
if ( result == STATE_OK ) {
printf ("%s %s: ", metric_name, _("OK"));
+ multiple_process_output_flag = 1;
} else if (result == STATE_WARNING) {
printf ("%s %s: ", metric_name, _("WARNING"));
- if ( metric != METRIC_PROCS ) {
- printf (_("Alerts: %d warn from "), warn);
+ if (procs == 1 && new_style_thresholds && ! number_threshold_failure_flag) {
+ printf("%s: warning %s", last_failed_process, last_warning);
+ } else {
+ if ( metric != METRIC_PROCS ) {
+ printf (_("Alerts: %d warn from "), warn);
+ }
+ multiple_process_output_flag = 1;
}
} else if (result == STATE_CRITICAL) {
printf ("%s %s: ", metric_name, _("CRITICAL"));
- if (metric != METRIC_PROCS) {
- printf (_("Alerts: %d crit, %d warn from "), crit, warn);
+ if (procs == 1 && new_style_thresholds && ! number_threshold_failure_flag) {
+ printf("%s: critical %s", last_failed_process, last_critical);
+ if (strcmp(last_warning, "")) {
+ printf("; warning %s", last_warning);
+ }
+ } else {
+ if (metric != METRIC_PROCS) {
+ printf (_("Alerts: %d crit, %d warn from "), crit, warn);
+ }
+ multiple_process_output_flag = 1;
}
}
- printf (ngettext ("%d process", "%d processes", (unsigned long) procs), procs);
+
+ if (multiple_process_output_flag) {
+ printf (ngettext ("%d process", "%d processes", (unsigned long) procs), procs);
- if (strcmp(fmt,"") != 0) {
- printf (_(" with %s"), fmt);
+ if (strcmp(fmt,"") != 0) {
+ printf (_(" with %s"), fmt);
+ }
+
+ if ( verbose >= 1 && strcmp(fails,"") )
+ printf (" [%s]", fails);
}
- if ( verbose >= 1 && strcmp(fails,"") )
- printf (" [%s]", fails);
-
printf(" | ");
if( number_threshold != NULL)
printf("number=%d ", procs);
@@ -622,16 +672,19 @@
break;
case CHAR_MAX+4:
rss_threshold = parse_thresholds_string(optarg);
+ new_style_thresholds++;
if (metric == DEFAULT)
default_metric=NONE;
break;
case CHAR_MAX+7:
vsz_threshold = parse_thresholds_string(optarg);
+ new_style_thresholds++;
if (metric == DEFAULT)
default_metric=NONE;
break;
case CHAR_MAX+10:
cpu_threshold = parse_thresholds_string(optarg);
+ new_style_thresholds++;
if (metric == DEFAULT)
default_metric=NONE;
break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.